直接加上IDA分析出来的地址就好了,通常遇到ARM64,IDA分析出来的地址也都是超过int的大小范围
你这个0x44C4是32位IDA上分析出来的地址吗?64位的地址都很大
是的,32和64的起始地址不同,很正常
32位和64位的函数位置也不一样吧?所以要区别2个架构base_addr加上不同的函数地址么?
嗯,学习了,很不错的思路。
这个方式貌似只适用于armv7/armv7s的指令集?
arm64的话,应该怎么hook呢?
已解决:
对于armv7/armv7s,参考这个帖子;
对于arm64,在上面帖子的基础上,去掉 | 0x1
的操作即可。
楼主,在哪里可以得到 CydiaSubstrate 的源码?
github. 只不过是以前的, 有些机制不适用, 但是对理解有帮助.
大神请问,ARM64为啥去掉 | 0x1, 有什么讲究吗。自己是64的环境,照着帖子搞了好久都没有成功,直到看到这句话。
应该是arm兼容thumb的机制,需要通过地址奇偶来切换指令解析流程
如何调用这个sub_xxx()函数
hook一般都会起一个指针保留替换前的入口地址,用这个指针就可以
类型转换成函数指针再调用啊
需求:想要通过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 紫薯布丁