linux 库函数 劫持,Linux hook技术之-Ring3下动态链接库.so函数劫持

劫持普通函数当然没有什么意思了!我们要劫持的是系统函数!我们知道,Unix操作系统中对于GCC而言,默认情况下,所编译的程序中对标准C函数(fopen、printf、execv家族等等函数)的链接,都是通过动态链接方式来链接libc.so.6这个函数库的,我们只要在加载libc.so.6之前加载我们自己的so文件就可以劫持这些函数了。

二、Demo

我们从一个简单的c程序(sample.c)开始

下面的代码标准调用fopen函数,并检查返回值#include

int main(void) {

printf("Calling the fopen() function...\n");

FILE *fd = fopen("test.txt","r");

if (!fd) {

printf("fopen() returned NULL\n");

return 1;

}

printf("fopen() succeeded\n");

return 0;

}编译执行

$ gcc -o sample sample.c

$ ./sample

Calling the fopen() function...

fopen() returned NULL

$ touch test.txt

$ ./sample

Calling the fopen() function...

fopen() succeeded开始编写我们自己的so动态库

#include

FILE *fopen(const char *path, const char *mode) {

printf("This is my fopen!\n");

return NULL;

}编译成.so

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c设置环境变量后执行sample程序,我们可以看到成功劫持了fopen函数,并返回了NULL

$ LD_PRELOAD=./myfopen.so ./sample

Calling the fopen() function...

This is my fopen!

fopen() returned NULL当然 ,使fopen始终返回null是不明智的,我们应该在假的fopen函数中还原真正fopen的行为,看下面代码 这回轮到 dlfcn.h 出场,来对动态库进行显式调用,使用dlsym函数从c标准库中调用原始的fopen函数,并保存原始函数的地址以便最后返回 恢复现场

#define _GNU_SOURCE

#include

#include

FILE *fopen(const char *path, const char *mode) {

printf("In our own fopen, opening %s\n", path);

FILE *(*original_fopen)(const char*, const char*);

original_fopen = dlsym(RTLD_NEXT, "fopen");

return (*original_fopen)(path, mode);

}Tips: 如果dlsym或dlvsym函数的第一个参数的值被设置为RTLD_NEXT,那么该函数返回下一个共享对象中名为NAME的符号(函数)的运行时地址。 下一个共享对象是哪个,依赖于共享库被加载的顺序。dlsym查找共享库顺序如下: ①环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录。 ②文件/etc/ld.so.cache中找到的库的列表,由ldconfig命令刷新。 ③目录usr/lib。 ④目录/lib。 ⑤当前目录。   编译:

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c -ldl执行:调用原始函数,劫持成功!

$ LD_PRELOAD=./myfopen.so ./sample

Calling the fopen() function...

In our own fopen, opening test.txt

fopen() succeeded

三、需要注意的问题以及LD_PRELOAD hook的应用

需要注意的问题

1.so文件加载及函数劫持的顺序。

在很多情况下,在你进行劫持之前,系统中已经有其他组件也对该函数进行了劫持,那么就要特别注意so加载的顺序,一定要在其他组件的so库加载前加载自己的so库,否则你的hook函数将会被忽略。

2.保持原本函数的完备性与业务的兼容性。被hook的函数一定要hook结束时进行返回,返回前自己的执行逻辑中不能过度延时,过度延时可能造成原有的业务逻辑失败。使用RTLD_NEXT 句柄,维持原有的共享库调用链。

应用一:HIDS入侵检测系统

劫持libc库

优点: 性能较好, 比较稳定, 相对于LKM更加简单, 适配性也很高, 通常对抗web层面的入侵.

缺点: 对于静态编译的程序束手无策, 存在一定被绕过的风险.

应用二:rootkit恶意软件

已经有多种恶意软件应用了此技术,常见的有cub3、vlany、bdvl等

之后的几篇文章我将会通过分析以上几款恶意软件来揭秘.so共享库劫持技术的具体应用,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能

本周,Nodejs v14.3.0 发布。这个版本包括添加顶级 Await、REPL 增强等功能。REPL 增强通过自动补全改进对 REPL 的预览支持,例如,下图中当输入 process.ver 之后,不需要输入剩下的实际内容,它帮我们生成了自动补全的输…

在linux安装requests库命令,在Linux--Ubuntu18.04环境下安装requests库

之前在服务器上装过requests库,但是记忆中花了好大的力气才成功,现在因为一次意外,服务器重装系统,现在这些乱七八糟的库又要重装一遍,与上次不同的是,这次我装一遍就成功了。现在分享一下成功的经历。Pyth…

linux输入ls后不显示_零基础学习之Linux基础命令小结

安装完重启后,没有像sery所说在图形界面崩溃了,由于我没有安装X-WINDOWS而是直接进入了文本界面。如果你想做linux管理的话,最好在文本界面下工作,这样会适应如下图:第一行显示的是我们所安装的linux是Red Hat 企业4第二行显示的是…

redhat enterprise linux 哪个版本好,Red Hat Enterprise Linux 版本显示中(Santiago)是啥意思?...

楼主的逻辑还有问题。1、linux跟windows都是一种操作系统,但是它用的分区格式是ext3的,ntfs和fat都不合适。安装过程中你可以自己选择删除现有分区创建新分区,但如果你不了解,很可能把所有的分区都清了。2、redhat分区多大合适看你…

.gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名

