s-b-repo/nfsmw-2005-re
GitHub: s-b-repo/nfsmw-2005-re
针对《极品飞车:最高通缉(2005)》的系统性逆向工程文档与工具集,提供完整的子系统映射、属性哈希破解及可用的Mod开发工具链。
Stars: 5 | Forks: 0
# NFSMW 逆向工程项目
一个针对**《极品飞车:最高通缉 (2005)》**(PC 零售版,`speed.exe`,PE32 i386,MSVC 7.10,镜像基址 `0x00400000`,26,316 个函数)的社区逆向工程、文档和 Mod 工具项目。
## 本仓库包含的内容
```
.
├── README.md ← you are here
├── LICENSE ← BSD-3
├── docs/ ← Documentation, schemas, indices (the core deliverable)
│ ├── ARCHITECTURE.md ← 817-line canonical reference
│ ├── ANTI_RE_AND_PATTERNS.md ← 18 anti-RE techniques + how we beat each
│ ├── PROGRESS.md ← Wave-by-wave session log
│ ├── attribute_hashes.md ← attributes.bin schema + per-type crack tables
│ ├── attribute_cracks_verified.json ← 294 hash→name pairs (re-hash verified)
│ ├── sdk_addrs.json ← 181 hardcoded addresses from NFSPluginSDK
│ ├── sdk_enums.json ← 65 enum definitions
│ ├── sdk_structs.json ← 245 struct definitions (1,712 fields)
│ ├── renames.csv ← 6,513 Ghidra-named functions
│ ├── nfsplugin_sdk_mw05/ ← Mirrored BSD-3 SDK headers (berkayylmao)
│ ├── GHIDRA_MCP_ENDPOINTS.md ← Tooling reference (Ghidra HTTP plugin)
│ ├── DEBUGGER_PLAN.md ← Wine + gdbserver attach walkthrough
│ └── plan.txt ← Project plan / status board
├── tools/ ← Linux-native CLI + scripts
│ └── nfsmw-tool/ ← Pure-Python multi-command CLI
│ ├── nfsmw_tool.py ← Hash, JDLZ decompress, save verify, SDK lookup, etc.
│ ├── Makefile
│ └── README.md
└── mods/ ← Proof-of-concept mods
└── infinite_trainer/ ← Working .asi (Tweak_InfiniteNOS + Tweak_InfiniteRaceBreaker)
├── nfsmw_trainer.c
├── Makefile ← Cross-compiles via i686-w64-mingw32-gcc
└── README.md
```
## 主要发现
| 发现 | 参考 |
|---|---|
| **bChunk hash = Bob Jenkins mix3 (1996),种子 `0xABCDEF00`** — 而非 DJB2/FNV | [`docs/ANTI_RE_AND_PATTERNS.md`](docs/ANTI_RE_AND_PATTERNS.md) §1 |
| **Script VM 是原生的 Lua 5.0.2** — 已通过错误字符串匹配确认 | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) wave-5 部分 |
| **JDLZ v0x02** 算法已从 `speed.exe @ 0x64db40` 完全逆向 | [`tools/nfsmw-tool/nfsmw_tool.py`](tools/nfsmw-tool/nfsmw_tool.py) `jdlz_decompress()` |
| **存档文件使用 MD5 尾部**(而非 CRC)— IV 常量已验证 | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) §wave-5 save/load |
| **过场动画使用 On2 VP6 + MAD 音频**,而非 Bink | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) §wave-5 cutscenes |
| **AI 不会尾流 drafting 也不使用氮气加速** — 所谓的“尾流(slipstream)”仅仅是橡皮筋机制(rubber-banding) | [`docs/ANTI_RE_AND_PATTERNS.md`](docs/ANTI_RE_AND_PATTERNS.md) §14 |
| **漂移模式在 MW 中不存在** — 遗留的《地下狂飙》时期字符串 | [`docs/ANTI_RE_AND_PATTERNS.md`](docs/ANTI_RE_AND_PATTERNS.md) §14 |
| **没有物理工作线程** — 积分器在主线程上内联运行 | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) wave-9 勘误 |
| 最初的所有 5 个神秘哈希已破解:AUTO_SIMPLIFY, BEHAVIORS, SimplePhysics, ExplosionEffect, DROPOUT | [`docs/attribute_cracks_verified.json`](docs/attribute_cracks_verified.json) |
| **HUD 每帧遍历器(walker)** = `CHudWidgetArray_Tick @ 0x58ca30`(位于 vtable @ 0x8a2538 的 vt[1]);对 11 个固定槽位进行内联迭代;通过 widget[6..9] 掩码进行模式过滤 | [`docs/wave13_hud_walker.md`](docs/wave13_hud_walker.md) |
| **24 个 HUD widget** 已映射到确切的 CHudWidgetArray 存储偏移量 (+0x2c0..+0x32c)。只有 10 个由 walker 驱动(ticked);14 个为 FNG 总线 / 被动类型 | [`docs/wave14_hud_slot_map.md`](docs/wave14_hud_slot_map.md) |
| **BustedMeter 是一个被动 widget** — Update 操作为空(no-op);外部写入器将数据直接存入(poke) FNG 中 | [`docs/hud_widget_decomps/BustedMeter_Update.txt`](docs/hud_widget_decomps/BustedMeter_Update.txt) |
## 快速开始
### 安装 CLI
```
cd tools/nfsmw-tool
make install # symlinks ~/.local/bin/nfsmw-tool
nfsmw-tool stats # show project coverage
```
### 计算 / 查找 bChunk hash
```
$ nfsmw-tool hash MASS
bChunk("MASS") = 0x4A56503D
$ nfsmw-tool lookup 0xC2094707
0xC2094707 = YAW_SPEED (Float-typed attribute)
```
### 解压 JDLZ bundle
```
$ nfsmw-tool jdlz /path/to/GLOBAL/GLOBALB.LZC
Decompressed 2803648 bytes → /path/to/GLOBAL/GLOBALB.LZC.bin
```
### 构建无限 NOS 修改器(trainer)
```
sudo pacman -S mingw-w64-gcc # or apt install gcc-mingw-w64-i686
cd mods/infinite_trainer
make # produces nfsmw_trainer.asi
cp nfsmw_trainer.asi /path/to/NFSMW/scripts/
```
运行 NFSMW,参加比赛,使用 NOS — 永不耗尽。这验证了从文档到运行时的整个链条。
## 配套:Mod SDK
一个基于此逆向(RE)数据库构建的跨平台 header-only Mod SDK
位于其独立的仓库中:**[s-b-repo/nfsmw-2005-sdk](https://github.com/s-b-repo/nfsmw-2005-sdk)**。
支持从 Linux/Windows/macOS (MinGW-w64 i686) 构建 Mod;输出的 DLL 能够
通过单一文件在 Ultimate-ASI-Loader 和 **BepInEx 6** **两者**下加载。
其地址表是根据本仓库的 `docs/sdk_addrs.json`、
`docs/attribute_cracks_verified.json` 和 `docs/sdk_enums.json` 生成的。
## 如何将本仓库用于你自己的 Mod 制作
1. **找到你想要修改的内容。** 使用 [`docs/attribute_hashes.md`](docs/attribute_hashes.md) 查找属性名称(例如 `MASS`、`TopSpeed`、`RubberBandGain`),或使用 [`docs/sdk_addrs.json`](docs/sdk_addrs.json) 查找全局变量(例如 `Tweak_InfiniteNOS`、`DrawCars`)。
2. **如有需要,计算哈希。** `nfsmw-tool hash ` 会提供 32 位密钥。
3. **在 Ghidra 中查找读取/写入位置。** 打开 `speed.exe`,搜索该常量。应用了我们的 460 条反汇编注释后,哈希值已经预先标注了其破解后的名称。
4. **编写 Mod。** 最简单的方法:使用 [nfsmw-2005-sdk](https://github.com/s-b-repo/nfsmw-2005-sdk)(包含 `NFSMW_PLUGIN_MAIN`、类型化全局变量、hook 辅助工具)。或者复制 `mods/infinite_trainer/` 作为一个裸 `.asi` 模板,并替换其中的地址常量。
## 这项工作是如何完成的
在约 6 天内进行了八次逆向工程“浪潮”(并行 agent + 直接工作):
| 浪潮 | 日期 | 成果 |
|---|---|---|
| 基线 | 2026-05-09 之前 | ~6,338 个函数被命名,JDLZ 算法,attributes.bin schema |
| Wave-1 | 2026-05-09 | 映射了 10 个子系统(分配器、世界流式传输器、粒子、音频、自定义、FNG、网络、损坏、输入、回放) |
| Wave-2/3/4 | 5 月中旬 | EAGL 物理锚点、Cop AI、渲染通道、动画、生涯、Script VM |
| Wave-5 | 2026-05-14 | NFSPluginSDK 集成(178 个标头),确认 Lua 5.0,映射了另外 8 个子系统 |
| Wave-6 | 2026-05-14 | +50 个属性破解(手动 + 复合词表) → 121 / 345 (35 %) |
| Wave-7 | 2026-05-14 | 集成社区 NFS 哈希数据库(Attribulator + OpenNFSTools + nfsu2-re) → 294 / 345 (85.2 %);所有 5 个神秘哈希均被破解 |
| Wave-8 | 2026-05-14 | 完整映射输入绑定系统,映射 13 个 HUD widget,更正了之前的误读 |
| Wave-9 | 2026-05-14 | 构建并验证无限 NOS 修改器,EAGL 物理勘误(无工作线程),映射 event-bus API,确定 15 个哈希的语义角色 |
完整日志请参见 [`docs/PROGRESS.md`](docs/PROGRESS.md)。
## 本仓库不包含的内容
- **不含受版权保护的游戏资源。** 不含 `speed.exe`,不含 bundles,不含音乐,不含模型。你需要一份合法获取的游戏副本才能使用这些工具。
- **不含游戏安装程序。** 请自备副本。
- **不含 PDB / 源码泄露。** 这里的所有内容均来自社区主导的净室(clean-room)逆向工程成果。
## 许可证
BSD-3-Clause。参见 [`LICENSE`](LICENSE)。
标签:Ghidra, Homebrew安装, Python, 云资产清单, 文档, 无后门, 游戏, 游戏模组, 逆向工具, 逆向工程