返回介绍

14.2 IDA 输出文件与补丁生成

发布于 2024-10-11 21:05:45 字数 4125 浏览 0 评论 0 收藏 0

File ▶Produce File 菜单是 IDA 的一个更加有趣的菜单选项。使用这个菜单中的选项,IDA 能够生成 MAP、ASM、INC 、LST 、EXE 、DIF 和 HTML 文件。其中许多选项听起来很有吸引力,下面逐一介绍。

14.2.1 IDA 生成的 MAP 文件

.map 文件描述二进制文件的总体结构,包括与构成该二进制文件的节有关的信息,以及每节中符号的位置。在生成 .map 文件时,IDA 会要求你为你要创建的文件取名,并说明你想要存储在.map 文件中的符号的类型。MAP 文件选项对话框如图 14-5 所示,你可以从中选择你希望包含在.map 文件中的信息。

enter image description here

图 14-5 MAP 文件生成选项

.map 文件中的地址信息用逻辑地址表示。逻辑地址使用一个段号和一个段偏移量描述符号的位置。一个简单.map 文件的前几行内容如下所示。从中我们可以看到 3 个段及许多符号中的前两个符号。 _fprint 的逻辑地址表明它位于第一个段( .text )的字节偏移量为 69h 的位置。

Start             Length        Name                   Class  
 0001:00000000    000008644H    .text                  CODE  
 0002:00000000    000001DD6H    .rdata                 DATA  
 0003:00000000    000002B84H    .data                  DATA  

Address            Publics by Value  

 0001:00000000          _main  
 0001:00000069          _fprintf

IDA 生成的 MAP 文件与 Borland 的 Turbo Debugger 兼容。在调试可能已经去除符号的二进制文件时,.map 文件可帮助我们恢复符号名称,这是此类文件的主要用途。

14.2.2 IDA 生成的 ASM 文件

IDA 能够从当前数据库生成一个.asm 文件。这样做的主要目的是创建一个能够被汇编器处理的文件,以重建底层二进制文件。IDA 会设法收集足够的信息(包括结构体布局)以成功汇编这个文件。是否能够成功汇编生成的.asm 文件,这取决于许多因素,但其中最重要的因素在于你使用的汇编器是否理解 IDA 采用的语法。

目标汇编语言语法由 Options▶General 菜单 Analysis 选项卡下的 Target assembler 设置决定。默认情况下,IDA 会生成一个表示整个数据库的汇编文件。但是,你可以通过单击并拖动,或使用“SHIFT+上箭头键”或“SHIFT +下箭头键”滚动并选择你希望汇编的区域,从而限定列表的范围。在控制台版本的 IDA 中,你可以使用 Anchor (ALT+L)命令在一个选择区域的起始位置设置一个锚点,然后使用箭头键扩充这个区域。

14.2.3 IDA 生成的 INC 文件

INC (表示包含)文件描述数据结构和枚举数据类型的定义。基本上,这个文件的内容与“结构体”窗口的内容类似,只是其形式更适合汇编器处理。

14.2.4 IDA 生成的 LST 文件

LST 文件不过是 IDA 反汇编窗口内容的文本文件存储形式。如前面介绍 ASM 文件时所述,你可以选择一个你想要转储的地址范围,以限定生成的列表的范围。

14.2.5 IDA 生成的 EXE 文件

虽然这个菜单项是最具潜力的菜单项,但它也是缺陷最大的菜单项。许多文件类型都不能使用这个菜单项。你可能会收到这样一条错误消息:This type of output file is not supported (不支持这种输出文件类型)。

尽管对 IDA 用户而言,这是一项理想的功能,但一般来说,要想从 IDA 数据库重新生成可执行文件,难度非常大。保存在 IDA 数据库中的信息,主要由构成最初的输入文件的各节中的内容组成。但是,许多时候,IDA 并不处理输入文件的每一节,因此,在将文件加载到数据库中时,某些信息将会遗失,这使得我们无法从数据库生成可执行文件。举一个最简单的例子:默认情况下,IDA 并不加载 PE 文件的资源节(.rsrc ),因此,你不可能通过数据库恢复资源节。

其他情况下,IDA 处理与最初的二进制文件有关的信息,但你并不能轻易访问它们的原始形式。这些信息包括符号表、导入表和导出表,你需要付出相当大的努力才能正确重建这些信息,以生成一个真正能够运行的可执行文件。

为了向 IDA 提供生成 EXE 文件的功能,Atli Mar Gudmundsson 开发了 pe_script1 。这是一组供 PE 文件使用的 IDA 脚本。其中一个脚本名为 pe_write.idc ,可用于在现有数据库之外转储一个正在运行的 PE 映像。如果想要修补一个 PE 文件,使用脚本时完成的步骤如下所示。

1. 参见 http://www.hex-rays.com/idapro/freefiles/pe_scripts.zip

  1. 将你想要修补的 PE 文件加载到 IDA 中,确保清除加载程序对话框中的 Make imports section (创建导入节)选项。

  2. 运行包含的 pe_sections.idc 脚本,将构成最初二进制文件的所有节映射到新数据库中。

  3. 对数据库进行必要的更改。

  4. 运行 pe_write.idc 脚本,将数据库内容转储到一个新的 PE 文件中。

第 15 章将讨论使用 IDC 编写脚本。

14.2.6 IDA 生成的 DIF 文件

IDA DIF 文件是一个纯文本文件,其中列出了一个 IDA 数据库中所有被修改的字节。如果你希望根据对 IDA 数据库所做的更改来修补最初的二进制文件,DIF 文件是最有用的文件格式。这种文件格式相当简单,如下面的.dif 文件所示。

This difference file is created by The Interactive Disassembler 

dif_example.exe  
000002F8: 83 FF  
000002F9: EC 75  
000002FA: 04 EC  
000002FB: FF 68

这个文件的第一行是注释,第一行是最初的二进制文件的名称,随后则是文件中被修改的字节列表。每一行都指出被修改的字节的文件偏移量(而非虚拟地址)、字节的原始值以及字节在数据库中的当前值。在这个特例中,dif_example.exe 的数据库中有 4 个位置被修改,在最初的文件中,这些位置对应的字节偏移量为 0x2F8~0x2FB 。编写一个程序来解析 IDA 的.dif 文件,并应用对最初的二进制文件所做的更改,生成一个修补版本的二进制文件,这并不是一个复杂的任务。本书的配套网站2 上提供了这样一个实用工具。

2. 参见 http://www.idabook.com/chapter14/ida_patcher.c

14.2.7 IDA 生成的 HTML 文件

IDA 利用 HTML 的标记功能生成彩色的反汇编代码清单。基本上,IDA 生成的 HTML 文件就是一个添加了 HTML 标记的 LST 文件,它生成的列表的颜色与真正的 IDA 反汇编窗口使用的颜色类似。然而,IDA 生成的 HTML 文件并不包含任何超链接,因此,导航这个文件并不比使用标准的文本列表容易。例如,作为一项有用的特性,我们可以给所有名称引用添加超链接,这样,跟踪名称引用就变得和单击一个链接一样简单。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文