实现逆向工程——逆向工程工具快速上手

94 阅读6分钟

工具在生活的各个方面都扮演着至关重要的角色。我们日常生活中常用手机计算器来进行基本的数学运算。在手机计算器出现之前,我们使用硬件计算器来完成同样的工作。计算器是我们用来执行特定任务的简单工具示例。对于简单的运算,我们可以口算,但遇到复杂计算时,就必须借助工具。同样地,逆向工程领域也有大量可用工具,有商业付费的,也有免费或开源的。要选对工具,就需要扎实的理论知识作为支撑。

如果你在网上搜索“逆向工程工具”,会发现五花八门的选择。基于自身需求选对工具非常重要。本章我们首先介绍逆向工程中“工具”这一概念,然后讲解这些工具在逆向过程中的重要性,并重点介绍那些易于获取、且免费可用的工具。

章节结构

本章将涵盖以下主题:

  • 逆向工程中工具的重要性
  • 逆向工程工具概览
  • 可移植可执行文件(PE)编辑器
  • 反汇编器
  • 调试器

学习目标

本章目标是理解“工具”在逆向工程中的基本概念及其必要性;接着介绍一些用于阅读二进制格式的工具;最后介绍可移植可执行文件(PE)编辑器、反汇编器和调试器的相关概念。

逆向工程中工具的重要性

当我们用 C/C++ 等高级语言编写程序并编译时,源代码会被转换为 CPU 可理解的一串字节——即机器码。机器码对人类而言难以直观理解。为了让它更易读,我们使用“反汇编器”工具,将机器码翻译为可读的汇编代码(assembly code),呈现为汇编语言的语法格式。下图将帮助你终身理解这一概念:

image.png

逆向工程可以在没有应用程序或程序源代码的情况下,重建其应用逻辑。恶意软件研究人员正是基于这一理念来执行逆向工程任务。

下面我们将介绍逆向工程所需的一些工具,并在本书中贯穿使用。

逆向工程工具

为了便于理解,逆向工程工具分为不同类别:PE 编辑器、反汇编器和调试器。每一类别中都有免费或开源的工具可选,它们在基本功能上相同,仅在某些特性上略有差异。我们将重点关注具有图形用户界面(GUI)的免费开源工具,这些工具将在本书中反复使用。

可移植可执行文件编辑器(Portable Executable Editors)

PE(Portable Executable)是 Windows 标准的可执行文件格式。所有 Windows 可执行文件均采用此格式。动态链接库(DLL)、组件对象模型(COM)文件,以及 .NET 可执行文件,均使用 PE 文件格式。下图展示了 PE 的基本结构:

image.png

所有 PE 文件以 DOS 头开始,随后是 PE 头(也称为 NT 头),紧接着是可执行文件中常见的各个节。常见的节包括:

  • .text:存放实际的二进制可执行代码。
  • .bss:表示未初始化数据段。
  • .rdata:存放只读数据,如常量、字符串等。
  • .rsrc:资源节,用于存放资源信息。
  • .edata:导出数据节,包含导出函数的信息。
  • .idata:导入数据节,包含导入目录、导入地址表及导入函数的信息。
  • .debug:最初用于存放调试信息的节。PE 文件也支持与之配套的 .dbg 调试文件。

要查看并编辑上述所有信息,可以使用如下工具:

CFF Explorer

该工具可在不破坏 PE 文件内部结构的前提下,查看并编辑 PE 文件。它不仅被逆向工程师使用,也常被应用程序开发者采用。

image.png

我们将在后续章节中使用 CFF Explorer 来编辑 PE 文件。

反汇编器

正如前面所述,机器码对人类不可读,需要使用工具将其转换为人类可读格式。反汇编器(Disassembler)正是完成此任务的工具,将机器码转换为汇编代码。以下是本书中使用的一些反汇编器。

Ghidra

这是由美国国家安全局(NSA)开发的开源工具,免费用于逆向工程。其源代码于 2019 年 4 月 4 日发布。恶意软件研究人员和逆向工程师常用它来分析恶意软件并发现应用程序中的漏洞。

image.png

Cutter

Cutter 是 Radare2 逆向工程框架的开源图形界面。Radare2 是一款命令行逆向工程工具,可在不同平台和架构上对二进制格式进行静态和动态分析。Cutter 则为 Radare2 提供了用户友好的图形界面。

image.png

调试器

当我们运行一个应用或二进制程序时,可以查看其运行状态。调试器能够在程序加载到内存并执行时,呈现其动态状态。有些漏洞在开发或静态执行时无法被捕获,此时就需要使用调试器运行代码,同时监视寄存器、内存地址和其他参数。

本书中将大量使用以下调试器:

x32dbg

调试器分为 32 位和 64 位两个版本。x32dbg 用于调试 x86(32 位)二进制程序;对应的 64 位版本为 x64dbg,用于调试 x64(二进制)程序。下图展示了 x32dbg 的四个主要区域:

image.png

如上图所示,这四个区域分别是:

  1. 反汇编或 CPU 指令:展示将机器码转换而来的汇编代码。

    • 第一列:指令的内存地址。
    • 第二列:操作码(Opcode)。
    • 第三列:汇编指令。
    • 第四列:对指令的注释。
  2. 寄存器与标志:显示在二进制动态分析过程中,各寄存器的值及各标志位的状态,用于反映当前处理器的运行情况。

  3. :如前章所述,栈遵循“后进先出”(LIFO)原则——最后压入(push)的数据,最先弹出(pop)。栈从高地址向低地址增长。

  4. 内存转储:类似十六进制编辑器,显示内存中二进制的十六进制和 ASCII 原始数据。双击某个地址即可修改该内存单元的值。

结论

本章介绍了在全书中将频繁使用的各种逆向工程工具,并阐述了反汇编器与调试器的区别,强调了工具在逆向工程中的重要性,列举了若干 PE 编辑器、反汇编器和调试器。下一章,我们将深入讲解汇编指令,以帮助阅读和理解反汇编所得的汇编代码。