Closed pxb1988 closed 7 months ago
bytehook与shadowhook虽然一个是plt/got hook另一个是inline hook, 两个组件有相同基础xDL, bytesig, bsd, lss ... 合并两边是有某种可能性的.
bytehook
shadowhook
两个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_STACK和backup部分.
BYTEHOOK_POP_STACK
backup
backup 就是某种 BYTEHOOK_CALL_PREV 可以合并. BYTEHOOK_POP_STACK应该可以通过自动生成trampline的方式等价去掉.
BYTEHOOK_CALL_PREV
那么新的通用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); // 注册更多
不做修改, 现在的就挺好的
No response
感谢建议,如果合并确实在同时需要使用inline和plt hook的场景中更简洁了,API也可以统一。
主要bytehook和shadowhook是先后开发的,开发组人员也有部分不同,另外,目前公司内有些app不会同时用到两种hook方式,所以暂时是不会合并了。
the Feature, Motivation and Pitch
bytehook
与shadowhook
虽然一个是plt/got hook另一个是inline hook, 两个组件有相同基础xDL, bytesig, bsd, lss ... 合并两边是有某种可能性的.两个hook框架一个是在caller方, 一个是在callee方进行hook. 如果能用统一的api去写那会很酷.
他们的代码可以说是相似的,区别是
BYTEHOOK_POP_STACK
和backup
部分.backup
就是某种BYTEHOOK_CALL_PREV
可以合并.BYTEHOOK_POP_STACK
应该可以通过自动生成trampline的方式等价去掉.那么新的通用hook的代码就变成
Alternatives
不做修改, 现在的就挺好的
Additional context
No response