跳转至

通过 Ghidra 进行 PSP 静态 ELF 分析

该专项支持构建于 通用 MIPS 支持 之上,用于 #1330。它复用 REA 现有的 CLI/MCP、Ghidra 桥接、Evidence 和快照工作流。Allegrex 指令、 PSP 加载和调用约定仍由 ghidra-allegrex 负责。

初始边界

初始配置文件仅限于 Linux x64、小端序 ELF32 ET_EXEC、 EM_MIPS 以及 PSPSDK 声明 e_flags=0x10a23001。这些位声明的确是 MIPS II、Allegrex、EABI32 和 NOREORDER;但它们并不能证明每条指令的语义。 该配置文件还要求一份经过检查的版本 0 MIPS ABI flags 记录,声明 ISA 级别 2/修订版 0、 32 位 GPR 和 CPR1、无 CPR2、单精度硬浮点(fpAbi=2)、无 ISA 扩展或 ASE、 flags1=1 和 flags2=0。这些是 PSPDEV v20261001 的 GNU readelf 2.44 及其 24 字节节转储独立报告的声明。缺失、未检查、矛盾以及其他产方的声明都会被拒绝。 PSP 配置文件不是通用 MIPS32r2/o32 策略的例外;该独立门槛保持不变。 配置文件修订版 v2 记录了这一修正后的边界。

PRX、可重定位/共享映像、PBP/ISO/CSO 容器、运行时仿真和实时代码覆盖层不在该首个 配置文件范围内。其他主机和标志组合不会被静默接受。文件名不能标识 PSP 目标。

自带兼容扩展

将扩展安装到所选 Ghidra 发行版的 $GHIDRA_INSTALL_DIR/Ghidra/Extensions/ghidra-allegrex 位置,包括其 Module.manifest、extension.properties、语言文件和加载器 JAR。 不会搜索用户主目录下的安装,因为 REA 使用隔离的分析主目录。 REA 从不下载、安装、重建或内置该扩展。

已发布的兼容性实验使用了 Ghidra 12.1.3、扩展 v21.4、 PSPDEV v20261001 和 JDK 21。新的公共提供方结果必须与该历史桥接实验分开报告。 扩展的 version 属性声明的是其兼容的 Ghidra 版本,而不是其发布标签; 该属性必须与所选安装相匹配。其他同版本构建不会仅仅因为通过此元数据检查就被描述为 经过独立验证。格式错误或无法加载的扩展在实际导入时仍然会失败。

REA 在解析分析配置文件之前对已安装的扩展文件进行指纹识别,并在启动前立即再次检查 该标识。符号链接、非普通文件、缺失组件和不兼容的元数据都会被拒绝。 检查范围限制为 1,024 个条目、16 个目录层级和 64 MiB,并使用流式文件哈希和 64 KiB 属性。重建或内容更改会产生不同的配置文件;旧快照不会与新配置文件一起被 静默复用。这是内容标识,而不是对已安装代码的签名或沙箱。 会话运行期间不要修改 Ghidra 安装。

常规公共接口

rea analyze /absolute/path/to/psp.elf --provider ghidra --json
rea function /absolute/path/to/psp.elf function_name --provider ghidra --json

MCP 使用带有绝对路径的 open_binary 和 provider_id: "ghidra",然后执行常规的 清单和函数操作。加载器显式为 PspElfLoader,语言为 Allegrex:LE:32:default, 编译器为 default。在提供观察结果之前,握手必须确认语言和编译器。 缺少先决条件时返回 PSP_EXTENSION_UNAVAILABLE,并附上安装补救措施; 不会发生提供方回退或自动安装。

Evidence 保留 mips 架构系列及其 PSP 专用配置文件,包括扩展内容标识。 它还带有 VFPU 和仅静态限制。该扩展并未完全建模 VFPU 前缀效应; 非空的反编译代码并不能证明向量行为正确。现有的会话本地元数据编辑不会改变 可执行字节,也不会将快照变成持久的 Ghidra 项目。

验证

使用现有的真实 MIPS 验证器及其 PSP 选项。所需工具为调用方提供的 make、 psp-config、psp-gcc、psp-readelf、psp-objdump、PSPDEV、 GHIDRA_INSTALL_DIR 以及兼容的 JAVA_HOME。

npm run build:cached
node scripts/verify-real-ghidra-mips.mjs --psp
# In a disposable installation without Allegrex, test actual public refusals:
node scripts/verify-real-ghidra-mips.mjs --psp-missing-extension
# Generic MIPS must remain generic with Allegrex installed:
npm run verify:ghidra:mips

通用验证器还会执行一个节截断的固件测试夹具。该检查使用通用 MIPS 符号和语言预期, 并且仅在通用模式下运行;PSP 报告会明确记录 carved-PSP 覆盖未运行。

受维护的 PSP 测试夹具从 tests/conformance/psp/ 构建,从不执行,并且独立于 商业游戏数据。PSP GNU 工具提供 ELF/ABI、原始 ABI 记录、符号和编码观察结果; REA 解析的目标和保存的快照必须与独立的 ABI 声明一致。公共 CLI/MCP 必须能恢复 已知函数、一次直接调用、立即数 0x1234、BITREV、一个全局字和一个标记。 验证器检查观察到的加载器/语言、原始字节、Evidence、快照重新打开,以及在同一地址上 具有不同全局内容的 A-B-A 目标切换。A 的快照不得打开 B。 必须在报告成功之前完成清理。

这些检查是选定的静态事实,而非完整的行为等价性、VFPU 语义或任意 PSP 兼容性。 独立发布的 PSP 二进制在载荷分类和许可证审查之后可作为补充校准目标; 不支持的 PRX/PBP 不得计为成功的静态 ELF 案例。

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