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

直接加上IDA分析出来的地址就好了,通常遇到ARM64,IDA分析出来的地址也都是超过int的大小范围

你这个0x44C4是32位IDA上分析出来的地址吗?64位的地址都很大

是的,32和64的起始地址不同,很正常

32位和64位的函数位置也不一样吧?所以要区别2个架构base_addr加上不同的函数地址么?

嗯,学习了,很不错的思路。

这个方式貌似只适用于armv7/armv7s的指令集?
arm64的话,应该怎么hook呢?

已解决:

对于armv7/armv7s,参考这个帖子
对于arm64,在上面帖子的基础上,去掉 | 0x1的操作即可。

6 个赞

楼主,在哪里可以得到 CydiaSubstrate 的源码?

github. 只不过是以前的, 有些机制不适用, 但是对理解有帮助.

大神请问,ARM64为啥去掉 | 0x1, 有什么讲究吗。自己是64的环境,照着帖子搞了好久都没有成功,直到看到这句话。

应该是arm兼容thumb的机制,需要通过地址奇偶来切换指令解析流程

如何调用这个sub_xxx()函数

hook一般都会起一个指针保留替换前的入口地址,用这个指针就可以

1 个赞

类型转换成函数指针再调用啊

2 个赞

需求:想要通过MSHookFunction()的方式Hook 并调用sub_1F29BD8()函数;
说明: 0x1F29BD8是IDA中的基地址;g_slide是获取到的所在模块的偏移地址;0x2b69bd8便是计算出来的目标函数函数实际地址。
问题:为啥会提示算出来的地址是坏地址?
结论:实际地址计算错误。IDA地址归零的话,计算实际地址是要追加上0x100000000可以拿到真实地址了。
新问题:还是Hook不到(越狱机上也不好使)
结论:通过MonkeyDev安装到非越狱机上(iPhone8 v_11.0.3),MSHookFunction()的方式Hook不到;通过Tweak移植到越狱机上(iPhone 6s v_9.0.2)可以Hook的到目标地址。
新问题:手动调用MSHookFunction()第三个参数存下来的函数地址,总是崩溃(53行)。


结论:主动调用会崩溃的原因是调用的“时机早了”。虽然53行已经计算出来了目标地址,但是这个地址也仅仅是手动算出来的,尽管它是正确的,但是我理解53此时这个目标地址的内容并未初始化完成,所以此时调用会崩溃,并提示坏地址访问。现在我是在一个“足够靠后”的时机去手动调用这个目标函数,就不会崩溃了。【结案】

提示 0x100000000

既然你都上lldb了 为何不dis -a 一下看看汇编是否跟ida里的一致,一致就是计算正确了

1、IDA已经设置起始地址为0x0了;
2、image list 显示的基地址和 g_slide 的值也是一致的;
3、 dis --start-address 0x2b69bd8确实显示读取该内存失败。
(lldb) dis --start-address 0x2b69bd8
error: memory read failed for 0x2b69a00
error: Failed to disassemble memory at 0x2b69bd8.

你都不看上面的评论的吗?从头看一遍帖子和评论吧

here 紫薯布丁

好的,现在加上0x100000000可以拿到真实地址了。可是为什么还是Hook不到?
说明:通过在真实地址处下断点,可以确定这个函数会被执行。(参数一是数值,参数二是NSData,返回值是NSData)