- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
14.2 IDA 输出文件与补丁生成
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 文件中的信息。
图 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 。
将你想要修补的 PE 文件加载到 IDA 中,确保清除加载程序对话框中的 Make imports section (创建导入节)选项。
运行包含的 pe_sections.idc 脚本,将构成最初二进制文件的所有节映射到新数据库中。
对数据库进行必要的更改。
- 运行 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论