Ghidra 的反编译器系统是其核心组件,负责将机器码转换为人类可读的类C代码。它负责分析低级程序表示、构建数据流图、应用转换以简化代码、恢复数据类型,并最终生成可读的高级代码。本文档概述了反编译器的架构、组件以及它们如何协同工作以产生反编译输出。
有关核心反编译过程的详细信息,请参阅Core Decompilation Process。有关处理器架构细节的信息,请参阅Processor Architecture Support。
Ghidra 反编译器被组织为一个转换流水线,逐步将机器码转换为高级类C代码。它以函数为单位进行操作,构建表示函数行为的数据结构,然后逐步将这些结构转换为更抽象的表示形式。
来源:Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.hh145-172 Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.hh74-86 Ghidra/Features/Decompiler/src/decompile/cpp/coreaction.hh74-86
反编译器操作多种核心数据结构,这些结构代表了所分析函数的不同方面。
来源:Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.hh86-100 Ghidra/Features/Decompiler/src/decompile/cpp/varnode.hh213-378 Ghidra/Features/Decompiler/src/decompile/cpp/printc.hh120-190
Varnode 类是反编译器中表示值的基本数据结构。它可以表示:
Varnode 具有以下关键属性:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/varnode.hh213-378 Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc25-247
PcodeOp 类表示中间表示中的操作。每个 PcodeOp 都具有:
PcodeOp 通过它们的输入和输出 Varnode 形成一个有向图,表示函数的数据流。
来源:Ghidra/Features/Decompiler/src/decompile/cpp/op.hh180-290 Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_op.cc22-100
Funcdata 类是与单个函数关联的所有数据结构的中央容器。它管理:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.hh56-100 Ghidra/Features/Decompiler/src/decompile/cpp/funcdata.cc1-200
反编译过程由几个主要阶段组成:
P-code 生成:
SSA 构建 (静态单赋值,Heritage):
转换:
类型分析与传播:
控制流分析:
变量合并:
C 代码生成:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/coreaction.hh34-86 Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.hh16-30 Ghidra/Features/Decompiler/src/decompile/cpp/printc.cc122-140
反编译器应用了大量的转换,将低级 P-code 表示转换为更高级别的构造。这些转换被组织为规则,用于识别特定模式并用简化版本替换它们。
来源:Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.hh86-250 Ghidra/Features/Decompiler/src/decompile/cpp/coreaction.hh87-120 Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc212-266
转换示例包括:
反编译器的类型系统负责管理数据类型及其关系。它支持:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/type.hh175-300 Ghidra/Features/Decompiler/src/decompile/cpp/type.cc126-205 Ghidra/Features/Decompiler/src/decompile/cpp/typeop.cc25-70
反编译的最后阶段是生成人类可读的类C代码。PrintC 类负责:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/printc.hh120-190 Ghidra/Features/Decompiler/src/decompile/cpp/printc.cc122-140
SubvariableFlow 类是一个专门组件,用于处理将较小逻辑值存储在较大容器中的情况 (例如,寄存器中的单个位或字中的一个字节)。它:
这种转换有助于简化那些使用位操作来处理较大存储单元中较小值的代码。
来源:Ghidra/Features/Decompiler/src/decompile/cpp/subflow.hh25-50 Ghidra/Features/Decompiler/src/decompile/cpp/subflow.cc55-150
反编译器通过多个接口与 Ghidra 的其他部分集成:
反编译器接口:
Clang 令牌管理:
程序数据库集成:
扩展点:
来源:Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc34-50
Ghidra 反编译器系统是一个复杂的转换流水线,逐步将机器码转换为可读的类C代码。它通过以下方式运作:
其模块化设计允许自定义和扩展,以支持不同的架构和语言特性,使其成为逆向工程复杂软件的强大工具。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(2abfd4)