这个快速演示将为您提供有关 Hopper 是什么以及它是如何工作的很好概述。
Hopper 是一个功能丰富的应用程序,这里无法讨论所有内容,但不用担心,您很快就会找到您的标记,并轻松发现其所有细微之处。
界面分为三个主要区域:
Hopper 的理念是将一组字节(您想要分析的二进制数据)转换为人类可读的内容。
为此,Hopper 将尝试为文件的每个字节关联一个类型。因为手动操作成本太高,Hopper 在加载文件后立即进行自动分析。
Hopper 中可用的各种类型包括:
工具栏包含您可以设置的每种类型的按钮(D代表数据,A代表ASCII等)。这些字母也是您可以直接使用的键盘快捷键。
数据类型具有一些特定的行为:第一次使用此类型时,Hopper 将将该区域转换为字节。如果再次使用它,字节将转换为 16 位整数,然后是 32 位整数,依此类推…
随意玩转变换以探索可执行文件:Hopper 提供了一个撤销/重做功能。
阅读汇编语言有点困难,在某些情况下也很无聊。为了帮助您,Hopper 可以使用不同种类的代码表示。
大多数需要构建一个过程,因为过程包含有关代码结构的其他信息,如基本块或堆栈使用。
当前模式可以使用工具栏进行更改:
第一种模式是装配模式。Hopper 按顺序打印汇编代码的行。这是大多数反汇编器提供的功能。
第一列(蓝色数字)表示指令地址,然后是指令助记符及其操作数(或参数)。作为一种选项,在应用程序的首选项中,您可以选择在地址和指令助记符之间打印指令编码。
在边缘,您会看到一些彩色箭头。这些箭头代表跳转指令的可能目的地。例如,在上面的截图中,地址0x100002d82和0x100002db4之间的蓝色箭头表示指令je在0x100002d82处可能会跳转到地址0x100002db4,如果条件满足的话。当指令跳转到更大的地址(向前跳转)时,箭头会用蓝色绘制。如果跳转向前,箭头会用红色绘制。
请注意,在此表示中,如果您单击红色列,将在相应地址处设置断点,如果您单击蓝色列,将设置书签。
CFG 模式代表了一种更有结构化的过程。
在右侧面板(检查员),您会找到一个专门用于模式的部分。 控制流图 组件显示当前过程的较小表示,称为 迷你地图。 每个方块代表一个基本块,线条表示它们的连接。 其中一个方块填充为蓝色:这是包含光标的基本块。 浅灰色方块代表在主要部分绘制的当前方法部分。 您可以通过直接在此地图中单击来移动视口。
图的节点可以被修改。例如,当您认为它们密切相关时,可以对其中一些进行分组。选择节点,然后单击检查器中的Group Nodes按钮。您还可以为给定节点设置自定义背景颜色,或编辑打印文本。
在这种模式下,Hopper 将生成一个伪代码,它在功能上等同于原始的 CPU 指令,但更像是 Objective-C 方法。
这显然是阅读您正在分析的代码的最简单方式,但您应该记住没有什么是魔法:有时候,无法构建一个完美的伪代码表示过程,有些部分可能会消失,因为 Hopper 错误地认为代码是不可达的(也称为死代码)。为了缓解这个问题,您可以尝试切换视图顶部的相应复选框。
这种模式允许您直接查看文件的字节。
第一列表示文件中的偏移量,其他列表示每个字节。当您将光标放在一个字节上时,您会注意到选择会自动向左和向右扩展。事实上,Hopper 对文件的了解比任何普通的十六进制编辑器都要多,例如,在上一个屏幕截图中,Hopper 知道光标位于指令内部,并选择了所有字节。
如果您双击字节,您可以更改其值。在某些情况下,这可能会破坏底层结构。例如,如果您的光标位于指令中,则该指令将自动销毁,并且相关的 Hopper 类型将回退到未定义状态。此外,如果该指令是某个过程的一部分,则该过程将被销毁。无论如何,请记住您始终可以撤消更改,因为 Hopper 提供了撤消/重做功能。
此表示中的列数取决于窗口的宽度;这是默认行为,但可以在应用程序首选项中更改。例如,您可以强制 Hopper 始终显示 16 列,无论窗口的宽度是多少。
一个可执行文件被分割成称为segments和sections的较小数据片段。
当操作系统加载可执行文件时,其字节的某些部分将映射到内存中。映射到内存中的文件的每个连续部分称为段。这些段被分割成称为节的较小部分,这些部分将接收各种访问属性。
您可以使用导航> 显示段列表和导航> 显示部分列表菜单项浏览这些对象。
因为要记住每个代码片段所在的可执行文件的地址太困难,您可以将名称或符号分配给这些地址。
要为地址命名,只需将光标放在地址上,然后按下N。对话框将弹出:只需输入您想设置的名称即可。
符号列表可在窗口左侧窗格中访问。
一个可执行文件被分割成称为segments和sections的较小数据片段。
当操作系统加载可执行文件时,其字节的某些部分将映射到内存中。映射到内存中的文件的每个连续部分称为段。这些段被分割成称为节的较小部分,这些部分将接收各种访问属性。
您可以使用导航> 显示段列表和导航> 显示部分列表菜单项浏览这些对象。
使用搜索字段,您可以过滤下面列出的符号。Hopper 使用一种正则表达式来过滤列表;首先,它将呈现完全包含您输入的术语的项目。然后,在下面,列出包含一个文本插入、两个插入等的符号列表。这就是我所说的模糊搜索,这种行为可以在应用程序的首选项中禁用。
您可以使用标签来更有效地过滤符号列表。标签是可以放在地址、过程的基本块或整个过程上的文本信息。您可以打开标签范围元素,查看当前文档中存在的所有标签。如果选择一个标签,只有包含此标签的过程将被列出。请注意,如果关闭标签范围项目,则过滤器将重置为所有标签。
一个有趣的事情要注意的是,在可执行文件的加载过程中,许多标签是自动生成的。例如,每个入口点都将接收一个特定的入口点标签,每个 Objective-C 类的每个实现都将被标记为类(或类别)的名称。这使您能够快速浏览 Objective-C 编写的代码!
您可以选择显示文件中包含的字符串。在此模式下,只显示 ASCII 字符串,标签范围不起作用。
在组件的正上方,您会找到导航栏。
这个工具栏用于快速导航到文件中。使用颜色方案来指示文件字节的各种类型。
一个小的红色箭头指示当前光标的位置。
这是您可以在检查器中找到的组件的快速概述:
此组件显示当前指令的字节。如果当前处理器具有多个 CPU 模式(例如 ARM 处理器系列的 ARM 和 Thumb 模式),您将看到一个弹出菜单,让您在当前地址更改 CPU 模式。
这个组件用于更改指令操作数的显示格式。您可以在有符号/无符号十六进制、十进制、八进制、地址等之间进行选择。
您可以在给定地址关联文本注释。使用此组件编辑此注释。
这个组件允许您将标签与地址、过程的基本块或过程关联起来。这些标签对于在文件中高效导航非常有用。
您甚至可以在地址上添加一些颜色,以便快速且直观地区分可执行文件的各个部分。
这是一个非常重要的组件;它显示一个指令可以引用另一个指令或一段数据的所有引用。它还包含另一种方式的引用,即引用这个指令的其他指令。如果 Hopper 执行的分析没有找到任何引用,您甚至可以手动添加自己的引用。
如前所述,Hopper 提供了一个十六进制编辑器。编辑器与汇编语言视图同步,自动突出显示当前指令的字节。
双击字节以修改它。如果出错,可以使用撤销/重做功能。
嵌入式汇编程序可以从 Hopper 的修改 > 汇编指令…菜单中调用。
您还可以使用修改 > NOP 区域菜单,将当前选择的指令替换为 NOP 指令。