Linux Hook技术实践
来源:互联网 发布:《怪物》 韩国 知乎 编辑:程序博客网 时间:2024/06/07 01:20
LInux Hook技术实践
什么是hook
简单的说就是别人本来是执行libA.so里面的函数的,结果现在被偷偷换成了执行你的libB.so里面的代码,是一种替换。
为什么hook
- 恶意代码注入
- 调用常用库函数时打log
- 改变常用库函数的行为,个性化
怎么hook
这个东西在win里面有现成的api,但是在linux里面却要主动修改ELF文件,或者修改动态库链接路径。我看网上写的好多挺麻烦的,而且还要调用各种修改ELF的API。。。。所以这里提供一种简单的方法来hook
下面直接demo吧
/*myselect.c*/#define _GNU_SOURCE#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/select.h>#include <sys/time.h>typedef int (*selectType)(int __nfds, fd_set *__restrict __readfds, fd_set *__restrict __writefds, fd_set *__restrict __exceptfds, struct timeval *__restrict __timeout);int select(int maxfdp1,fd_set* readset,fd_set* writeset,fd_set* exceptset, struct timeval*timeout){ printf("in modified select\n"); selectType ori_select = (selectType)dlsym(RTLD_NEXT,"select"); return ori_select(maxfdp1,readset,writeset,exceptset,timeout);}
这个代码的逻辑很简单,就是重写一个select,然后打包成库,让程序运行时优先加载这个库,这样程序运行时先在这个库中找到select函数后,就不会再加载原始的select函数。但是多数时候我们并不是要完全改变 原函数的行为 或许只是做一些小的修改,或许只是打一些log。这样我们若能在新函数里面执行以前的旧函数就好了,所以我们拿到原函数的入口地址,并在新函数中调用旧函数。这里可以用dlsym(RTLD_NEXT, functionName ).它返回functionName指示的原始库函数的指针。但是要想RTLD_NEXT这个宏有效,还必须在文件的开头加 #define _GNU_SOURCE。这样我们的代码就完成了
生成库
gcc myselect.c -fPIC -shared -o libmyselect.so
假设程序A调用过select这个函数,以前的启动参数是./A,,这个样子的话,系统会去找原始的链接库。若是变成这样启动LD_PRELOAD = ./libmyselect.so ./A
那A运行时就是调用我们写的select函数。。
对,你可以把一些常用的系统调用改成恶意代码,比如write这样的系统调用,然后注入到别人的程序中,然后别人的程序就被你倾入了,当然前提是你修改了别人的程序的链接路径。。
还有一些比较少用的用法,在某些情况下,一些特定线程的系统调用不应占过多的资源,我们可以通过这个方法让之变得高效,这个说法可能比较古怪。举个例子:
某些系统上select的实现可能与众不同,在没有fd就绪时,并不阻塞,而是忙等,这时便可以通过hook技术,在select中插入usleep,达到释放cpu的作用。当然这种用法是很少的,但也确实是骚操作。。。。
- Linux Hook技术实践
- Android Hook技术实践
- Android Hook技术实践
- Android Hook View技术实践
- linux hook 技术
- 高级Linux kernel inline hook技术
- linux arm和x86 inline hook技术
- Hook技术
- Hook技术
- HOOK技术
- hook技术
- Hook 技术
- Linux后门技术及实践
- Linux后门技术及实践
- 高级Linux Kernel Inline Hook技术分析与实现
- 高级Linux Kernel Inline Hook技术分析与实现
- HOOK Linux
- linux hook
- 互联网保险创新之二--需求与渠道创新
- nefu84 五指山(扩展欧几里得)
- list的两种循环
- LeetCode-118-Pascal's Triangle(帕斯卡的三角形)
- 实现LVS-NAT
- Linux Hook技术实践
- 快速排序详解
- hdu5213 Lucky 莫队算法+容斥
- 2017.08.19 自动关机脚本.vbs
- Generous Kefa CodeForces
- 记忆化搜索
- matlab中图像处理的基本函数(2)
- 485串口通讯保存流量计的数据到Excel
- 流行编程语言的详细对比(1)--Hello World和注释