合并bytehook与shadowhook
pxb1988 opened this issue · comments
Bob Pan commented
the Feature, Motivation and Pitch
bytehook
与shadowhook
虽然一个是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_STACK
和backup
部分.
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
Kelun Cai commented
感谢建议,如果合并确实在同时需要使用inline和plt hook的场景中更简洁了,API也可以统一。
主要bytehook和shadowhook是先后开发的,开发组人员也有部分不同,另外,目前公司内有些app不会同时用到两种hook方式,所以暂时是不会合并了。