通过 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 工具:
架构来自 DOL 头部(powerpc)。不要在使用 gamecube-dol 时传入
architecture;它会被拒绝。entry_point 是可选的,
如果提供,则必须等于头部中的入口。
省略 format 永远不会将文件作为 DOL 导入。DOL 不执行检测。
导入过程¶
REA 在接收时读取 256 字节的 DOL 头部。它检查每个节的文件范围 和加载地址。它记录 BSS/数据重叠,并一次性计算精确的未初始化 BSS 间隙。 格式错误的头部会在 Ghidra 启动前被拒绝。
然后 Ghidra 分两步运行:
- 标准
BinaryLoader将整个文件映射到基址0x0, 其中-processor和-cspec取自下面的语言选择。 - 预脚本
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 游戏镜像永远不会被使用。
该通道需要与 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