代码注入-Solaris&;Linux

代码注入-Solaris&;Linux,linux,gcc,solaris,elf,Linux,Gcc,Solaris,Elf,我有一个由第三方创建的可执行模块。我想“注入”我的代码(类似于在单独线程中运行的看门狗)到这个进程中 到目前为止,有两种可能的方法-一种是以可执行文件的形式运行代码,并在其上动态加载进程(似乎非常困难和棘手),或者使代码成为共享对象,通过LD_PRELOAD加载代码,然后从某个静态变量构造函数初始化 有没有更方便的方法? 我的操作系统是Linux x86和Solaris SPARC 更新:如果可能的话,我不想修补这个过程,而是动态加载我的代码。听起来像是你在寻找的。有一个例子可以解释它是如何工作

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

到目前为止,有两种可能的方法-一种是以可执行文件的形式运行代码,并在其上动态加载进程(似乎非常困难和棘手),或者使代码成为共享对象,通过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,您是在什么特定的系统上启动它的?我还没能做到,因为有大量的新旧系统。