1

我连接到 iphone 的调试服务器并能够发送GDB 串行协议数据包。我可以设置断点并等到它到达。当它确实我想用已知参数调用 objc_msgSend 时,获取它的输出并继续执行。现在我在xcode和lldb中模拟它的过程,所以我不能只使用'call objc_msgSend(object,_cmd)'。

我所做的:

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

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

此外,在“调用 objc_msgSend”时跟踪 xcode 的调试器可能会非常有帮助。我尝试使用这段代码和fruitstrap来使用dtruss,然后研究它的输出——它有数千个内存读取和断点集,对我来说没用。

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

4

0 回答 0