代码注入-Solaris&;Linux
我有一个由第三方创建的可执行模块。我想“注入”我的代码(类似于在单独线程中运行的看门狗)到这个进程中 到目前为止,有两种可能的方法-一种是以可执行文件的形式运行代码,并在其上动态加载进程(似乎非常困难和棘手),或者使代码成为共享对象,通过LD_PRELOAD加载代码,然后从某个静态变量构造函数初始化 有没有更方便的方法? 我的操作系统是Linux x86和Solaris SPARC代码注入-Solaris&;Linux,linux,gcc,solaris,elf,Linux,Gcc,Solaris,Elf,我有一个由第三方创建的可执行模块。我想“注入”我的代码(类似于在单独线程中运行的看门狗)到这个进程中 到目前为止,有两种可能的方法-一种是以可执行文件的形式运行代码,并在其上动态加载进程(似乎非常困难和棘手),或者使代码成为共享对象,通过LD_PRELOAD加载代码,然后从某个静态变量构造函数初始化 有没有更方便的方法? 我的操作系统是Linux x86和Solaris SPARC 更新:如果可能的话,我不想修补这个过程,而是动态加载我的代码。听起来像是你在寻找的。有一个例子可以解释它是如何工作
更新:如果可能的话,我不想修补这个过程,而是动态加载我的代码。听起来像是你在寻找的。有一个例子可以解释它是如何工作的。我还没来得及试一试。罗伯·肯尼迪告诉过你注射的事,所以-那可能是你需要的
请注意,将线程引入非线程进程将充满同步问题。如果应用程序已经线程化,问题就不那么严重了,但即使如此,应用程序可能会对它不知道的线程提出异议。应该为您这样做。它比injectso更有能力。我没有使用提到的injectso,但这是一个值得注意的信息。 如果您正在寻找替代方案,这里有一种注入代码的简单方法:
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
int main()
{
struct passwd* pswd = getpwuid(1000);
if(pswd)
printf("%s\n", pswd->pw_name);
return 0;
}
gcc inject.c-shared-o libinject.so
使用LD\u LIBRARY\u PATH=运行。LD_PRELOAD=libinject.so./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;
}
应该说hocuspocus
。您可以覆盖任意的libc
函数,如printf
,snprintf
——只需找到该模块使用的是什么
在“您的代码在这里”中,您可以启动任意线程、看门狗等。Dmitry,您是在什么特定的系统上启动它的?我还没能做到,因为有大量的新旧系统。