iOS运行时挂钩检测代码解析:dladdr判定逻辑疑问
为何
dladdr(UnsafeRawPointer(imp), &info) != 1能检测iOS运行时挂钩? 先理清楚核心逻辑:
- iOS里,正常的方法实现(
IMP)是存放在APP自身二进制或系统框架的合法镜像内存区域中的。 dladdr是系统提供的工具函数,作用是根据传入的指针,查找它所属的动态镜像(比如APP主程序、系统库)。如果找到对应镜像,就返回1,同时把镜像信息写入info参数;找不到就返回非1的数值。
再看挂钩后的情况:
当方法被运行时挂钩(比如用FishHook、Substrate这类工具),原方法的IMP会被替换成一个不在原有合法镜像内存范围内的指针——可能是堆上生成的代码片段、第三方注入库的代码,或是被篡改的内存区域。这时候dladdr找不到这个指针对应的合法镜像,就会返回非1的结果,代码里就会return false,表示检测到挂钩行为。
反过来,如果dladdr返回1,说明当前的IMP还在它原本所属的镜像内存里,没有被篡改替换,也就判定未被挂钩。
内容的提问来源于stack exchange,提问作者DevRaj
相关产品推荐
相关产品推荐

