Linux-linux下实现代码注入

Linux-linux下实现代码注入

泛泛之交 发布于 2017-11-05 字数 123 浏览 1318 回复 1

windows平台下可以比较容易的实现DLL注入和API拦截,linux下如何实现相似的功能?注入到别的so或者写一个so注入到某个工程。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-11-05 1 楼

linux下可以用共享库注入(injectso)来实现类似windows下的代码注入,其工作步骤如下:
1. 关联到目标进程;
简单的调用ptrace(PTRACE_ATTACH,...)即可以关联到目标进程,但此后我们还需调用waitpid()函数等待目标进程暂停,以便我们进行后续操作。详见中给出的ptrace_attach()函数。
2. 发现装载共享库的函数;一般是_dl_open调用,我们将使用它装载我们的.so共享库
通过遍历动态连接器使用的link_map结构及其指向的相关链表,我们可以完成_dl_open的符号解析工作;
3. 装载指定的.so;
由于在2中我们已经找到_dl_open的地址,所以我们只需将此函数使用的参数添入相应的寄存器,并将进程的eip指向_dl_open即可,在此过程中还需做一些其它操作,具体内容见中的call_dl_open和ptrace_call函数。
4. 做我们想做的,一般是通过函数重定向来完成我们需要的功能;
我们需要做的仅仅是找到相关的函数地址,用新函数替换旧函数,并将旧函数的地址保存。其中涉及到了PLT和RELOCATION,关于它们的详细内容你应该看ELF规范中的介绍,在中的函数中有PLT和RELOCATION的相关操作,而且在最后的例子中,我们将实现函数重定向。关于函数重定向,相关资料很多,这里不再多介绍。
5. 脱离进程;
简单的调用ptrace(PTRACE_DETACH,...)可以脱离目标进程。