微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

代码注入 – Solaris和Linux

我有一个由第三方创build的可执行模块。 我想“注入”我的代码(在单独的线程中运行的看门狗)到这个过程中。

到目前为止,有两种可能的方式 – 一种是将我的代码作为可执行文件运行,并在其上dynamic加载代码(似乎非常困难和棘手),或者使代码成为共享对象,通过LD_PRELOAD加载并初始化一些静态variables构造函数

有没有更方便的方法来做到这一点? 我的操作系统是Linux x86和Solaris-SPARC。

更新:如果可能,我不想修补这个过程,但是dynamic加载我的代码

在Elf Binary中读取GOT条目

用于修改ELF二进制文件的dynamic部分的工具

创buildELF二进制文件,而不使用libelf或其他库

在共享库中重定位条目

vmlinux ELF为给定结构的成员find偏移量

目标文件的objdump输出中的标志

挂载和replace导出函数在加载的ELF(.so共享库)

如何find一个精灵文件的部分头string表的偏移量?

如何将elf中的地址转换为物理地址

如何在Linux中将PE(Portable Executable)格式转换为ELF格式

听起来你正在寻找InjectSo 。 有一个Powerpoint演示文稿解释了它是如何工作的。 我还没有尝试过。

Hotpatch应该为你做这个。 它比injectso更有能力。

罗布·肯尼迪(Rob Kennedy)向你介绍了InjectSo – 这可能就是你需要的。

请注意,将线程引入非线程进程将充满同步问题。 如果应用程序已经被线程化了,那么问题就不那么严重了,但即使如此,应用程序也可能会反对一个它不知道的线程。

我没有使用提到的InjectSo,但它是一个值得注意的信息。 如果你正在寻找替代品,这是一个简单的方法来注入你的代码

#include <stdio.h> #include <sys/types.h> #include <pwd.h> int main() { struct passwd* pswd = getpwuid(1000); if(pswd) printf("%sn",pswd->pw_name); return 0; }

gcc test.c -o test

#define _GNU_SOURCE #include <dlfcn.h> #include <sys/types.h> #include <pwd.h> #include <stdlib.h> #include <stdio.h> static char* hocus = "hocus pocus"; struct passwd *getpwuid(uid_t uid) { static struct passwd *(*orig_getpwuid)(uid_t uid); if(!orig_getpwuid) { orig_getpwuid = (struct passwd* (*)(uid_t))dlsym(RTLD_NEXT,"getpwuid"); } struct passwd* original_passwd = (*orig_getpwuid)(uid); if(original_passwd) { original_passwd->pw_name = hocus; } // your code here return original_passwd; }

gcc inject.c -shared -o libinject.so

使用LD_LIBRARY_PATH=. LD_PRELOAD=libinject.so ./test运行LD_LIBRARY_PATH=. LD_PRELOAD=libinject.so ./test LD_LIBRARY_PATH=. LD_PRELOAD=libinject.so ./test

应该说hocus pocus 。 你可以重写任意的libc函数,比如printf , snprintf – 只要找到那个模块使用的是什么。

在“你的代码在这里”你可以启动任意线程,看门狗等

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