iqiyi / xHook

🔥 A PLT hook library for Android native ELF.
Other
4.07k stars 759 forks source link

Fix BUG of external signals in signal processing functions #104

Closed Mr-JingShi closed 1 year ago

Mr-JingShi commented 1 year ago

xHook在信号处理这块有点问题: xHook针对SIGSEGV做了特殊处理,用来防止自己的core dump扩散到外面。然而外面的信号被xHook捕获到时会调用sigaction把old信号处理函数重新注册成新的信号处理函数------>此操作等同放弃了自己的信号保护机制。

假如APP中存在如同xHook一样的防崩溃保护机制的代码块(库)有两处,我们暂时称呼为xHook和ABC,并假设ABC先注册信号处理函数,xHook后注册信号处理函数,ABC代码块发生崩溃,xHook代码块的信号处理函数捕获到ABC代码块的SIGSEGV,xHook代码块判断不是自己内部的便放弃了自己的信号处理函数并把ABC代码块的信号处理函数注册成新的信号处理函数,最终会触发了ABC的信号处理函数,程序不会崩溃。

程序执行一段时间后,如果xHook代码块发出了SIGSEGV信号,SIGSEGV信号会被ABC的信号处理函数处理,程序就崩溃了。并没有做到杜绝因为xHook崩溃而造成APP崩溃的承诺。

参考Android处理方案,直接调用旧的信号处理函数即可。 https://cs.android.com/android/platform/superproject/+/master:external/gwp_asan/gwp_asan/optional/segv_handler_posix.cpp

image

caikelun commented 1 year ago

@Mr-JingShi 你说的基本是对的。另外,native crash 兜底模块还需要考虑多线程并发、signal mask 设置、性能等问题,建议直接使用 bytehookshadowhook 的 bytesig 模块,这是一个经过严格测试的、经过线上验证的、可复用的 native crash 兜底模块:

源码: https://github.com/bytedance/bhook/blob/main/bytehook/src/main/cpp/bytesig.h https://github.com/bytedance/bhook/blob/main/bytehook/src/main/cpp/bytesig.c 文档: https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md#native-%E5%B4%A9%E6%BA%83%E5%85%9C%E5%BA%95

另外,关于 xHook 的一些问题,可以参考这里:https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md#xhook-%E7%9A%84%E4%B8%8D%E8%B6%B3%E4%B9%8B%E5%A4%84

Mr-JingShi commented 1 year ago

@Mr-JingShi 你说的基本是对的。另外,native crash 兜底模块还需要考虑多线程并发、signal mask 设置、性能等问题,建议直接使用 bytehookshadowhook 的 bytesig 模块,这是一个经过严格测试的、经过线上验证的、可复用的 native crash 兜底模块:

源码: https://github.com/bytedance/bhook/blob/main/bytehook/src/main/cpp/bytesig.h https://github.com/bytedance/bhook/blob/main/bytehook/src/main/cpp/bytesig.c 文档: https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md#native-%E5%B4%A9%E6%BA%83%E5%85%9C%E5%BA%95

另外,关于 xHook 的一些问题,可以参考这里:https://github.com/bytedance/bhook/blob/main/doc/overview.zh-CN.md#xhook-%E7%9A%84%E4%B8%8D%E8%B6%B3%E4%B9%8B%E5%A4%84

🙏感谢指导。