Внедрение кода - Solaris & Linux - PullRequest
4 голосов
/ 18 декабря 2008

У меня есть исполняемый модуль, созданный третьей стороной. Я хотел бы «внедрить» мой код (вид сторожевого таймера в отдельный поток) в этот процесс.

Пока есть два возможных способа - один - запустить мой код как исполняемый и динамически загрузить поверх него процесс (кажется, очень сложным и сложным) или сделать мой код общим объектом, загрузить его через LD_PRELOAD и инициализировать из некоторого конструктора статических переменных.

Есть ли более удобные способы сделать это? Моя ОС - Linux x86 и Solaris-SPARC.

Обновление: если возможно, я бы не хотел исправлять процесс, а загружал мой код динамически.

Ответы [ 4 ]

4 голосов
/ 18 декабря 2008

Звучит так, как будто вы ищете InjectSo . Есть презентация Powerpoint , которая объясняет, как это работает. Я еще не успел его опробовать.

2 голосов
/ 09 октября 2011

Hotpatch должен сделать это за вас. Это более способный, чем injectso.

0 голосов
/ 10 октября 2011

Я не использовал упомянутый 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 - просто найдите, что использует этот модуль.

В «вашем коде здесь» вы можете запускать произвольные потоки, сторожевые таймеры и т. Д.

0 голосов
/ 18 декабря 2008

Роб Кеннеди рассказал вам об InjectSo - это, вероятно, то, что вам нужно.

Помните, что введение потока в непоточный процесс может быть сопряжено с проблемами синхронизации. Проблемы менее серьезны, если приложение уже является многопоточным, но даже в этом случае приложение может возражать против потока, о котором оно не знает.

...