4

サードパーティによって作成された実行可能モジュールがあります。このプロセスに自分のコード (別のスレッドで実行されている一種のウォッチドッグ) を「挿入」したいと考えています。

これまでのところ、2 つの方法が考えられます。1 つは、コードを実行可能ファイルとして実行し、その上にプロセスを動的にロードすることです (非常に難しくてトリッキーなようです)。または、コードを共有オブジェクトにして、LD_PRELOAD を介してロードし、から初期化します。いくつかの静的変数コンストラクター。

これを行うためのより便利な方法はありますか? 私の OS は Linux x86 と Solaris-SPARC です。

更新: 可能であれば、プロセスにパッチを適用するのではなく、コードを動的にロードしたいと考えています。

4

4 に答える 4

4

InjectSoを探しているようです。それがどのように機能するかを説明するパワーポイントのプレゼンテーションがあります。私はまだそれを試してみることに慣れていません。

于 2008-12-18T15:35:33.247 に答える
2

ホットパッチがこれを行います。これは、injectso よりも優れています。

于 2011-10-09T17:56:20.147 に答える
0

ロブケネディはInjectSoについてあなたに話しました-それはおそらくあなたが必要とするものです。

スレッド化されていないプロセスにスレッドを導入すると、同期の問題が発生することに注意してください。アプリケーションがすでにスレッド化されている場合、問題はそれほど深刻ではありませんが、それでも、アプリケーションは、認識していないスレッドに反対する可能性があります。

于 2008-12-18T15:45:20.667 に答える
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の関数をオーバーライドできます-そのモジュールが使用しているものを見つけるだけです。printfsnprintf

「your code here」では、任意のスレッド、ウォッチドッグなどを開始できます。

于 2011-10-09T20:46:35.243 に答える