bytedance / bhook

:fire: ByteHook is an Android PLT hook library which supports armeabi-v7a, arm64-v8a, x86 and x86_64.
https://github.com/bytedance/bhook/tree/main/doc#readme
MIT License
2.05k stars 315 forks source link

Android 11 没有命中自己App中加载的so #36

Closed zqhGeek closed 2 years ago

zqhGeek commented 2 years ago

bytehook Version

1.0.5

Android OS Version

11

Android ABIs

arm64-v8a

Device Manufacturers and Models

oppo

Describe the Bug

df702b1fadb03cf625d6cb43ef172f1

我使用bhook去hook自己加载的另一个so,发现没有hook到,map中没找到这个so,pc命中的是base.apk,打印bhook中的bh_elf_manager_iterate_cb,没看到这个so,这个是Android 11的特性?

caikelun commented 2 years ago

你应该是设置了 useLegacyPackaging false(旧版本 gradle 是 extractNativeLibs),这种情况下 so 会以未压缩的形式放到 apk 中,apk 会变大,安装后不需要把 apk 中的 so 解压出来,因此安装后占用体积会变小。

这种情况下,maps 里也是有的,只是只能看到 xxx.apk,看不到 so 名。用 dl_iterate_phdr 可以获取到 so 文件名,就是你截图中的命名格式。

bytehook 是支持 hook 这种形式加载的 so 库的。hook 失败和这个问题应该没有关系。

hook 失败,你可以贴一下执行 hook 的逻辑,以及 hook 函数的返回值,还可以通过 bytehook_hooked_t hooked 设置 callback,在 callback 里可以获取 hook 失败的 status_code。

zqhGeek commented 2 years ago

感谢大佬的帮助,因为我习惯了看那个log中的 hook ok的日志,看到没打印就认为是不成功,没有用回调去看,实际看是hook成功了,我先关闭,后面我补上回调看看,结果

zqhGeek commented 2 years ago

image

我使用的是项目的demo,没有修改hook部分,仅修改hookee_test,我发现不管是否有压缩形式,hook的回调都是随机性,不是每次成功hook都回调,回调也是demo中的逻辑没有改动,使用的是single模式,虽然结果都能hook到,但是每次的日志输出都不固定

caikelun commented 2 years ago

@zqhGeek adb logcat -b main -G 6M

zqhGeek commented 2 years ago

@caikelun 我已经在开发者模式调到了16M,应该不是这个影响?