bytedance / android-inline-hook

:fire: ShadowHook is an Android inline hook library which supports thumb, arm32 and arm64.
https://github.com/bytedance/android-inline-hook/tree/main/doc
MIT License
1.68k stars 291 forks source link

shadowhook_dlopen get null, and dlopen works well #74

Open zhongqingsong opened 1 month ago

zhongqingsong commented 1 month ago

ShadowHook Version

1.0.10

Android OS Version

10.0

Android ABIs

arm64-v8a

Device Manufacturers and Models

OPPO PACM00

Describe the Bug

我在自己的so启动时,我需要拉起外界的so。这个so没有被调用,所以我要在cpp中拉起so文件。

1、当时我使用系统的接口dlopen: void *handle = dlopen("libBK.so", RTLD_NOW); 句柄正常被获取到了,接下来的行为都正常。

2、但是我希望统一代码接口,我就换为了 shadowhook_dlopen,代码如下: void *handle = shadowhook_dlopen("libBK.so");

这个时候,这个handle就一直为空。导致我后续的操作全都失败了。 这个我实验过很多次了,我感觉就是如果这个so没有被加载到内存中。shadowhook_dlopen就会失败。

3、当我先dlopen,再shadowhook_dlopen,就正常了。但是这个open的意义就不存在了。

caikelun commented 1 month ago

shadowhook_dlopen 是用来“找到”已经加载到内存中的ELF,以便继续使用 shadowhook_dlsym 批量查找函数符号的地址,然后再用 shadowhook_hook_sym_addrshadowhook_hook_func_addr 执行 hook 操作。如果需要连续 hook 同一个 ELF 的多个函数,这样做比连续多次调用 shadowhook_hook_sym_name 执行效率更高一些。当然,用 shadowhook_dlsym 查找到的符号也可以直接调用,或者做其他的事情。

如果你只是要“把apk中的so库加载到内存中”,直接使用 dlopen 就可以了,这就是 android 标准的方法,而且工作的很好,shadowhook 没有必要去再次实现或者封装 dlopen 的功能。

shadowhook_dlopenshadowhook_dlsym 的实现来自于再封装 xDL(https://github.com/hexhacking/xDL )。xDL 有更多的功能,你可以继续研究一下。另外,xdl_open 也不提供“把apk中的so库加载到内存中”的功能,因为没有必要。xdl_open 的目的是实现 dlopen 做不到的事情。