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 12 hook 后 cfi_check 崩溃显著增加 #98

Open onvejon opened 3 months ago

onvejon commented 3 months ago

bytehook Version

1.0.10

Android OS Version

12

Android ABIs

armeabi-v7a

Device Manufacturers and Models

定制安卓设备

Describe the Bug

image 目前遇到的情况是,启用hook后,极易出现 cfi_check 崩溃,关闭后则几乎不会出现 cfi_check 崩溃。希望获得大佬的指定和帮助。

hook代码如下,对libc的socket接口进行了hook。其他一切配置都是按照例子里面的调用方法。 有一点疑惑的点:调用hook的时机不是在 Application.onCreate. 而是在App启动后的一段时间才hook的,和例子有些不同,不知道这样调用会有什么影响。

static bool allow_filter(const char *caller_path_name, void *arg) {
    (void)arg;

    if (NULL != strstr(caller_path_name, "libc.so")) return false;
    if (NULL != strstr(caller_path_name, "libbase.so")) return false;
    if (NULL != strstr(caller_path_name, "liblog.so")) return false;
    if (NULL != strstr(caller_path_name, "libunwindstack.so")) return false;
    if (NULL != strstr(caller_path_name, "libutils.so")) return false;
    // ......

    return true;
}

if (!sock_sendto_stub) {
        sock_sendto_stub = bytehook_hook_partial(allow_filter, NULL, "libc.so", "sendto" , sock_sendto_proxy_auto, sock_sendto_hooked_callback, NULL);
    }
    if (!sock_recvfrom_stub) {
        sock_recvfrom_stub = bytehook_hook_partial(allow_filter, NULL, "libc.so", "recvfrom" , sock_recvfrom_proxy_auto, sock_recvfrom_hooked_callback, NULL);
    }
caikelun commented 2 weeks ago

感谢反馈这个问题。

这个问题的原因应该是目前 bytehook 对 CFI 的处理只针对了 64 位设备。根据我们之前的数据观察,可能是因为开启 CFI 需要消耗比较多的内存,所以在线上的移动设备中,只发现厂商在部分 64 位设备上会开启 CFI。

bytehook 对 CFI 的处理主要在 bh_hook_manager.cbh_elf.c 中,加了 #ifdef __LP64__ 宏,你可以把对应位置的宏去掉试试。或者也可以等即将发布的新版本,我会在新版中修改这个问题。