ios修改寄存器来调用函数

时间:2013-03-26 10:23:08

标签: ios debugging assembly gdb lldb

我连接到iphone的debugserver并能够发送GDB Serial Protocol个数据包。我可以设置断点并等到它达到。当它想要用已知参数调用objc_msgSend时,获取它的输出并继续执行。现在我在xcode和lldb中模拟它的进程,所以我不能只使用'call objc_msgSend(object,_cmd)'。

我做了什么:

  • 将断点设置为某些代码
  • 注册读取pc //读取下一个操作地址
  • register write lr 0x0x0000253a //设置返回地址以继续执行(pc值)
  • 注册写入pc 0x30300c88 //我的objc_msg发送地址
  • 寄存器写入r0 0x16ed30 //我的对象地址
  • 注册写入r1 0x3161 //我的选择器地址
  • 断点设置-a 0x0x0000253a
  • 继续

所以我调用了我的方法,但随后应用程序崩溃,永远不会到达我的'返回地址'0x0x0000253a。它还用返回值重写r0,所以我的方法完全不完整。我知道我所做的是硬核覆盖寄存器而不存储和恢复以前的值,所以请帮忙。我如何存储/恢复寄存器状态,我做错了什么或者我不做什么必要的事情?

在“调用objc_msgSend”时跟踪xcode的调试器是非常有帮助的。我尝试使用this code和fruitstrap来使用dtruss,然后研究它的输出 - 它有成千上万的内存读取和断点集,对我来说没用。

注意:我只能使用GDB串行协议。

0 个答案:

没有答案