Linux hook技术之-Ring3下动态链接库.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 NULLn");         return 1;     }     printf("fopen() succeededn");     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 %sn", 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共享库劫持技术的具体应用,敬请期待!
© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论