Hopper Disassembler logo

Hopper Disassembler

By Cryptic Apps

教程

Hopper Disassembler 是一个工具,将帮助您对可执行文件进行静态分析。

演示

这个快速演示将为您提供有关 Hopper 是什么以及它是如何工作的很好概述。

Hopper 是一个功能丰富的应用程序,这里无法讨论所有内容,但不用担心,您很快就会找到您的标记,并轻松发现其所有细微之处。

界面分为三个主要区域:

  • 左侧窗格 包含文件中定义的所有符号列表和列表字符串。可以使用 标签 和 文本 进行过滤。
  • 右侧窗格被称为检查器。它包含有关当前探索区域的上下文信息。
  • 中心部分是汇编语言以及其各种表示的展示位置。

概念

Hopper 的理念是将一组字节(您想要分析的二进制数据)转换为人类可读的内容。

为此,Hopper 将尝试为文件的每个字节关联一个类型。因为手动操作成本太高,Hopper 在加载文件后立即进行自动分析。

 

Hopper 中可用的各种类型包括:

 

  • Data: 当 Hopper 认为某个区域代表常量(例如 int 数组)时,该区域就会被设置为数据类型。
  • ASCII: 以空字符结尾的 C 字符串。
    Code: 一条指令
  • 程序:一旦确定它是由 Hopper 成功重建的方法的一部分,一个字节就会接收到这种类型。
  • Undefined: 这是霍珀尚未探索的领域,
    加载可执行文件后,您可以通过键盘或窗口顶部的工具栏手动更改类型。

工具栏包含您可以设置的每种类型的按钮(D代表数据,A代表ASCII等)。这些字母也是您可以直接使用的键盘快捷键。

 

数据类型具有一些特定的行为:第一次使用此类型时,Hopper 将将该区域转换为字节。如果再次使用它,字节将转换为 16 位整数,然后是 32 位整数,依此类推…

 

随意玩转变换以探索可执行文件:Hopper 提供了一个撤销/重做功能。

显示模式

阅读汇编语言有点困难,在某些情况下也很无聊。为了帮助您,Hopper 可以使用不同种类的代码表示。

 

大多数需要构建一个过程,因为过程包含有关代码结构的其他信息,如基本块或堆栈使用。

 

当前模式可以使用工具栏进行更改:

组装

第一种模式是装配模式。Hopper 按顺序打印汇编代码的行。这是大多数反汇编器提供的功能。

第一列(蓝色数字)表示指令地址,然后是指令助记符及其操作数(或参数)。作为一种选项,在应用程序的首选项中,您可以选择在地址和指令助记符之间打印指令编码。

 

在边缘,您会看到一些彩色箭头。这些箭头代表跳转指令的可能目的地。例如,在上面的截图中,地址0x100002d820x100002db4之间的蓝色箭头表示指令je0x100002d82处可能会跳转到地址0x100002db4,如果条件满足的话。当指令跳转到更大的地址(向前跳转)时,箭头会用蓝色绘制。如果跳转向前,箭头会用红色绘制。

 

请注意,在此表示中,如果您单击红色列,将在相应地址处设置断点,如果您单击蓝色列,将设置书签。

 

控制流程图

CFG 模式代表了一种更有结构化的过程。

 

相同的行为也适用于左右键

在右侧面板(检查员),您会找到一个专门用于模式的部分。 控制流图 组件显示当前过程的较小表示,称为 迷你地图。 每个方块代表一个基本块,线条表示它们的连接。 其中一个方块填充为蓝色:这是包含光标的基本块。 浅灰色方块代表在主要部分绘制的当前方法部分。 您可以通过直接在此地图中单击来移动视口。

图的节点可以被修改。例如,当您认为它们密切相关时,可以对其中一些进行分组。选择节点,然后单击检查器中的Group Nodes按钮。您还可以为给定节点设置自定义背景颜色,或编辑打印文本。

伪代码

在这种模式下,Hopper 将生成一个伪代码,它在功能上等同于原始的 CPU 指令,但更像是 Objective-C 方法。

这显然是阅读您正在分析的代码的最简单方式,但您应该记住没有什么是魔法:有时候,无法构建一个完美的伪代码表示过程,有些部分可能会消失,因为 Hopper 错误地认为代码是不可达的(也称为死代码)。为了缓解这个问题,您可以尝试切换视图顶部的相应复选框。

Hex 模式

这种模式允许您直接查看文件的字节。

第一列表示文件中的偏移量,其他列表示每个字节。当您将光标放在一个字节上时,您会注意到选择会自动向左和向右扩展。事实上,Hopper 对文件的了解比任何普通的十六进制编辑器都要多,例如,在上一个屏幕截图中,Hopper 知道光标位于指令内部,并选择了所有字节。

 

