- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
8.4 导入新的结构体
逐渐熟悉 IDA 的结构体创建和编辑功能后,你可能希望找到一种更加简单的操作方法。在创建新结构体方面,IDA 确实提供了一些捷径。IDA 能够解析 C(而非 C++ )数据声明,以及整个 C 头文件,并自动为在这些声明或头文件中定义的结构体创建对应的 IDA 结构体。如果你碰巧拥有你正进行逆向工程的二进制文件的源代码,或者至少是头文件,那么,你就可以让 IDA 直接从源代码中提取出相关结构体,从而节省大量时间。
8.4.1 解析 C 结构体声明
使用 View▶ Open Subviews▶ Local Types (查看▶打开子窗口▶本地类型)命令,可以打开 Local Types 子窗口,其中列出了所有解析到当前数据库中的类型。对于新数据库,“Local Types ”窗口最初是空的,但是,该窗口能够通过 INSERT 键或上下文菜单中的 Insert 选项解析新的类型。得到的类型输入对话框如图 8-11 所示。
图 8-11 Local Types 输入对话框
解析新类型时发生的错误将在 IDA 的输出窗口中显示。如果类型声明被成功解析,“Local Types”窗口将列出该类型及其相关声明,如图 8-12 所示。
图 8-12 Local Types 窗口
请注意,IDA 解析器使用 4 字节的默认结构体成员对齐方式。如果你的结构体需要其他对齐方式,你可以包括该对齐方式,IDA 认可使用 pragma pack
指令来指定所需的结构体成员对齐方式。
添加到 Local Types(本地类型)窗口中的数据类型不会立即在 Structures(结构体)窗口中出现。有两种方法可以将本地类型声明添加到 Structures 窗口中。最简单的方法是在相关本地类型上单击鼠标右键,并选择 Synchronize to idb。或者,由于每个新类型均被添加到标准结构体列表中,因而也可将新类型导入到 Structures 窗口中,如 8.5 节所述。
8.4.2 解析 C 头文件
要解析头文件,可以使用 File▶ Load File ▶ Parse C Header File (文件▶加载文件▶解析 C 头文件)选择你想要解析的头文件。如果一切正常,IDA 会通知你 Compilation successful(编译完成)。如果解析器遇到任何问题,IDA 将会在输出窗口中显示错误消息。
IDA 会将所有被成功解析的结构体添加到当前数据库的标准结构体列表中(具体地说,是列表的末尾)。如果新结构体的名称与现有结构体的名称相同,IDA 会用新结构体布局覆盖原有结构体定义。除非你明确选择添加新的结构体,否则,新结构体不会出现在 Structures 窗口中。我们将在 8.5 节讨论如何在 Structures 窗口中添加标准结构体。
在解析 C 头文件时,记住以下要点会有所帮助。
虽然内置解析器确实遵循
pack
杂注,但它不需要和你的编译器一样,默认对结构体成员进行对齐。默认情况下,解析器会建立 4 字节对齐的结构体。解析器理解 C 预处理器
include
指令。为解析include
指令,解析器会搜索包含被解析文件的目录,以及 Options▶ Compiler(选项▶编译器)配置对话框中的任何 Include 目录(包含)。解析器只能理解 C 标准数据类型。但是,解析器还能够理解预处理器
define
指令和 Ctypedef
语句。因此,如果解析器之前遇到过适当的typedef
,它将能够正确解析unit32_t
之类的类型。如果你没有源代码,那么你会发现,使用文本编辑器以 C 表示法迅速定义一个结构体布局,并解析得到的头文件或把声明粘贴为一个新的本地类型,会比使用 IDA 烦琐的手动结构体定义工具更加方便。
只有当前数据库能够使用新创建的结构体。如果想要在其他数据库中使用新结构体,你必须重新创建该结构体。在本章后面讨论 TIL 文件时,我们将讨论一些简化上述步骤的方法。
一般而言,要最大限度地提高成功解析一个头文件的几率,你需要使用标准 C 数据类型,并尽可能地减少使用 include
文件,从而最大程度地简化结构体定义。记住,在 IDA 中创建结构体时,正确布局最为重要。正确的布局更多地取决于每个字段的正确大小和结构体的正确对齐,而不只是对每个字段都使用正确的类型。换句话说,如果你需要用 int
替换所有的 unit32_t
,以正确解析一个文件,那么,就请立即这样做吧!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论