Open zhongqingsong opened 1 month ago
shadowhook_dlopen
是用来“找到”已经加载到内存中的ELF,以便继续使用 shadowhook_dlsym
批量查找函数符号的地址,然后再用 shadowhook_hook_sym_addr
或 shadowhook_hook_func_addr
执行 hook 操作。如果需要连续 hook 同一个 ELF 的多个函数,这样做比连续多次调用 shadowhook_hook_sym_name
执行效率更高一些。当然,用 shadowhook_dlsym
查找到的符号也可以直接调用,或者做其他的事情。
如果你只是要“把apk中的so库加载到内存中”,直接使用 dlopen
就可以了,这就是 android 标准的方法,而且工作的很好,shadowhook 没有必要去再次实现或者封装 dlopen
的功能。
shadowhook_dlopen
和 shadowhook_dlsym
的实现来自于再封装 xDL(https://github.com/hexhacking/xDL )。xDL 有更多的功能,你可以继续研究一下。另外,xdl_open
也不提供“把apk中的so库加载到内存中”的功能,因为没有必要。xdl_open
的目的是实现 dlopen
做不到的事情。
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的意义就不存在了。