如果您双击字节,您可以更改其值。在某些情况下,这可能会破坏底层结构。例如,如果您的光标位于指令中,则该指令将自动销毁,并且相关的 Hopper 类型将回退到未定义状态。此外,如果该指令是某个过程的一部分,则该过程将被销毁。无论如何,请记住您始终可以撤消更改,因为 Hopper 提供了撤消/重做功能。

 

此表示中的列数取决于窗口的宽度;这是默认行为,但可以在应用程序首选项中更改。例如,您可以强制 Hopper 始终显示 16 列,无论窗口的宽度是多少。

段落和部分

一个可执行文件被分割成称为segmentssections的较小数据片段。

当操作系统加载可执行文件时,其字节的某些部分将映射到内存中。映射到内存中的文件的每个连续部分称为。这些段被分割成称为的较小部分,这些部分将接收各种访问属性。

您可以使用导航> 显示段列表导航> 显示部分列表菜单项浏览这些对象。

符号、标签和字符串

因为要记住每个代码片段所在的可执行文件的地址太困难,您可以将名称或符号分配给这些地址。

要为地址命名,只需将光标放在地址上,然后按下N。对话框将弹出:只需输入您想设置的名称即可。

符号列表可在窗口左侧窗格中访问。

段落和部分

一个可执行文件被分割成称为segmentssections的较小数据片段。

当操作系统加载可执行文件时,其字节的某些部分将映射到内存中。映射到内存中的文件的每个连续部分称为。这些段被分割成称为的较小部分,这些部分将接收各种访问属性。

您可以使用导航> 显示段列表导航> 显示部分列表菜单项浏览这些对象。

使用搜索字段,您可以过滤下面列出的符号。Hopper 使用一种正则表达式来过滤列表;首先,它将呈现完全包含您输入的术语的项目。然后,在下面,列出包含一个文本插入、两个插入等的符号列表。这就是我所说的模糊搜索,这种行为可以在应用程序的首选项中禁用。

 

您可以使用标签来更有效地过滤符号列表。标签是可以放在地址、过程的基本块或整个过程上的文本信息。您可以打开标签范围元素,查看当前文档中存在的所有标签。如果选择一个标签,只有包含此标签的过程将被列出。请注意,如果关闭标签范围项目,则过滤器将重置为所有标签

 

一个有趣的事情要注意的是,在可执行文件的加载过程中,许多标签是自动生成的。例如,每个入口点都将接收一个特定的入口点标签,每个 Objective-C 类的每个实现都将被标记为类(或类别)的名称。这使您能够快速浏览 Objective-C 编写的代码!

 

您可以选择显示文件中包含的字符串。在此模式下,只显示 ASCII 字符串,标签范围不起作用。

导航栏

在组件的正上方,您会找到导航栏。

这个工具栏用于快速导航到文件中。使用颜色方案来指示文件字节的各种类型。

  • 蓝色部分代表代码,
  • 黄色 部分代表程序,
  • 绿色部分代表 ASCII 字符串,
  • 紫色部分代表数据
  • 灰色部分未定义。

一个小的红色箭头指示当前光标的位置。

使用检查员

这是您可以在检查器中找到的组件的快速概述:

  • 指令编码

此组件显示当前指令的字节。如果当前处理器具有多个 CPU 模式(例如 ARM 处理器系列的 ARM 和 Thumb 模式),您将看到一个弹出菜单,让您在当前地址更改 CPU 模式。

  •  格式

这个组件用于更改指令操作数的显示格式。您可以在有符号/无符号十六进制十进制八进制地址等之间进行选择。

  • 评论

您可以在给定地址关联文本注释。使用此组件编辑此注释。

  • 颜色和标签

这个组件允许您将标签与地址、过程的基本块或过程关联起来。这些标签对于在文件中高效导航非常有用。

您甚至可以在地址上添加一些颜色,以便快速且直观地区分可执行文件的各个部分。

  • 参考资料

这是一个非常重要的组件;它显示一个指令可以引用另一个指令或一段数据的所有引用。它还包含另一种方式的引用,即引用这个指令的其他指令。如果 Hopper 执行的分析没有找到任何引用,您甚至可以手动添加自己的引用。

十六进制编辑器

如前所述,Hopper 提供了一个十六进制编辑器。编辑器与汇编语言视图同步,自动突出显示当前指令的字节。

双击字节以修改它。如果出错,可以使用撤销/重做功能。

汇编程序

嵌入式汇编程序可以从 Hopper 的修改 > 汇编指令…菜单中调用。

您还可以使用修改 > NOP 区域菜单,将当前选择的指令替换为 NOP 指令。