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