如何hook那些在IDA中显示为sub_xxx的函数

唉,说起来这就是一个坑,Cydia Substrate在其文档中也没找到详细说明,最后也只能来看看代码曾半仙最早给的那份substrate-master源码,然后一切就了然于胸了,这个坑很大,很大!!!
现在我们先来看下MSHookFunction怎么Hook IDA中的sub_xxxx函数,然后再来谈谈为啥是这样的。


就以这段代码为例吧,下断点红色选中部分,中的sub_17C94就是我想要Hook的函数,首先确认了下参数个数为2个。
以下给出代码片段截图:


看到这里我想很多人有点不理解,为啥需要 | 0x00000001,别急,下面我就借花献佛,慢慢道来也。
既然源头是出现在MSHookFunction上,那们我们就去阅读下这块的代码:


从这2 段代码中可以很明显的看到在SubstrateHookFunction中,看到这么一句
if ((reinterpret_cast<uintptr_t>(symbol) & 0x1) == 0)
也就是说,MSHookFunction在判断Hook函数的时候,是通过在传到进来函数地址的奇偶数来判断是ARM指令的函数,还是Thumb指令的函数。
这个坑好大,我勒个去啊!!!
别急,接下来看这句
reinterpret_cast<void >(reinterpret_cast<uintptr_t>(symbol) & ~0x1)
判断完后,为了能正确Hook地址,又改回原来的地址了,这下变清楚了吧。
再者,从MSFindSymbol函数中也能清楚的看到
value |= 0x00000001*这句!!!

PS: 把Hook写得飞起吧…

11 个赞

看不懂:titter:

自己该把位运算补补了~

简单一点说就是:
地址最后一位是偶数,就是ARM指令
地址最后一位是奇数,就是Thumb指令
一般,把 Thumb指令的函数地址 | 0x0001 即可.

1 个赞

简单地说,就是看了Young的帖子,IDA中Functions window里的所有函数都可以hook啦!

哈哈多谢分享

ARM指令的函数和Thumb指令的函数, 和其地址值的奇偶性为啥会有关呢? 想不明白, 跪求指教= =

这是Cydia Substrate作者为了让hook通用2中指令集的hook,自己做的判断的

也就是说, 反正函数地址肯定都是偶数, 作者脑洞大开, 自己想了这么一出, 调用者必须把地址变成奇数以此来区分出thumb指令来, 是这个意思吗? 没道理啊, 明明多加个参数就可以解决的事情吧…

为什么要在外部调用的时候hook呢,而不在函数内部调用呢

什么意思?

如上图的红色行,如果勾住地址0x18152和勾住0x17c94是什么区别,为什么不勾住函数外部而勾住函数内部了,这两个有区别么

在0x18152这个地方跳转到0x17c94去,这2个地址可以说是没有关系

什么代码编辑器,颜色区分不错?

请问 image_base 这个地址怎么得到?@Young

用_dyld_get_image_vmaddr_slide函数

3Q
顺便问一下新书大概什么时候可以买到

美团,64 位上,发现 _dyld_get_image_vmaddr_slide(0) + 0x44C4 + 0x100000000 发现要再加上 0x100000000 ,就可以patch 成功了