Closed fh2002 closed 2 years ago
是的,不太好处理。可以考虑用 inlinehook 试试:https://github.com/bytedance/android-inline-hook
已现实了。通过inlinehook call_constructors入手的,再对bhook改了一点点。
void (*old_call_constructors)(void* self); void new_call_constructors(void* self) { bytehook_refresh(); old_call_constructors(self); }
char* function_name = NULL; void* call_constructors = bytehook_find_symbol_by_linker("soinfo.*call_constructors", &function_name); if(call_constructors != NULL){ DobbyHook((void*)call_constructors, (void*)new_call_constructors, (void**)&old_call_constructors); }
void bh_core_refresh(){ bh_dl_monitor_dlclose_rdlock(); bh_elf_manager_refresh(bh_core.elf_mgr, false, bh_task_manager_post_new_elf, bh_core.task_mgr); bh_dl_monitor_dlclose_unlock(); }
bhook比xhook好用,如果bhook能提供一个对外的refresh接口就更好了,使用者可以自己决定hook时机。
@caikelun 感谢回复!这两天我尝试了一下,但没有找到比较好的方案。 原因是linker内部的dl_iterate_phdr和dlopen是有互斥锁的,而.init和.init_array调用是在dlopen内部,所以直到dlopen结束前是无法读取到elf的 😭
是否可以从导出符号dlZN6soinfo17call_constructorsEv入手