前言.idea该不该提交到代码仓库中呢?你的意见呢?今日早读文章由《Flask Web开发》作者李辉分享。正文从这开始~~在网络上,我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志…

监控linux时间不对,shell 计算故障时间 配合web监控

#!/bin/bash#checkfail.log 为SHELL监控网站时间存放的日志文件 https://blog.51cto.com/junhai/2437965fail_time(){starttimetail -n 1000 checkfail.log |grep "$url"|grep "第1次"|tail -n 3|head -n 1|awk {print $1, $2} #取网站挂掉的时间endtimet…

linux redis清空数据恢复,Redis数据恢复--误删数据后一次吓尿的经历

1、起因,一个flushdb命令因为误操作,输入了一个flushdb命令,导到redis里0号库里的数据全部清空,OMG,这里有不少重要信息,如果被领导知道,必开除2、appendonly留有生机仔细想想,当时数…

c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享

经济学家说过,路边是不会有100元的;但如果有,你还是要捡起来。同理,在貌似万物免费的网络时代,你是很难找到有针对性的好资料;但是如果有,希望你能认真学习吸收。比如笔者今天写的这一篇一今天这…

linux在bin下加入ssh,移植 ssh 到开发板

2》编译/home/arm下新建目录sshwork,并且将源码复制到该目录下mkdir /home/arm/sshworkcp zlib-1.2.3.tar.gz openssl-0.9.8d.tar.gz openssh-4.6p1.tar.gz/home/arm/sshwork/home/arm/sshwork下新建目录lib,用来保存生成的库文件。mkdir /home/arm/sshw…

java pdf增删改查_如何利用Java代码操作索引库?

今天是刘小爱自学Java的第161天。感谢你的观看,谢谢你。学习计划安排如下:学了几天的Elasticserch,但都是它本身的知识点,如何通过Java语言去操作它呢?这就好比以前学数据库,在数据库工具中通过sql语句也能…

linux shell 第几行,Linux shell 获得字符串所在行数及位置

shell 获得字符串所在行数及位置01 获取字符串所在的行数方式一:用grep -n[rootroot]# cat testapplebitcreatedelectexeflowgood[rootroot]# cat test | grep -n exe5:exe[rootroot]# cat test | grep -n exe | awk -F ":" {print $1}5方式二&#xff1a…

sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应

最后更新时间:2017-09-14 现象: 在Sublime中打开.py文件,按”ctrlb”执行时无反应。点击工具->编译系统中已经有且识别到Python,但执行”run(ctrlshiftb)”时无反应,Sublime左下角提示”No B…

linux 火锅平台,“定制版火锅”来袭,持续创新才能永葆活力

原标题:“定制版火锅”来袭,持续创新才能永葆活力5月1日,重庆涪陵红酒小镇的一家转转火锅店,推出“五一”定制版火锅免费请游客品尝。广西的螺蛳粉、贵州的折耳根、湖南臭豆腐、福建乌龙茶、重庆榨菜、河南胡辣汤、陕西老陈醋、海…

internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...

GitHub链接:calmisential/YOLOv3_TensorFlow2​github.com我主要参考了yolov3的一个keras实现版本:qqwweee/keras-yolo3​github.com目前支持在PASCAL VOC 2012数据集上训练和自定义数据集上训练,具体的训练过程可参考项目仓库中的README文档…

c语言用链表对学生成绩排序,学生成绩排序和平均分计算利用c语言链表的创建插入删除.doc...

#define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;};int n;struct student *creat(void)//创建链表{struct student *head;struct student *p1,*p2;n0;p1p2(struct student*)malloc(LEN);scanf("%ld,%f",…

深井软岩巷道群支护技术与应用_深井软岩巷道深浅孔帷幕注浆技术

一、成果内容1.基本原理对失修巷道进行刷扩、支护,满足使用断面后进行帮顶喷浆、底板整平,先底板注浆,然后帮、顶注浆。锚架充支护巷道直接底板整平后,先底板后帮、顶注浆。通过全断面深浅孔联合注水泥浆进行巷道加固,…

店铺咨询系统c语言,课内资源

1 题目介绍1.1 问题描述出于不同目的的旅客对交通工具和交通路径有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个交通咨询系统程序,为旅客提供最优决策的交通咨询。1.2 需求分析提供对…

f分布表完整图_【教育统计答疑】如何理解正态分布、均值分布、^2分布、t分布和F分布...

许多教育统计的初学者都表示这几个分布感到学起来非常吃力,结合最近上课的体会以及答疑的情况,觉得很有必要在这里简单地对这部分内容进行澄清和梳理,以助理解。首先,“为什么要学习这几个分布”可能是许多人纠结的问题&#xff0…

c语言第一章考试题及答案,C语言考试题库及答案整理版.doc

C语言考试题库及答案整理版.docC语言理论上机考试选择题部分(共200题)1、下面程序的输出是___D______#includevoid main(){ int k11;printf("k%d,k%o,k%x\n",k,k,k);}A) k11,k12,k11 B) k11,k13,k13C) k11,k013,k0xb D) k11,k13,kb2、在下列选项中,不正确的赋值语句是…

python每天定时9点执行_python每天定时运行某程序代码

思路:利用time函数返回的时间字符串与指定时间字符串做比较,相等的时候执行对应的操作。不知道大家的思路是什么,感觉这样比较耗CPU。。。。 此处设置为15:30:10 输出相应内容,需要执行什么,就修改什么。 import time …