反反调试hook之后崩溃

找到了反调试的目标函数如图

2
写hook如下图
3
运行之后,成功hook住函数,断点如下
在这一步查看寄存器如下

在这一步再ni,结果就GG了,异常信息如下

不知道是怎么回事,hook这个函数怎么会导致无法正常运行,而且hook的函数最后一步的时候,寄存器没有看到0xffffffe3a3a3a200类似的东西,我想的是我hook了这个函数,那么在函数最后要去跳转lr回到调用函数处,这个hook不是很常见么,hook之后就异常,求大佬指导啊!

首先,先明确下,你是怎么hook的,是hook 系统c fun 的方式,还是 hook 单句汇编代码
其次,你上传的信息,看不出来你是 hook 系统 c fun,还是 hook 单句汇编代码

如果,你是hook 系统c fun ,那么此处没法hook,参考 fishhook,那个是 hook 系统 c fun

这里 不是 oc 方法,所以,我相信,你不会用 oc 运行时,来hook

所以来说,此处,只能用 单句汇编hook,可以参考 hookzz 框架,可以说是 inlinehook了

如果你是用 hookzz 框架,或者自己写的inlinehook,那么你肯定是 跳板函数,对 lr没保存,
要么是对原函数的hook影响的下句地址没保存,或者是 跳板函数调用new函数时候的下一句地址的没保存

最后导致,你在此处ret 回去,立马出错

1 Like

这就是一个独立的c函数,应该是可以hook的,hook采用的就是hookzz的buildhook(好像是早一点的版本了)

unsigned long func = (_dyld_get_image_vmaddr_slide(0) + 0x101025068);
void *hack_sub_func = (void *)func;
ZzBuildHook((void *)hack_sub_func, (void *)new_sub_101025068, (void **)&old_sub_101025068, NULL, NULL);
ZzEnableHook((void *)hack_sub_func);

这样hook不行吗?这个函数好像就是独立的c函数啊

这种,你冬天调试一哈,就知道问题了,主要盯着 返回地址。看啥时候改变的
以及没一层调用的时候,里面里面 对 lr 进行了保存不
强制跳转 实现跨度的代码,lr不变,也不用保存
br 等函数形式的代码跨度,需要里面保存和恢复 lr

冬天调试是什么

这破输入法…动态…打成 冬天了…zhang总收下留情

看sub_101025068本来的实现,里面有r29 r30操作,是不是可以理解为本来的实现里对lr有操作,然而我hook之后,是空实现,没有保存lr,导致异常的?

自己 跟踪一个函数的调用和执行,就知道怎么处理的了,不外乎进出函数时的栈平衡,和进入函数后,保存上个函数的运行环境

说得再多都没有用,不如仔细分析一哈