GeReV/bumpy-reverse
GitHub: GeReV/bumpy-reverse
由 Claude 主导的经典 DOS 游戏 Bumpy's Arcade Fantasy 高保真反编译项目,提供忠实还原的 C 源码、Python 资源提取工具及完整的引擎文档。
Stars: 0 | Forks: 0
# Bumpy's Arcade Fantasy — 逆向工程
这是一项由 Claude 主导的 **[Bumpy's Arcade Fantasy](https://www.mobygames.com/game/3832/bumpys-arcade-fantasy/)** (1992, Loriciel) 逆向工程工作 —— 针对 DOS 英文
发行版。主要的交付成果是位于 `src/` 目录下的**高保真反编译代码**:一份在结构上忠实还原原版二进制文件的 C 语言镜像(每个原始
函数对应一个函数,控制流相同,数据布局相同 —— 采用 *Devilution* 模式,而非
纯净的重写),全程基于对引擎的 Ghidra 反编译结果。随附的还有用于游戏资源格式的纯 Python 解码器/渲染器。
原版游戏文件受版权保护,**不在此分发**;请自行提供。
## 目录结构
| 路径 | 说明 |
|------|------|
| `src/` | 重构的 C 源代码 —— 即反编译本身。构建两个目标:高保真的 `BUMPY.EXE`(仅链接、字节对比、从不运行)和可玩的 `BUMPYP.EXE`(添加了薄薄的宿主平台层以便引擎能够实际运行 —— 参见 [`docs/playable-dos.md`](docs/playable-dos.md)) |
| `tools/extract/` | 用于游戏数据的纯 Python 解码器/渲染器(`.PAV/.DEC/.BUM`, `.VEC`, `.BIN`, `.CAR`, `.BNK`) → 关卡 PNG、精灵图、世界地图、JSON 关卡表。纯标准库实现,无第三方依赖。 |
| `tools/tinyprog_unpack.py` | 从 Tinyprog 加壳的 `BUMPY.EXE` 中恢复解包后的加载模块(参见 [`docs/tinyprog.md`](docs/tinyprog.md)) |
| `tools/disasm16.py` | 一个基于 capstone 的小型 16 位反汇编器,用于直接检查二进制文件或已构建的 `.EXE` |
| `imhex/` | ImHex pattern-language 格式规范(`.hexpat`),通过 `plcli` 验证 |
| `docs/` | 参考文档:引擎内部实现、渲染流水线、重构保真度审计、可执行文件加壳、版权保护、数据文件与资源管线,以及位于 `docs/formats/` 下的文件格式规范([索引](docs/README.md)) |
| `local/` | **git 忽略的**工作树:你的游戏文件、工具链(Ghidra/JDK/DOSBox/Open Watcom)以及构建中间产物 |
| `results/` | **git 忽略的**生成输出(关卡 PNG、精灵图、世界地图、关卡 JSON) —— 可通过工具从游戏文件中重新生成 |
## 复现
### 资源提取(Python,除了数据文件外不需要游戏二进制文件)
1. **依赖项**(使用 [uv](https://docs.astral.sh/uv/) 管理):
uv sync
提取器/渲染器使用纯标准库,不需要任何第三方包。
2. **提供游戏文件**放入 `local/build/capture/game/` 目录中(即你拥有的游戏副本中的
`D1..D9.{PAV,DEC,BUM}`, `MONDE*.VEC`, `BUMSPJEU.BIN` 等文件)。
3. **运行工具**,例如:
uv run python tools/extract/render_levels.py # 所有关卡谜题 -> results/levels_png/
uv run python tools/extract/render_vec_images.py # 标题/得分/世界地图
### 构建重构版本(Open Watcom,16 位 DOS)
需要内置于 `local/toolchain/open-watcom/` 目录下的 Open Watcom 16 位 DOS 工具链(由用户提供,被 git 忽略):
```
src/build.sh # builds the playable BUMPYP.EXE
src/build.sh BUMPY # builds the faithful, non-running BUMPY.EXE
```
参见 [`docs/playable-dos.md`](docs/playable-dos.md) 了解如何在 DOSBox 下运行 `BUMPYP.EXE`,
以及参见 [`docs/engine.md`](docs/engine.md) 了解该重构版本所记录的
引擎内部实现。
参见 [`docs/`](docs/README.md) 获取文件格式参考以及游戏的
数据/资源与版权保护系统。
## 笔记与想法
这最初打算作为 Claude Fable 5 的一个周末挑战,后来它被封禁了。我决定无论如何也要继续这个项目,改用 Opus 4.8。
在尝试寻找一款经典游戏候选者时,Bumpy 脱颖而出,它既具有足够的影响力而被广泛
熟知,能与我产生一些情感共鸣,而且此前没有任何逆向工程或重新实现的工作。
这项工作本身花费了大约 4 个工作日,期间由 Claude 主导其自身的工作,而我通常负责为其指引方向。
Claude 整体表现非常出色。尽管有时需要我施加一点压力,促使它去深挖
遇到的问题,并偶尔抛出一些想法,让它尝试不同的途径或方法。
尽管如此,它最终还是成功破解了它遇到的每一个问题,完成的工作如果让我这个(经验极度匮乏的逆向工程师)来做,可能需要数周或数月,如果我最终能成功的话。
我对此深感震撼。
### 更新 (2026-07-14)
这让我想起了 [Rick and Morty 的 "20 分钟冒险" 梗](https://knowyourmeme.com/memes/20-minutes-adventure),这个最初作为周末计划的项目,自然而然地演变成了一项大约持续一个月的工作。
在此期间,我确实有机会测试了一段时间的 Fable 5。
虽然它在短短几分钟内就疯狂耗尽了我 5 小时的 token 配额,但它确实成功解决了几个重大问题。
其余的时间里,主要由 Opus 完成了大部分工作。
Opus 理解并翻译反汇编代码的能力令人印象深刻。它想出调试方案和动态分析方法的能力更是令人赞叹。
它编写了各种东西,从完整的模拟器,到验证脚本,再到对 DOSBox-X 的补丁修改,以及对重编译二进制文件的插桩分析。
这些内容都已提交到该仓库的历史记录中,但并未包含在最终的文件列表中,因为它们大多是临时性的工作,我认为不值得保留在游戏逆向工程仓库中。
然而,事情并不总是一帆风顺。有时我不得不介入,让 Claude 在事情似乎无法收敛时尝试不同的方法,提出变通方案或手动验证一些事情,特别是当它在亲自查看和理解游戏本身方面暴露出局限性时。
话虽如此,如果我独自承担这项工作,它仍然会花费我更多个星期的时间。
标签:Ghidra, Python, URL提取, 云资产清单, 反编译, 客户端加密, 无后门, 游戏开发, 经典游戏, 逆向工具, 逆向工程