iqiyi / xHook

🔥 A PLT hook library for Android native ELF.
Other
4.08k stars 760 forks source link

好像无法hook exec 族的函数 #33

Closed cxxsheng closed 5 years ago

cxxsheng commented 5 years ago
int (*old_execve)(const char *path, char *const argv[], char *const envp[]);
int new_execve(const char *path, char *const argv[], char *const envp[]){
    LOGD("hook sucessful");
    return 99;
}
int so_init(){
    LOGD("start so_init");
    xhook_enable_debug(1);
    xhook_register("/system/lib/libc.so", "execve", (void *)new_execve, (void**)&old_execve);
    xhook_refresh(0);
    LOGD("finshed so_init");
    return 0;
}

01-13 01:01:32.946 25904-25904/com.winer.proxyapp I/xhook: libxhook 1.1.10 (arm) 01-13 01:01:32.952 25904-25904/com.winer.proxyapp I/xhook: init OK: /system/lib/libc.so (REL ELF_HASH PLT:5096 DYN:10872 ANDROID:0) hooking execve in /system/lib/libc.so found execve at symidx: 932 (ELF_HASH) found execve at .rel.plt offset: 0x69db8 01-13 01:01:32.956 25904-25904/com.winer.proxyapp I/xhook: XH_HK_OK 0xb6e86db8: 0xb6e5708c -> 0xb3598a75 execve /system/lib/libc.so

日志上是成功的 不知道是不是fork影响的?

caikelun commented 5 years ago

你需要hook的是自己so库中对execve的调用吧? 这样?

xhook_register(".*/libmy.so$", "execve", (void *)new_execve, (void**)&old_execve);
cxxsheng commented 5 years ago

你需要hook的是自己so库中对execve的调用吧? 这样?

xhook_register(".*/libmy.so$", "execve", (void *)new_execve, (void**)&old_execve);

不是 我是需要hook libc中的execve的调用,发现貌似无法hook成果,没法拦截,我使用了 inline hook就成功了

caikelun commented 5 years ago

你的情况xhook确实hook不到的。因为execve的实现就在libc.so中,所以它内部调用execve肯定被编译优化了,不走PLT/GOT了。

cxxsheng commented 5 years ago

你的情况xhook确实hook不到的。因为execve的实现就在libc.so中,所以它内部调用execve肯定被编译优化了,不走PLT/GOT了。

但是我能够成功hook mmap或者open等等一些libc的函数,单单exec族的hook不到,这些函数是不是有什么特殊之处导致的呢?比如exec族函数会重新fork出进程来执行。

caikelun commented 5 years ago

我觉得你可以先readelf确认下exec是否被加入到了so的PLT中,再反汇编看下对exec的调用是否走了PLT。

另外,你是怎么判断没有hook到exec的?可以在比如my_exec中先创建一个固定名称的空文件,再调用原exec文件,如果文件被创建了,那就说明hook到了。printf不一定靠谱。