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