如何使用 Hopper 查找所有子程序调用?

逆向工程 料斗
2021-06-24 11:11:04

一旦 iOS 应用程序加载到 Hopper 中,如何找到所有子程序调用?

如果我理解正确,子程序由唯一地址标识。所以在二进制文件中,对这个子程序的所有调用都应该指向这个地址。因此,应该可以列出对这个地址的所有调用,我错了吗?这似乎是一个很简单的东西,但我在其他地方找不到任何关于它的东西。

2个回答

如果我正确理解了您的问题,那么您正在搜索 Hopper 中的交叉引用功能。

交叉引用

交叉引用(或简称为 XREF)是反汇编程序的一项功能,可向您显示特定函数和对象的调用位置或特定函数使用的函数和对象。我们可以通过将其关联为 XREF-To 和 XREF-From 来简化它。引用的可以是数据或代码。

当我们想要准确地确定从何处调用函数或当前函数调用哪些函数时,外部参照是一种宝贵的资源。正如您所理解的,这非常有用,因此我们不必为帧指针迭代堆栈以查找调用当前函数的函数,或者手动搜索特定地址CALL

料斗

在料斗反汇编器中,您可以X在标记所需地址的同时按 来查看 XREFs-To地址。XREFs-From 可以使用Alt+ 显示X或者,您可以Navigate在 Hopper 顶部工具栏中找到交叉引用列表您还可以通过按右键单击地址,然后选择“对...的引用”或“对...的引用”来查找对地址的引用。

在此处输入图片说明

尽管如此,当分析一个程序时,Hopper 会在注释中添加一个XREFs-From列表

  j_puts:
08048390   jmp   dword [puts@GOT]   ; puts@GOT,puts, CODE XREF=sub_8048662+15, sub_8048662+31, sub_8048662+86, sub_8048662+104

我不确定它在 IOS 或 hopper 上是如何工作的,但根据我的经验,函数调用可能会被混淆。我已经看到值加载到寄存器中,然后在调用所述寄存器之前执行一些算法。

前任。一个函数位于 VA 1000

  1. 将值 100 加载到寄存器 1
  2. 将寄存器 1 乘以 5
  3. 将 500 添加到 register1
  4. 将参数压入堆栈
  5. 调用寄存器1

我希望这能有所帮助。