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

合并bytehook与shadowhook #86

Closed pxb1988 closed 7 months ago

pxb1988 commented 8 months ago

the Feature, Motivation and Pitch

bytehookshadowhook虽然一个是plt/got hook另一个是inline hook, 两个组件有相同基础xDL, bytesig, bsd, lss ... 合并两边是有某种可能性的.

两个hook框架一个是在caller方, 一个是在callee方进行hook. 如果能用统一的api去写那会很酷.

typedef strlen_t ;

// bytehook
size_t my_strlen(const char* const str)
{
    size_t result = BYTEHOOK_CALL_PREV(my_strlen, strlen_t, str);
    BYTEHOOK_POP_STACK();
    return result;
}
 // shadowhook
strlen_t strlen_backup = ...;
size_t my_strlen(const char* const str)
{
    size_t result = strlen_backup(str);
    return result;
}

他们的代码可以说是相似的,区别是BYTEHOOK_POP_STACKbackup部分.

backup 就是某种 BYTEHOOK_CALL_PREV 可以合并. BYTEHOOK_POP_STACK应该可以通过自动生成trampline的方式等价去掉.

那么新的通用hook的代码就变成

size_t my_strlen(const char* const str)
{
    size_t result = CALL_PREV(my_strlen, strlen_t, str); // chain to next
    return result;
}

hook_plt("libxxx.so" -> "libc.so", "strlen", my_strlen);  // 注册
hook_inline("libc.so", "strlen", my_strlen);  // 注册
hook_inline("libc.so", "strlen", my_strlen2);  // 注册其他的
hook_inline("libc.so", "strlen", my_strlen3);  // 注册更多

Alternatives

不做修改, 现在的就挺好的

Additional context

No response

caikelun commented 8 months ago

感谢建议,如果合并确实在同时需要使用inline和plt hook的场景中更简洁了,API也可以统一。

主要bytehook和shadowhook是先后开发的,开发组人员也有部分不同,另外,目前公司内有些app不会同时用到两种hook方式,所以暂时是不会合并了。