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

有人遇到开启hook后native heap明显增加的问题吗 #33

Closed maocanmao closed 2 years ago

maocanmao commented 2 years ago

bytehook Version

1.0.0

Android OS Version

10.0

Android ABIs

armeabi-v7a, arm64-v8a

Device Manufacturers and Models

oppo r17

Describe the Bug

用一个demo应用跑的。hook的是mmap malloc等函数。 跳板函数仅调用了BYTEHOOK_STACK_SCOPE 和BYTEHOOK_CALL_PREV。 但是开启后heap native增加了非常多。在真实项目中更明显,多了大几百M 未开启hook image

开启hook image

caikelun commented 2 years ago

没有遇到过,建议逐步减少hook点对比分析。另外:

  1. 建议检查下代码,有没有类似memalign proxy中调用calloc的情况
  2. 请用最新版本的bytehook再试一下,看是否有区别
  3. 可以对比分析下maps和smaps
  4. bytehook本身以及hook行为确实需要占用一些内存(对GOT的修改本身会引起private dirty的增加,记录solist用于发现新加载so,记录hook信息用于unhook和log,auto mode需要为每个hook点的每个caller保存调用信息用于避免环形调用),但不会占用“大几百M”。如果对内存占用的要求比较苛刻,可以试一下manual mode,占用内存会相对少一点
maocanmao commented 2 years ago

大佬,我这边升级了最新版本的bytehook,通过减少hook点,发现如果开启hook malloc calloc realloc 的时候(部分hook,有几个so排除在外),native heap会显著增大。 未开启时 image 开启时 image

hook函数中也没有做什么事,很奇怪。

    malloc_hook_stub = bytehook_hook_partial(hook_filter, nullptr, nullptr, "malloc",
                                             (void *) my_malloc,(bytehook_hooked_t) hookedMallocCallback, nullptr);

    calloc_hook_stub = bytehook_hook_partial(hook_filter, nullptr, nullptr, "calloc",
                                             (void *) my_calloc,(bytehook_hooked_t) hookedMallocCallback, nullptr);

    realloc_hook_stub = bytehook_hook_partial(hook_filter, nullptr, nullptr, "realloc",
                                              (void *) my_realloc,(bytehook_hooked_t) hookedMallocCallback, nullptr);
void *my_malloc(size_t size) {
    BYTEHOOK_STACK_SCOPE();
    void *result = BYTEHOOK_CALL_PREV(my_malloc, size);
    return result;
}

void *my_calloc(size_t count, size_t size) {
    BYTEHOOK_STACK_SCOPE();
    void *result = BYTEHOOK_CALL_PREV(my_calloc, count, size);
    return result;
}

void *my_realloc(void *ptr, size_t size) {
    BYTEHOOK_STACK_SCOPE();
    void *result = BYTEHOOK_CALL_PREV(my_realloc, ptr, size);
    return result;
}

另外对比了一下smaps,主要的区别就是libc_malloc的大小 110008 kB : [anon:libc_malloc] 237788 kB : [anon:libc_malloc]

caikelun commented 2 years ago

@maocanmao 请问是发现了问题原因才close的吗?前几天事情比较多,这周本来打算查一下这个问题的。

maocanmao commented 2 years ago

@maocanmao 请问是发现了问题原因才close的吗?前几天事情比较多,这周本来打算查一下这个问题的。

我把hook malloc calloc realloc 这几个函数的hookcallback函数去掉了,内存占用就下来了。但是我在callback里也只是打了一行日志