返回介绍

8.4 导入新的结构体

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

逐渐熟悉 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 所示。

enter image description here

图 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 指令和 C typedef 语句。因此,如果解析器之前遇到过适当的 typedef ,它将能够正确解析 unit32_t 之类的类型。

  • 如果你没有源代码,那么你会发现,使用文本编辑器以 C 表示法迅速定义一个结构体布局,并解析得到的头文件或把声明粘贴为一个新的本地类型,会比使用 IDA 烦琐的手动结构体定义工具更加方便。

  • 只有当前数据库能够使用新创建的结构体。如果想要在其他数据库中使用新结构体,你必须重新创建该结构体。在本章后面讨论 TIL 文件时,我们将讨论一些简化上述步骤的方法。

一般而言,要最大限度地提高成功解析一个头文件的几率,你需要使用标准 C 数据类型,并尽可能地减少使用 include 文件,从而最大程度地简化结构体定义。记住,在 IDA 中创建结构体时,正确布局最为重要。正确的布局更多地取决于每个字段的正确大小和结构体的正确对齐,而不只是对每个字段都使用正确的类型。换句话说,如果你需要用 int 替换所有的 unit32_t ,以正确解析一个文件,那么,就请立即这样做吧!

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

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

发布评论

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