claimore22/ps5rs

GitHub: claimore22/ps5rs

一款用 Rust 编写的 PS5 二进制分析工具包,用于解析 SELF/ELF 格式、解析 NID 导入哈希并对 PS5 游戏转储集合进行多维分析。

Stars: 2 | Forks: 0

# ps5rs 一个使用 Rust 编写的 PS5 二进制分析工具包。解析 SELF/ELF 容器,解析 NID 导入,并分析 PS5 游戏转储集合。 ## 为什么选择 Rust? PS5 运行在 x86-64 (AMD Zen 2) 架构上,因此 PS5 游戏代码无需 CPU 模拟即可在任何现代 PC 上原生执行。困难的部分在于 CPU 以外的所有事情:解析 Sony 的 SELF/ELF 模块格式、解析 NID 哈希导入、系统库的 HLE 以及 ABI 转换。Rust 消除了一大类困扰不安全原生代码的内存安全 bug(缓冲区溢出、释放后使用、数据竞争、空指针解引用),同时性能媲美 C++。对于一个解析来自第三方游戏转储的不可信二进制数据的项目来说,这种安全保证至关重要。 ## Crates | Crate | 用途 | |---|---| | `ps5-format` | 共享类型、错误枚举、ELF/SELF 常量、SHA-256 实用程序 | | `ps5-self` | SELF 容器解析(围绕 ELF 的 PS4/PS5 包装器) | | `ps5-elf` | ELF64 二进制格式解析(headers, segments, symbols, relocations) | | `ps5-nid` | NID 哈希算法(SHA1 + Sony 定制 base64),名称目录,解析器 | | `ps5-image` | BinaryImage IR:带有 JSON 序列化的标准化抽象 | | `ps5-analysis` | 分析引擎:扫描器、数据集、报告、导出 | | `ps5-cli` | 命令行界面(inspect, scan, analyze) | ## 构建 ``` cargo build --release ``` ## 用法 ``` # Build cargo build --release # Binary 位于: ./target/release/ps5rs.exe # Windows ./target/release/ps5rs # Linux/macOS ``` ### 扫描游戏目录(创建数据集) 主要工作流程:扫描一次游戏二进制文件,然后无需重新解析即可立即运行任意数量的报告。 ``` # 将游戏扫描到 dataset 目录中 ps5rs scan ./games --output analysis/ # dataset 是一个包含 JSON 文件的便携式目录: # analysis/ # manifest.json # schema 版本,工具,时间戳,图像数量 # images/ # GameTitle.json # 每个游戏的 BinaryImageDocument # AnotherGame.json ``` 每个游戏的 `eboot.bin` 都会被解析为 `BinaryImage` 并序列化为单独的 JSON 文件。manifest 会跟踪 schema 版本以实现向前兼容。 ### 分析数据集 所有 `analyze` 子命令都从数据集目录读取(无二进制解析)。如果数据集不存在,它们会回退到从原始二进制文件进行扫描。 ``` # 统计(总导入量,resolution 率,最常见的 NID) ps5rs analyze stats analysis/ # Import 清单:哪些库被多少游戏使用 ps5rs analyze imports analysis/ # 未知 NID:按频率排序的未解析 hash(catalog 增长目标) ps5rs analyze unknown analysis/ # 库 x 游戏 heatmap ps5rs analyze heatmap analysis/ # NID 频率排名(前 50 名) ps5rs analyze frequency analysis/ # 未解析的 NID(每个游戏) ps5rs analyze unresolved analysis/ # 依赖图(Graphviz DOT 或 JSON) ps5rs analyze graph analysis/ -o graph.dot ps5rs analyze graph analysis/ --include-nids --format json -o graph.json ``` 所有报告命令都接受 `--format`(terminal/csv/json/dot)和 `-o`(输出文件)。 ### 检查二进制文件 ``` ps5rs inspect path/to/eboot.bin ``` 显示平台、SELF segments(offsets, sizes, flags)、ELF header 字段(entry point, program headers, symbols, relocations, TLS),以及按库和已解析名称汇总的导入。 ``` ps5rs v0.1.0 — PS5 binary inspector File: eboot.bin Size: 52428800 bytes Platform: Ps5 SELF segments: 4 [0] offset=0x1000 file_size=0x3a0000 mem_size=0x3a0000 flags=DATA [1] offset=0x3a1000 file_size=0x1800000 mem_size=0x1800000 flags=CODE ... ELF type: 0x3 Entry point: 0x800001000 Imports: 1423 ``` ### 列出导入 ``` ps5rs imports path/to/eboot.bin ``` 列出所有 NID 导入及其解析出的函数名称和源库。 ``` NID Resolved Library --------------------------------------------------------------------------- mFq1M6vw-JM sceKernelLoad libkernel ... ``` ### 显示 segments ``` ps5rs segments path/to/eboot.bin ``` 列出 ELF program headers 及其类型、flags (RWX)、offsets、vaddr、file/mem 大小。如果存在,还会显示 SELF 数据 segment 映射。 ### 显示动态条目 ``` ps5rs dynamic path/to/eboot.bin ``` 列出所有动态节条目(DT_NEEDED、DT_STRTAB、DT_SCE_* 标签等)以及解析出的导入库名称。 ### 显示 symbols ``` ps5rs symbols path/to/eboot.bin ``` 列出 symbol 表条目及其节索引、bind type、值、大小和解析出的名称。 ### 将函数名称哈希为 NID ``` ps5rs nid sceKernelLoadStartModule ``` 使用 Sony 的 SHA1 + 定制 base64 算法计算给定函数名称的 NID 哈希。 ``` sceKernelLoadStartModule -> 4ZjF4RQH3k8 ``` ### 分析游戏目录(遗留) `analyze collect` 命令仍可直接针对原始游戏转储工作(不创建数据集): ``` ps5rs analyze collect /path/to/games -o database.json ``` 预期目录结构: ``` /path/to/games/ GameTitle-PPSA00000/ eboot.bin # main game binary sce_module/ # optional PRX modules libc.prx libScePfs.prx AnotherGame-PPSA00001/ eboot.bin ``` 默认情况下,仅分析 `eboot.bin`(跳过 `sce_module/` 中的 PRX 模块)。如果你希望包含系统模块,请将 `--include-prx` 添加到收集器中。 ## 架构 ``` eboot.bin | v ps5-image builder | v BinaryImage JSON | v AnalysisDataset | +------------+-------------+ | | | stats inventory heatmaps ``` `BinaryImage` IR 将原始解析器与使用者解耦。`scan` 命令生成一个由 `BinaryImageDocument` JSON 文件组成的数据集。所有 `analyze` 报告都使用该数据集,而无需触及原始二进制文件,从而实现快速且可移植的迭代。 ## 分析报告 `ps5-analysis` crate 提供两种报告流水线: **数据集报告**(从 JSON 文件读取,无二进制解析): - **统计信息**:总导入数、唯一 NID、解析率、最常见的 symbols - **导入清单**:哪些库被多少游戏使用以及使用频率 - **未知 NID**:按频率排序的未解析哈希(直接促进目录增长) - **热图**:库 × 游戏使用矩阵 - **频率**:所有游戏中 NID 使用排名 - **未解析**:名称目录中未找到的 NID(按游戏) - **依赖图**:游戏 → 库 → NID 关系(Graphviz DOT 导出) 导出格式:JSON(有版本控制)、CSV、Graphviz DOT。 ## NID 数据库 CLI 附带了一个内置的 NID 数据库 (`data/nids.csv`),其中包含约 15.4 万条哈希到名称的映射。此文件不受 git 跟踪——你必须提供它才能进行构建。 ### Prosper (ps5ys) 由 mattias800 开发的 [Prosper](https://github.com/mattias800/ps5ys) 是一个用户态的 PS5 到 PC 兼容层——可以将其视为 Proton/Wine,只不过是针对 PS5 的。它通过原生重新实现主机的 OS、ABI 和 GPU stack,而无需 CPU 模拟,从而在 Linux 和 Windows 上运行 PS5 游戏二进制文件。Prosper 是本项目 SELF/ELF 解析方法和 NID 解析策略的主要灵感来源。它对 Sony 系统库的净室重新实现证明了,通过仔细的逆向工程,在不使用任何受版权保护的 Sony 代码的情况下,PS5 二进制兼容性是可以实现的。 ### SharpEmu [SharpEmu](https://github.com/sharpemu/sharpemu) 是一个用 C# 编写的实验性 PS5 模拟器,专为 Windows、Linux 和 macOS 从头开发。该项目由 par274 创建,专注于 PS5 系统级模拟的准确性和基础设施。本项目使用的 NID 名称数据库源自 SharpEmu 社区维护的目录。采用 GPL-2.0 许可。 ### Kyty / KytyPS5 由 InoriRus 开发的 [Kyty](https://github.com/InoriRus/Kyty) 是最早的 PS4/PS5 模拟器项目之一,为理解 PS5 原生代码执行和系统调用处理提供了宝贵的参考资料。该项目随后被社区 fork 并扩展为 [KytyPS5](https://github.com/KytyPS5/KytyPS5) (C++/Vulkan, GPL-2.0)。这两个项目都在推进公众对 PS5 平台的理解方面发挥了重要作用。 ### ShadPS4 [ShadPS4](https://github.com/shadps4-emu/shadPS4) 是一个成熟的 PS4 模拟器,它开创了许多关于 PS4/PS5 二进制格式处理和原生代码执行的方法,这些方法对更广泛的 PS5 模拟社区产生了深远的影响。 ## 许可证 GPL-2.0-only。有关详细信息,请参阅 [LICENSE](LICENSE)。
标签:ELF解析, Homebrew安装, PS5, Rust, 二进制分析, 云安全运维, 云资产清单, 可视化界面, 网络流量审计, 逆向工程, 通知系统