菜单

数据类型编辑器

相关源文件

Ghidra中的数据类型编辑器提供了一个强大的界面,用于创建和修改复合数据类型,特别是结构体和联合体。这些编辑器允许用户定义数据结构的布局、管理组件以及可视化位级表示。本页面将重点介绍结构体和联合体编辑器的内部架构和功能。

有关数据类型管理器系统的整体信息,请参阅数据类型管理器插件

编辑器架构

数据类型编辑器遵循模型-视图-提供者 (Model-View-Provider) 模式,其中包含处理编辑过程中不同方面的组件的层次结构。

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorModel.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldPlacementComponent.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java

编辑器组件

数据类型编辑器包含几个关键的界面组件

组件表

组件表是查看和修改结构体或联合体组件(字段)的主要界面。

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java550-627 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java42-106 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java54-116

信息区

信息区显示并允许编辑关于结构体或联合体的元数据。

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java61-87 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java647-751

位级视图

位级视图提供位布局的可视化,对于位域特别有用。

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldPlacementComponent.java78-183 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java136-226

编辑操作

数据类型编辑器支持多种用于修改结构体和联合体的操作

组件管理

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java517-599 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java376-441 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java159-637

位域管理

编辑器包含用于在结构体中创建和编辑位域的专门功能

来源:Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java84-565 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldPlacementComponent.java464-534 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/AddBitFieldAction.java Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/EditBitFieldAction.java

编辑器模型

编辑器模型管理结构体和联合体的底层数据及操作

模型层级结构

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeViewerModel.java40-189 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorModel.java49-160 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java32-102 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java38-68 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java51-77 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackEditorModel.java48-76

数据管理流程

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorModel.java134-235 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeViewerModel.java175-213 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeViewerDataTypeManager.java

结构体和联合体编辑器的区别

结构体编辑器和联合体编辑器之间的主要区别在于:

功能结构体编辑器联合体编辑器
偏移量列存在 - 显示组件的偏移量不存在 - 所有组件都在偏移量 0 处
组件添加可以在不同的偏移量处添加组件所有组件都重叠在偏移量 0 处
大小计算大小是组件大小的总和(包含对齐)大小是最大的组件大小
位域支持位域有限的位域支持
组件移动可以将组件向上/向下移动有限的移动能力

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/StructureEditorModel.java38-68 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnionEditorModel.java51-77 Ghidra/Features/Base/src/main/help/help/topics/DataTypeEditors/StructureEditor.htm38-45

编辑器操作

这些编辑器提供了一套用于操作复合数据类型的操作。

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorTableAction.java33-105 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/UnpackageAction.java38-96 Ghidra/Features/Base/src/main/help/help/topics/DataTypeEditors/StructureEditor.htm54-68

特殊功能

对齐和打包

结构体编辑器支持各种对齐和打包选项。

选项描述
默认对齐使用基于数据组织的默认对齐。
机器对齐使用特定于机器的对齐规则。
显式对齐允许设置特定的对齐值。
启用打包启用时,将删除组件之间的不必要填充。
默认打包使用数据组织的默认打包值。
显式打包允许设置特定的打包值。

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java70-80 Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/compositeeditor/StructureEditorAlignmentTest.java

位域可视化和编辑

位级视图提供了:

  1. 组件位布局的视觉表示。
  2. 不同类型组件的颜色编码区分。
  3. 位域放置和冲突检测。
  4. 交互式编辑功能,包括:
    • 直接选择位进行编辑。
    • 拖放式位域放置。
    • 冲突可视化和解决。

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldPlacementComponent.java83-127 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/BitFieldEditorPanel.java317-434

与 Ghidra 的集成

数据类型编辑器通过数据类型管理器服务与 Ghidra 的其他组件集成。

来源: Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorProvider.java48-75 Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackEditorModel.java98-110

数据类型编辑器是 Ghidra 逆向工程工作流程中的关键组成部分,它允许分析人员定义和修改复杂的数据结构以匹配二进制文件中找到的数据。这些编辑器提供了高级结构编辑和低级位域操作功能,并具有广泛的可视化功能,以帮助理解和正确建模数据布局。