上記の 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
「your code here」では、任意のスレッド、ウォッチドッグなどを開始できます。