跳转至

通过 Ghidra 分析 GameCube DOL

此通道通过 Ghidra 导入 32 位大端 PowerPC GameCube/Wii DOL 镜像。 它不会执行该镜像。DOL 是一种无魔数的无头格式,因此 REA 永远不会自动检测到它:调用者必须显式选择它。

仅接受缓存 MEM1 窗口 0x80000000..0x81800000。Wii MEM2 和未缓存别名不在该通道范围内。

不支持:小数据锚点(r2/r13)、REL、RPX,以及 IDA 或 Hopper 支持。参见尚不支持。

选择格式

CLI:

rea inspect /absolute/path/to/main.dol --target-format gamecube-dol --provider ghidra --json
rea function /absolute/path/to/main.dol 0x80003130 --target-format gamecube-dol --provider ghidra --json

MCP,使用现有的 open_binary 工具:

{
  "path": "/absolute/path/to/main.dol",
  "provider_id": "ghidra",
  "format": "gamecube-dol"
}

架构来自 DOL 头部(powerpc)。不要在使用 gamecube-dol 时传入 architecture;它会被拒绝。entry_point 是可选的, 如果提供,则必须等于头部中的入口。

省略 format 永远不会将文件作为 DOL 导入。DOL 不执行检测。

导入过程

REA 在接收时读取 256 字节的 DOL 头部。它检查每个节的文件范围 和加载地址。它记录 BSS/数据重叠,并一次性计算精确的未初始化 BSS 间隙。 格式错误的头部会在 Ghidra 启动前被拒绝。

然后 Ghidra 分两步运行:

  1. 标准 BinaryLoader 将整个文件映射到基址 0x0, 其中 -processor 和 -cspec 取自下面的语言选择。
  2. 预脚本 bridge/ghidra/ReaGhidraPrepareDol.java 读取一个节文件, 该文件由 REA 根据解析后的头部写出,并带有版本化的集合计数。它为每个 已使用的文本节和数据节在其加载地址处创建一个已初始化块, 文件字节来自该节的文件偏移。文件级块在创建节块之前被移除。 文本为读-执行,数据为读-写。它设置入口点并将入口标记为 __start。

头部标记为未使用的节不会被映射。256 字节的头部以及 节之间的任何字节也不会被映射。

BSS

DOL 有一个 BSS 范围,它并不总是与数据节不相交。 域解析器计算 BSS 中未被任何数据节覆盖的部分。预脚本和 加载镜像证明都会使用这些解析后的范围。预脚本仅在这些间隙中 创建未初始化的读-写块。在 BSS 与数据槽重叠的地方,该槽 保留其文件字节。重叠的槽索引由解析器报告。

绑定语言

默认语言是 PowerPC:BE:32:default,编译器规范为 default, 随 Ghidra 一起提供。加载镜像证明会检查 Ghidra 报告的语言, 而不仅仅是请求的语言。

可选的 Gekko/Broadway 覆盖

REA_GHIDRA_LANGUAGE_ID=PowerPC:BE:32:Gekko_Broadway 选择 Gekko/Broadway 变体。该语言不在默认 Ghidra 中。它来自 GameCubeLoader 扩展,由 Cuyler 编写,采用 Apache-2.0 许可。该扩展附带 ppc_gekko_broadway.ldefs,位于其 data/languages 目录下,并且必须 安装到 Ghidra 安装目录的 Ghidra/Extensions 目录中。标准通道 永远不会要求它。

任何其他语言 ID 必须以 PowerPC:BE:32: 开头。其他语言会被 带有特定约束地拒绝。

配对单精度限制

默认的 PowerPC:BE:32:default 语言不会解码 Gekko 和 Broadway 新增的配对单精度(paired-single)指令。这些字会被解码为错误或未定义 指令。请使用 Gekko 覆盖来解码它们。

验证

源端拥有的测试夹具由 tests/conformance/c/ppc.c、 tests/conformance/c/dol.c、tests/conformance/ghidra/ppc-probe.S 和 链接器脚本 tests/conformance/ghidra/dol-fixture.ld 构建。它由 tests/conformance/ghidra/dol-fixture.mjs 转换为 DOL。其文本位于 0x80003100, 其单个 BSS 范围与数据槽 1 重叠,并留下一个间隙。该夹具永远不会被执行。 真实的 GameCube 或 Wii 游戏镜像永远不会被使用。

GHIDRA_INSTALL_DIR=/absolute/path/to/ghidra npm run verify:ghidra:dol

该通道需要与 PowerPC ELF 通道相同的工具链:REA_PPC_CLANG、 REA_PPC_READELF 和 LLD。一个独立的 DOL 头部读取器和 GNU readelf (在源 ELF 上运行)会在 Ghidra 启动前检查节表、文件字节、入口和 BSS 间隙。 这些检查永远不会使用 REA 的解析器。

导入后,该通道检查加载镜像证明(verified)、 绑定语言、__start 入口过程、对叶函数的直接调用、 反编译,以及数据、尾部、标记和 BSS 间隙地址处的字节。 它还检查 CLI 身份。

Gekko 传递仅在 PowerPC:BE:32:Gekko_Broadway 位于 Ghidra 安装目录的语言目录中时运行,该目录与 REA 用来接纳 REA_GHIDRA_LANGUAGE_ID 的目录相同。只存在于用户扩展中的语言 (位于 ~/Library/ghidra 下)不会被接纳,因此该通道会打印 skipped: PowerPC:BE:32:Gekko_Broadway (not in the Ghidra installation catalog that REA admits); stock lane still verified 并且仍然在标准检查上成功。

ELF 通道(npm run verify:ghidra:ppc)是独立的。参见 通过 Ghidra 分析 PowerPC ELF。

尚不支持

  • 小数据锚点:不会从 DOL 头部注入 r2 和 r13。
  • REL(可重定位模块)和 RPX(Wii U)不被接纳。
  • IDA 和 Hopper 拒绝 gamecube-dol。Ghidra 是唯一的提供者。
  • 光盘镜像(ISO/GCM)不受支持。请传入提取出的 DOL 文件。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea