Ghidra 使用一种称为 Pcode 的与处理器无关的表示。在脚本中(Instruction.getPcode())很容易获取并处理它。鲜为人知的是,反编译器会暴露一种更高级别的 Pcode 表示。
将 Pcode 用于与处理器无关的算法或 AI 模型训练时,问题在于低级 Pcode 看起来非常像它源自的汇编语言。低级 Pcode 只是每条汇编指令在 Pcode 语言中的一种实现。
Ghidra 反编译器本质上是一个 Pcode 简化器和 Pcode 到 C 的转换引擎。它简化了较为冗长的低级 Pcode,并将其转换为单静态赋值(SSA)形式(PcodeAST)。然后它将这个 Pcode AST 作为 C 代码输出。反编译器有一个 API 可以输出 PCodeAST。Ghidra 有几个内置脚本使用该 API,但它们是为生成图而编写的(GraphAST.java、GraphASTandFlow.java)。这个脚本则只是以文本形式打印 PCode AST。