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, 二进制分析, 云安全运维, 云资产清单, 可视化界面, 网络流量审计, 逆向工程, 通知系统