通过 Ghidra 进行 PowerPC ELF 分析¶
该通道将原生 ELF 分析扩展到 32 位大端 PowerPC;它不执行 PowerPC 代码。这是 #1741 的第一个里程碑。GameCube/Wii DOL 可执行文件由 GameCube DOL 分析 覆盖。PPC64 和其他 PowerPC 变体仍作为单独的后续工作处理。
准入边界¶
ELF EM_PPC(20)保留为提供者无关的 powerpc 家族。目标还会保留类别、字节序、e_type 和原始 e_flags。识别并不表示每个提供者或 PowerPC 变体都受支持。EM_PPC64(21)不会被识别为该家族。
Ghidra 通道接纳 ELF32 ET_EXEC 大端格式。ELF64、小端、可重定位和共享对象会被拒绝,并带有特定的不支持约束。EF_PPC_EMB 声明了嵌入式变体,同样会被拒绝;其余 e_flags 位仅声明重定位约定,不会改变指令解码。
绑定语言¶
Ghidra 的 ELF 加载器会为 e_flags 为 0 的普通 EM_PPC 头选择 PowerPC:BE:32:e500:default。e500 是嵌入式 Book-E 变体,其 SPE 单元取代了经典浮点单元,因此会误解读普通的 750 家族代码。头部中没有任何信息能区分这两者。
因此,该通道使用 PowerPC:BE:32:default 和编译器规范 default 导入,将该选择以 language_selection: "provider-pinned-v1" 的形式提交到分析配置文件中,并在导入后检查 Ghidra 报告的语言。通过 REA_GHIDRA_LANGUAGE_ID(以及可选的 REA_GHIDRA_COMPILER_SPEC_ID)设置的不同语言会替换通道默认值,并照常根据已安装的语言目录进行准入;例如,对于真正的 e500 代码,可使用 PowerPC:BE:32:e500。
PowerPC 头部事实会被提交到分析配置文件中,因此解释方式的变更会使绑定配置文件的快照失效。支持通道的身份与文件身份分开独立版本化。证据、生命周期输出和已保存的快照都会保留 powerpc 家族。Hopper 和 IDA 适配器不会隐式获得 PowerPC 支持。Windows Ghidra P0 仍仅限 PE x86/x86-64。
使用¶
在受支持的 Linux/macOS 主机上,使用调用方自行安装的 Ghidra 和兼容 JDK:
rea analyze /absolute/path/to/ppc.elf --provider ghidra --json
rea function /absolute/path/to/ppc.elf function_name --provider ghidra --json
MCP 使用现有工具,包括采用绝对路径的 open_binary 和 provider_id: "ghidra"。不会引入 PowerPC 专属的工具目录或模拟器。
验证¶
源码自有的无依赖测试夹具为 tests/conformance/c/ppc.c。可选的跨目标通道需要调用方提供支持 PowerPC 目标的 Clang、LLD、GNU readelf、Ghidra 及其兼容 JDK;普通的主机原生检查不会获取这些工具。REA_PPC_CLANG 用于选择 Clang,REA_PPC_READELF 用于选择 GNU readelf(例如 macOS 上的 /opt/homebrew/opt/binutils/bin/readelf)。这些是测试时的先决条件,而非 REA 运行时提供者。
该通道为 750 家族内核(-mcpu=750)编译该测试夹具,并且从不执行它。GNU readelf 独立提供头部事实和符号地址,会在提供者启动前与生产环境的 REA 目标解析器进行比较。其版本、受限的命令输出和所选工具路径都会保留在验证报告中。解析器刻意只识别该测试夹具的 GNU 输出,对缺失、歧义或意外字段予以拒绝,而不是替换为默认值。
现有公共 MCP 操作会检查 Ghidra 的观察到的语言和编译器规范,以及已加载文件的哈希;e500 导入会使该通道失败。源仓库自有的 ppc-probe.S 提供固定的 addi 和条件分支编码:验证会检查字节、长度、立即数和直接目标地址,而不依赖反编译器变量名。全局变量和字符串字节会在独立报告的符号地址处进行检查。
CLI/MCP 发现与反编译、直接调用、目标/配置文件/Evidence 身份、快照往返以及最终进程清理仍被覆盖。伪代码存在性只是活性检查,并非语义等价性的证明。指令解码和读取器一致性并不建立运行时或完整浮点语义。解析器/配置文件测试是更窄的检查,不能替代这次真实提供者运行。请报告实际运行的通道,并将未执行的验证保留为待处理状态。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea