Adriwin06/BP-Decomp_Workflow
GitHub: Adriwin06/BP-Decomp_Workflow
Burnout Paradise 游戏反编译的编排仓库,提供多平台交叉验证、agent 协作工作流和自动化工具链,用于将闭源游戏二进制重构为可编译的 C++ 代码。
Stars: 0 | Forks: 0
# Burnout Paradise 反编译工作流
本仓库是逆向工程 Burnout 5 / Burnout Paradise 的统筹工作区。它本身并不是反编译的源码树。它包含了分析数据库、参考资料、工作台账以及自动化工具,使得 agent 能够将 Xbox 360 版本重构为可编译的 PC C++ 代码。
恢复出的 C++ 代码位于 [`b5-decomp`](https://github.com/Adriwin06/b5-decomp) 子模块中。本仓库负责解答:
- X360 目标版本中存在哪些函数;
- 每个函数属于哪个翻译单元(TU);
- 每个单元有哪些可用的参考证据;
- 哪些单元的状态为 todo、in progress、compiled、reviewed、blocked 或 done;
- 如何认领、重构、验证、审查以及协调工作。
## 优先阅读
对于重构工作,请按以下顺序阅读:
1. [`AGENTS.md`](AGENTS.md) - 每个 agent 和维护者的操作指南。
2. [`STRATEGY.md`](STRATEGY.md) - 技术方案与证据规则。
3. [`progress/README.md`](progress/README.md) - 台账与 `work` CLI 参考。
`CLAUDE.md` 的存在仅作为 Claude Code 的重定向。规范指令在 `AGENTS.md` 中共享,以便所有 agent 遵循相同的流程。
## 为什么需要使用多个构建版本
没有任何单一的二进制文件能包含足够的信息。该工作流采用多源交叉验证:
| 构建版本或产物 | 作用 |
| --- | --- |
| `BURNOUT_X360_ARTIST.XEX` | 目标/骨架。其符号、伪代码、汇编以及交叉引用(xrefs)定义了重构的内容。 |
| `Burnout_External_PS3.ELF` | 符号丰富的 PS3 版本,用于验证名称和行为。 |
| `DecFIGS_Burnout_Internal_PS3.ELF` | 提供 DWARF 源码/文件归属,以及声明、类型、枚举、全局变量、函数签名和局部变量的提示信息。 |
| `BurnoutPR.exe` 和 `TUB_Burnout_PC_External.exe` | 去除符号的 PC 参考版本,有选择地用于查阅特定平台的代码路径。 |
| `rwcore.lib` / `rwcore.pdb` / `rwcore_master.obj` | RenderWare 核心的类型与布局证据。 |
| `references/Feb-2007/` | 真实的源码切片,在重叠部分用作最高保真度的模板。 |
| `references/Wiki/` | 源自 burnout.wiki 的类型表。使用其名称/类型/语义,但绝对不使用其偏移量。 |
规范标识是一个标准化的全限定函数名,而不是地址。
地址是特定于构建版本的,绝不能视为在不同二进制文件之间保持稳定。
## 仓库布局
| 路径 | 内容说明 |
| --- | --- |
| [`AGENTS.md`](AGENTS.md) | 与工具无关的操作指南:恢复行为、工作循环、服务器协调、重构规则、审查策略以及“禁止”规则。 |
| [`STRATEGY.md`](STRATEGY.md) | 工作流的设计文档:目标、构建版本作用、标识模型、TU 模型、存根、验证、目标与阶段状态。 |
| [`IDA Files/`](IDA%20Files/) | IDA Pro 数据库以及 RenderWare 库/PDB 输入。一些大型 `.i64` 文件被有意通过 git 忽略,必须在本地自行提供。 |
| [`.ida-exports/`](.ida-exports/) | 从 IDA 导出的按函数生成的 JSON 文件:名称、原型、局部变量、伪代码、汇编、调用者和被调用者。已被 git 忽略。 |
| [`references/`](references/) | 非反汇编证据:Feb-2007 源码切片、DecFIGS DWARF 产物、BPR 模块映射、wiki 索引以及命名约定。 |
| [`tools/`](tools/) | IDAPython 导出器、后处理器、RenderWare 头文件生成器,以及 `tools/work/` 台账/重构辅助工具。 |
| [`progress/`](progress/) | 共享的台账输入与输出:标识、TU 索引、依赖关系、状态镜像、目标、验证/审查配置,以及生成的审查包。 |
| [`b5-decomp/`](https://github.com/Adriwin06/b5-decomp) | 包含已恢复的 C++ 代码、第三方库、RenderWare 头文件以及 CMake 项目文件的子模块。 |
| [`build/`](build/) | 用于 `b5-decomp` 的本地构建树;不是事实的唯一来源。 |
| [`.env.example`](.env.example) | 可选的工作服务器配置模板。只有在维护者分配给你 worker id 时,才将其复制到 `.env`。 |
`progress/reviews/` 下生成的审查包以及 `b5-decomp/vendor/` 下的第三方 Markdown 是产物/上游文档,不是主要的工作流文档。
## 前置条件
常规台账工作所需:
- Python 3
- Git
- Windows 上的 PowerShell
- 已在 `b5-decomp/vendor/` 下初始化的子模块
编译门控所需:
- Visual Studio/MSVC
- `progress/verify.config.json` 指向真实的 `vcvars64.bat`
如果缺少 `vcvars`,`work submit` 将报告跳过编译门控并继续执行;这对于记录工作进展很有用,但无法捕捉编译器错误。
仅在重新生成分析导出文件或从 IDA 生成新的骨架时需要:
- 带有 Hex-Rays 的 IDA Pro (`idat.exe`)
- `IDA Files/` 下相关的 `.i64` 数据库
- 为目标数据库生成的 `.ida-exports/`。如果它们缺失或已过期,在进行重构工作之前请运行 IDA 导出脚本:
tools/export_db.ps1
大体积或受许可限制的本地输入文件被有意地全部排除在提交之外。至少,重新生成导出文件的本地工作可能需要参考 README 文档中记录的、被 git 忽略的 PS3/PC IDB 文件以及 Feb-2007 源码树。
## 全新克隆 / 恢复工作
在仓库根目录下执行:
```
work bootstrap
```
`bootstrap` 会初始化子模块,并根据已提交的状态重新构建 `progress/ledger.sqlite`:`progress/status.json`、`progress/tu_deps.json`、`progress/identity.json` 以及 `progress/tu_index.json`。
这足以恢复任务队列和状态台账。它不会重新生成被 git 忽略的 IDA 导出缓存。如果 `.ida-exports/` 不存在或与本地 IDA 数据库不匹配,请在重构 TU 之前生成它:
```
tools/export_db.ps1 # all configured IDA databases
tools/export_db.ps1 -DbName "BURNOUT_X360_ARTIST.XEX"
```
之后,简短的“continue”指令意味着:
```
work claim
work show --full
```
然后将 TU 重构到 `b5-decomp/src/` 中,进行编译/提交,并记录审查结果。
## 核心工作循环
```
work status # ledger counts and active goal
work next -n 5 # preview ready work; reserves nothing
work claim [-n N] # claim next ready TU(s)
work claim [ ...] # claim specific TU(s)
work show --full [--asm] # reconstruction dossier
work stubs --list # unresolved callees and owning headers
work submit [--files path ...] # compile gate, parity, reviewer packet
work parity # standalone deterministic parity check
work review --verdict pass # mark done after review/self-check
work review --verdict fail # return to in_progress with notes
work block "reason" # stop it being reclaimed
```
编译门控是针对每个翻译单元进行的(`cl /c`,不进行链接)。目标是实现与 X360 版本在语义上的一致性,表现为类似源码的 PC C++ 代码,而不是字节级别的完全匹配。
## 工具清单
权威的仓库工具清单位于 [`tools/README.md`](tools/README.md)。
概览如下:
| 工具领域 | 入口点 |
| --- | --- |
| 日常台账工作 | `work bootstrap`, `work status`, `work next`, `work claim`, `work show`, `work submit`, `work parity`, `work review`, `work block` |
| 目标范围界定与追踪 | `work goal ...`, `work goal import-trace`, `tools/work/trace_import.py` |
| IDA 导出 pipeline | `tools/export_db.ps1`, `tools/ida_export_all.py`, `tools/ida_export_lineinfo.py`, `tools/ida_decompile.py` |
| 派生台账构建器 | `tools/work/build_identity.py`, `tools/work/build_tu_index.py`, `tools/work/build_type_deps.py`, `work seed --deps` |
| 重构辅助工具 | `tools/work/dossier.py`, `tools/work/gen_stubs.py`, `tools/work/gen_skeleton.py`, `tools/work/auto_draft.py` |
| 验证/审查 | `tools/work/verify.py`, `tools/work/parity.py`, `progress/verify.config.json`, `progress/review.config.json` |
| 参考与维护 | `tools/work/wiki_index.py`, `tools/work/check_vendor_lib.py`, `tools/work/reconcile_from_files.py`, `tools/work/find_local_redefs.py`, `tools/gen_rwcore_headers.py` |
| 可选的服务器协调 | `work sync`, `work server-sync`, `work server-reset`, `work worker-add`, `work worker-list`, `work worker-revoke` |
## 目标与执行追踪
默认情况下,`work next` 会对整个程序按叶子优先进行排序。目标会将队列限定在一个成员集合中,这些集合可以是手动编写的 glob 匹配模式,也可以是执行派生的 Xenia 追踪记录:
```
work goal
work goal show boot-trace
work goal set boot-trace
work goal clear
work goal import-trace [--trace-dir .trace/funcdata]
```
目标定义在 [`progress/goals.json`](progress/goals.json) 中。完整的 schema 和 Xenia 追踪流程记录在 [`references/GOAL_SCOPING.md`](references/GOAL_SCOPING.md) 中。
## 可选的协调服务器
默认模式是本地的:台账和 git 是唯一的状态来源。如果维护者给了你服务器 URL 和 worker id,请将 `.env.example` 复制到 `.env` 并设置:
```
WORK_SERVER=https://...
WORK_AGENT=
WORK_LEASE_SECONDS=7200
```
配置好服务器后,`work claim` 在所有 agent 之间是原子操作的,并且实时的认领状态会保留在服务器上。与已提交代码绑定的持久状态(`done`,`blocked`)仍然通过 `progress/status.json` 进行同步。
### 对不可达服务器的容错能力
配置好的服务器即使*宕机*,也不会中断工作循环 —— CLI 会优雅降级并在重新连接时自我修复,因此 agent 无需管理服务中断。
- **连接失败与拒绝请求。** *无法访问*的服务器被视为可恢复的中断;而*返回错误*(HTTP)的服务器则代表真实的决定。只有真正的**认证拒绝**(缺失/无效的 `WORK_AGENT`)才会阻止命令执行 —— 这是配置错误,而不是中断。
- **本地降级。** 在无法访问服务器期间,读取操作(`work next`,`work status`)会回退到本地的叶子优先排序和计数;写入操作(`work claim`,`work submit` → compiled,`work review`,`work block`/`unblock`)会应用到本地台账,并记录在一个**离线发件箱**(位于被 git 忽略的台账缓存中的 `pending_op` 表)中。
- **重连自我修复。** 在下一次服务器模式命令执行前,或者通过 `work sync` 按需执行时,发件箱会**自动重放**。`work status` 会显示队列操作计数,以及它报告的是服务器还是本地台账。
- **已完成的工作永远不会丢失。** `done`/`blocked` 持久化在 git(`progress/status.json`)中,因此即使在长时间中断后,它们也会通过 `work server-sync` 与服务器进行协调。只有*短暂存在*的认领层在离线时可能会发生冲突(租约可能在服务器上已过期,或者离线认领可能与其他 agent 发生冲突)。此类冲突会在同步期间被**报告** —— 绝不会被静默丢弃,也绝不会覆盖本地状态。
```
work sync # flush queued offline ops (auto-runs otherwise)
```
维护者命令:
```
work server-sync [--branch ] # preserve live claims/events
work server-reset [--to ] # local reset + server reseed
work worker-add "Name" [--admin]
work worker-list
work worker-revoke
```
### 自动状态协调
由于每次认领/提交/审查都会镜像到服务器,已提交的 `progress/status.json` 是服务器持久状态的*派生*视图,而不是独立的来源。GitHub Action 会自动保持 git 与服务器同步,因此**从事反编译的人员只需将代码推送到 `b5-decomp` —— 他们不需要此工作流仓库的写入权限,也无需手动编辑 `status.json`。**
它会在**每次提交 b5-decomp 代码时**运行。通知工作流
[`b5-decomp/.github/workflows/notify-workflow.yml`](b5-decomp/.github/workflows/notify-workflow.yml)
会在每次推送到 b5-decomp 的 `dev` 分支时触发,并向此仓库的
[`.github/workflows/reconcile-status.yml`](.github/workflows/reconcile-status.yml)
发送一个 `repository_dispatch`(携带新的提交 SHA),随后该工作流将执行以下操作:
1. 根据服务器的 `GET /export/status` 重新生成 `progress/status.json`。服务器是**唯一的完全权威**:仅通过文件进行的协调可以恢复 `done`(因为其文件存在),但无法恢复 `blocked`(被阻断的 TU 不会留下任何文件),因此持久状态集是直接从服务器拉取的;
2. 将 `b5-decomp` 子模块指针推进到触发本次运行的提交;
3. 使用 `reconcile_from_files.py` 将服务器的 `done` 集合与已提交的 b5-decomp 文件进行交叉核对(非阻断性 —— 如果服务器将某个 TU 标记为 `done`,但其提交的文件缺失或仍为 trap-stub/partial,它只会发出警告);
4. 以 bot 身份提交并推送重新生成的 `status.json` 以及更新的指针。
**设置(一次性):** 通知工作流需要在 b5-decomp 仓库上设置一个 `WORKFLOW_DISPATCH_TOKEN` 密钥 —— 这是一个可以向此仓库发送 `repository_dispatch` 的 token。如果没有它,通知工作流将不会进行任何操作(因此不会破坏任何东西),但自动协调将不会触发。协调 Action 还具有手动 `workflow_dispatch` 触发器(可选择固定特定的 `b5_sha`)以便进行补录。
你也可以手动刷新已提交的镜像:
```
python tools/work/fetch_server_status.py # rewrite status.json from the server
python tools/work/fetch_server_status.py --check # report drift, write nothing (exit 1 if stale)
```
两点操作说明:
- **服务器现在是 `blocked` 的持久化存储。** `done` 始终可以从已提交的文件中恢复,但被阻断的 TU 的状态和原因仅存在于服务器上 —— 因此请备份其数据库(`/var/lib/bp-work-server`)。bot 提交的 `status.json` 同时作为 `done`/`blocked` 集合的备份。
- **Action 会推送到默认分支。** 如果该分支受保护、禁止直接推送,请将 Action 指向一个旁支并自动创建 PR,而不是允许 bot 直接推送。
## 自动化辅助工具
这些辅助工具是可选的。它们不能替代手动重构:
```
work auto --scan # find fully mechanical TUs
work auto --run [-n N] # draft/gate safe forwarder/thunk-only TUs
python tools/work/reconcile_from_files.py [--apply]
python tools/work/find_local_redefs.py [--summary]
python tools/work/wiki_index.py [--lookup ]
python tools/work/check_vendor_lib.py
```
在反编译之前,必须使用 `check_vendor_lib.py` 检查第三方 SDK 的 TU。如果脚本输出 `PRESENT`,请将该 TU 作为已被 PC 库或开源第三方源码覆盖的第三方代码进行阻断。如果输出 `MISSING`,则正常进行重构。
## 重新生成 Pipeline
如果 `.ida-exports/` 已经存在且是最新的,大多数 agent 不需要重新生成导出文件。在没有此缓存的新机器上,或者每当 IDA 分析发生更改时,请先运行 IDA 数据库导出:
```
tools/export_db.ps1 # generate .ida-exports/ from IDA Files/*.i64
tools/export_db.ps1 -DbName "BURNOUT_X360_ARTIST.XEX"
```
然后根据需要重新构建派生的 DecFIGS/台账产物:
```
python tools/build_source_tree.py
python tools/work/build_identity.py
python tools/work/build_tu_index.py
work seed --deps --reset
```
有关完整的脚本清单和命令详情,请查阅 `tools/README.md`。
标签:AI合规, Bash脚本, C++, 云资产清单, 安全意识培训, 工作流管理, 数据擦除, 游戏开发, 网络安全研究, 网络调试, 自动化, 逆向工具, 逆向工程