Red-tv141/PS2_Scoring_Radar
GitHub: Red-tv141/PS2_Scoring_Radar
一款基于Ghidra的PS2游戏60FPS补丁自动化生成工具,通过双遍扫描和智能分类系统精准定位帧率耦合函数。
Stars: 1 | Forks: 0
# PS2 Scoring Radar V13 Final:用于 60FPS 补丁的高级静态分析
## 概述
**PS2 Scoring Radar V13 Final** 是一款高级自动化 Ghidra 脚本,专为协助制作 PlayStation 2 游戏的 60FPS 补丁而设计。
寻找正确的指令以进行 NOP(空操作)处理,从而将游戏逻辑与帧率解耦,是一项枯燥的手工过程。本脚本通过充当高度专业化的静态分析引擎来自动化这一过程。它分两次扫描整个 PS2 游戏二进制文件,根据一套严格的 EE 硬件感知架构规则评估每一条 `jal` 指令,并输出一个经过排序、即可使用的 `.pnach` 文件以及补充的 hook 和 thunk 文件。
通过智能地对函数进行分类并优先考虑安全性,PS2 Scoring Radar 显著减少了 PS2 模组制作中传统上所需的试错工作。
## 主要功能
### 双遍扫描架构
- **Pass 1 — JAL 扫描器:** 通过完整的 P-Code 反编译、缓存和父上下文分析来评估每一条直接 `jal` 指令。
- **Pass 2 — 全二进制扫描:** 使用轻量级汇编启发式方法扫描所有函数以寻找 vtable/`jalr` 候选(跳过 P-Code 以防止大型二进制文件出现 OOM)。
### 基于拓扑的自动检测
即使对于被剥离符号表的二进制文件,也能通过分析以下内容自动识别主循环和菜单循环候选:
- 指令计数和调用广度
- 内部回边(循环检测)
- 帧心跳(`BeginFrame`/`EndFrame`, `sceGsSyncV`)
- 层级分层(一个循环是否调用另一个循环)
### 混合 Nexus 种子
FrameRate Nexus 接受**代码地址**(VSync 指令)**或**数据地址(全局帧计数器变量)。在数据模式下,所有引用该变量的函数将自动用作 nexus 传播树的根节点。
### 多层安全防火墙
- **静态库防火墙:** 阻止 Sony SDK(`sceCd`, `scePad`, `sceVif` 等)和标准 libc 函数。
- **IOP 模块防火墙:** 过滤掉 I/O 处理器调用(`cdvdman`, `padman`, `.IRX` 引用等)。
- **行为防火墙:** 阻止使用 `syscall`、COP0、MMIO/KSEG1 硬件访问或系统字符串(`assert`, `panic`, `bios`)的函数。
- **依赖项守卫:** 如果任何 JAL 的返回值(`v0`, `v1`, `f0`)被后续指令读取(包括跨 MIPS 分支延迟槽),则阻止该 JAL。
### 高级 DNA 分类
根据 FPU 使用情况、分支密度、硬件特征(COP1/COP2/VU0)和调用拓扑,将安全补丁分类为可操作的类别:
| 类别 | 描述 |
|---|---|
| `TIMERS` | 帧计数器和滴答逻辑 |
| `VECTORS` | VU0/COP1/COP2 数学运算,物理 |
| `ANIMATION_MODIFIERS` | 浮点参数动画速度函数 |
| `ANIM_TICKERS` | 调用其他函数的动画/物理管理器 |
| `STATE_MACHINES` | AI 调度器和逻辑引擎 |
| `MACRO_SCRIPTS` | 过场动画和重大事件管理器 |
| `THUNKS` | 已解析的 vtable 包装条目 |
### 按类别的调用者上限与惩罚
每个类别都有最大调用者计数和单调用者得分惩罚,以防止实用工具函数的排名高于专门的游戏玩法函数。
### 模式猎手模块
- **Euler Hunter:** 检测向量缩放 → 向量加法序列。
- **Kinematic Hunter:** 通过 P-Code 回溯三角函数数据流(`sinf`/`cosf`)。
- **Animation Hunter:** 隔离接受计算出的浮点参数(时间/速度增量)的函数。
- **Global State Writer:** 提升在调用点附近写入全局 RAM 地址的函数。
- **Entity Struct Writer:** 提升写入结构体偏移量的函数(偏移量 ≤ `0x60` 的 `swc1`/`sqc2`)。
- **Hierarchy Matrix:** 提升单例调用者;惩罚批量/循环调用者。
### Vtable 安全评分
对于 Pass 2 vtable 候选,爆炸半径分析会评估:
- 函数大小和分支复杂性(危险惩罚)
- 系统库被调用者(`malloc`, `sceCd` 等)
- 高扇入实用工具被调用者
- 叶子被调用者比例和安全域传播(安全奖励)
### Vtable 集群协同
`0x1000` 字节内相邻的同类 vtable 候选可获得集群奖励,从而提升连贯的 vtable 块。
### 跨类别上下文奖励
评分后,在相同父级中靠近其他已确认强目标(在 ±5 个 JAL 内)的函数将获得上下文奖励。
### 60FPS Stride Hunter(被动)
扫描主循环候选以寻找:
- **整数步长:** 基址为 `zero` 且值为 `1`, `2`, `-1`, `-2` 的 `addiu`/`li`
- **浮点增量:** 加载接近 `1/30` (≈`0.03333f`) 或 `1/60` (≈`0.01666f`) 的 IEEE 754 常量的 `lwc1`
结果会报告在输出文件和控制台中,但**不**会生成自动补丁 —— 需要人工检查。
### 智能延迟槽生成
每个 `jr ra` 补丁后的延迟槽字根据类别选择:
- `VECTORS` → `00000000` (NOP — 避免破坏硬件寄存器)
- COP1/重 FPU 目标 → `44800000` (`mtc1 zero,$f0` — 安全的浮点返回)
- 所有其他 → `0000102D` (`move v0,zero` — 空指针返回)
### 内存安全
- 在 Pass 1 和 Pass 2 之间清除 HighFunction (P-Code) 缓存。
- `suppressHFCache` 模式可防止在全二进制 Pass 2 扫描期间发生 OOM。
## 输出文件
| 文件 | 内容 |
|---|---|
| `.txt` | 主要排序后的 `.pnach` 补丁列表,按类别和调用者计数分割 |
| `_global_hooks.txt` | 用于自定义 ASM 重定向的中心入口点 |
| `_thunks.txt` | 其真实目标未被 Pass 1 捕获的 Thunk hook |
| `_tracer.txt` | *(可选)* 单文件包含所有目标,便于在 PCSX2 中进行二分查找 |
## 使用说明
1. 在 Ghidra 中加载带有 Emotion Engine 处理器插件的 PS2 ELF,然后运行脚本。
2. 选择自动检测或手动输入游戏玩法和菜单主循环地址。
3. 可选择提供 FrameRate Nexus 地址 —— 可以是 VSync 指令(代码)或全局帧计数器变量(数据)。按 Cancel 跳过。
4. 选择输出文件路径以及是否生成 Tracer Bullets 文件。
5. 等待双遍扫描完成。
6. 打开生成的 `.txt` 文件。一次从某个类别/分数组中取出一批代码。
7. 将它们与问题时刻的 Save State(即时存档)一起加载到 PCSX2 中。
8. 观察哪些地方出错了。动画损坏、物体消失、相机抖动或过场动画失败都表明你发现了一个帧率耦合函数。
9. 使用二分查找(禁用一半代码,重新测试,重复)来隔离确切的函数。
10. 在 Ghidra 中导航到该地址并分析或反编译该函数以编写正确的 60FPS 修复。建议利用 AI 辅助分析反编译输出。
## STATE_MACHINES 警告
输出文件将 `STATE_MACHINES` 分离到一个带有警告的专用部分。如果打补丁后游戏软锁,请将延迟槽字从 `0000102D` (`move v0,zero`) 更改为 `24020001` (`li v0,1`) 以返回 `TRUE` 而不是 `NULL`。
## 注意事项
1. **THUNKS** 的存在是为了处理 Ghidra 偶尔无法解析间接 vtable 调用的问题。它们可能与各种问题相关,但不太可能包含主要的帧率耦合逻辑。
2. **全局 Hook 点**(`_global_hooks.txt`)是用于编写自定义 ASM 的入口点,**不是**用于批量 NOPing。将其中许多作为 `jr ra` 补丁加载可能会导致游戏崩溃。仅在你确切知道函数作用时才使用它们。
3. 脚本无法保证零崩溃诱导补丁,但在测试中,导致崩溃的代码很少(通常每个类别组少于 2 个)。它也无法保证找到每个帧率耦合函数 —— 但实际上它将搜索范围缩小到了二进制文件中 JAL 指令总数的约 25%。
4. Tracer Bullets 文件(`_tracer.txt`)专为快速二分查找而设计:在 PCSX2 中一次禁用一半,直到崩溃消失。
*为 PS2 模组社区开发。已在 PS2 MIPS EE 二进制文件上测试。*
*架构:V11 Safety Core + V12 Binary Profiling + V13 EE Specifics + V13 Final.*
*@作者 Gemini + Claude + Puggsy*
标签:60FPS 补丁, EE 处理器, Ghidra 脚本, JS文件枚举, MIPS 架构, P-Code 分析, PlayStation 2, PNACH 生成, SDK 识别, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 域名枚举, 安全防火墙, 帧率解锁, 循环检测, 游戏修改, 游戏模组, 逆向工程, 静态分析