2008-12-18 53 views
4

我有一個由第三方創建的可執行模塊。我想將我的代碼(在單獨線程中運行的看門狗)「注入」到這個過程中。代碼注入 - Solaris和Linux

到目前爲止,有兩種可能的方式 - 一種是將我的代碼作爲可執行文件運行並動態地將代碼加載到它上面(似乎非常困難和棘手),或者使我的代碼成爲共享對象,通過LD_PRELOAD並從一些靜態變量構造函數初始化。

有沒有更方便的方法來做到這一點? 我的操作系統是Linux x86和Solaris-SPARC。

更新:如果可能,我不想修補這個過程,但加載我的代碼動態。

回答

4

聽起來就像你正在尋找InjectSo。有一個Powerpoint presentation解釋它是如何工作的。我還沒有到處去嘗試它。

+0

是的,他們的測試工作對我來說。謝謝 ! – 2008-12-18 16:25:50

0

羅布肯尼迪告訴你有關InjectSo - 這可能是你需要的。

請注意,將線程引入非線程進程將充滿同步問題。如果應用程序已經線程化,那麼問題就不那麼嚴重了,但即使如此,應用程序也可能會反對它不知道的線程。

2

Hotpatch應該爲你做這個。它比injectso更有能力。

0

我沒有使用過提到的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 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

運行應該說hocus pocus。您可以覆蓋任意libc函數,如printf,snprintf - 只需找到該模塊使用的是什麼。

在「您的代碼在這裏」你可以開始任意線程,監督者等