dbalatoni13/nfsmw

GitHub: dbalatoni13/nfsmw

《极品飞车:最高通缉》多平台版本的开源反编译重建项目,旨在从二进制文件还原可编译的源代码。

Stars: 91 | Forks: 8

# Need for Speed: Most Wanted 反编译 [![Build Status]][actions] [![Code Progress]][progress] [![Data Progress]][progress] [![Discord Badge]][discord] 《极品飞车:最高通缉》 **GameCube**、Xbox 360 和 PS2 版本的反编译工作正在进行中。目前的重点是 **GameCube** 版本。 本代码仓库**不**包含任何游戏资产或汇编代码。需要一份现有的游戏副本。 支持的版本: - `GOWE69`: Rev 0 (GC USA) - `EUROPEGERMILESTONE`: Oct 21, 2005 prototype (Xbox 360 PAL) - `SLES-53558-A124`: Sep 20, 2005 prototype (Alpha 124) (PS2) # 依赖项 ## Windows 在 Windows 上,**强烈建议**使用原生工具。**不需要** WSL 或 msys2。 在 WSL 下运行时,[objdiff](#diffing) 无法获取文件系统通知以进行自动重建。 - 安装 [Python](https://www.python.org/downloads/) 并将其添加到 `%PATH%`。 - 也可以从 [Windows Store](https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K) 获取。 - 下载 [ninja](https://github.com/ninja-build/ninja/releases) 并将其添加到 `%PATH%`。 - 通过 pip 快速安装:`pip install ninja` ## macOS - 安装 [ninja](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages): brew install ninja - 安装 [wine-crossover](https://github.com/Gcenx/homebrew-wine): brew install --cask --no-quarantine gcenx/wine/wine-crossover 操作系统升级后,如果 macOS 提示 `Wine Crossover.app` 未经验证,可以使用以下命令解除隔离: ``` sudo xattr -rd com.apple.quarantine '/Applications/Wine Crossover.app' ``` ## Linux - 安装 [ninja](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages)。 - 对于非 x86(\_64) 平台:从您的包管理器安装 wine。 - 对于 x86(\_64),将自动下载并使用 [wibo](https://github.com/decompals/wibo),这是一个最小化的 32 位 Windows 二进制包装器。 # 构建 - 克隆代码仓库: git clone https://github.com/dbalatoni13/nfsmw.git - 安装依赖项 (仅限 PS2) python -m pip install -r requirements.txt - 配置: python configure.py 要使用 `GOWE69` (USA) 以外的版本,请使用 `--version` 指定,例如 `--version EUROPEGERMILESTONE`。 - 构建: ninja - 提取二进制文件 - GC: 提取 `NFSMWRELEASE.ELF`,将其复制到 `orig/GOWE69` 并使用以下命令将其转换为 DOL: ./build/tools/dtk elf2dol ./orig/GOWE69/NFSMWRELEASE.elf ./orig/GOWE69/sys/main.dol - Xbox 360: 只需将 `NfsMWEuropeGerMilestone.exe` 重命名为 `NfsMWEuropeGerMilestone.xex` 并将其复制到 `./orig/EUROPEGERMILESTONE/` - PS2: 将 `NSF.ELF` 复制到 `./orig/SLES-53558-A124/` # 差异对比 初始构建成功后,项目根目录下应存在一个 `objdiff.json`。 从 [encounter/objdiff](https://github.com/encounter/objdiff) 下载最新版本。在项目设置下,设置 `Project directory`。配置应自动加载。 从左侧边栏选择一个对象开始对比。项目的更改将自动重建:源文件、头文件、`configure.py`、`splits.txt` 或 `symbols.txt` 的更改。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/0a5dd213c4080949.png) # 贡献 ## Ghidra 为了获得正确的 Ghidra 输出,您应该安装必要的扩展,或者向我申请访问 [decomp.dev](https://ghidra.decomp.dev/) 上的共享 Ghidra 项目。 ### Ghidra 服务器 [推荐的 Ghidra 版本](https://github.com/RootCubed/ghidra-ci/releases/download/2025-04-25/ghidra_11.4_DEV_20250425.zip) ### 手动设置 [用于将 GC 调试信息正确加载到 Ghidra 的 Dwarf1 扩展](https://github.com/emoose/ghidra-dwarf1) [PS2 Ghidra 扩展](https://github.com/chaoticgd/ghidra-emotionengine-reloaded) 不幸的是,(目前?)无法将 vtables 从 GC ELF 加载到 Ghidra,因此您必须从 PS2 ELF 复制它们并调整相应的类。嵌套类也有同样的问题和解决方案。 #### 使用 Deprecated Demangler 对于 Gamecube 二进制文件,标准的 demangler 不起作用,您必须使用已弃用的版本。 对于 PS2 二进制文件,已弃用的版本提供更好的结果。 1. 从 Ghidra 项目窗口,双击程序文件以在 CodeBrowser 中打开它。 2. 在 CodeBrowser 中,导航到 Analysis > Auto Analyze... (或按 Shift + F12)。 3. 在 Auto Analysis options 窗口中,在列表中找到 "Demangler GNU" 分析器并选择它。 4. 在选项区域(通常在窗口右侧),找到名为 "Use Deprecated Demangler" 的选项。 ## symbols/mw_dwarfdump.nothpp ``` ./build/tools/dtk dwarf dump ./orig/NFSMWRELEASE.ELF -o ./symbols/mw_dwarfdump.nothpp ``` 这是整个游戏 GC 版本的 dwarf dump。`.nothpp` 扩展名是为了确保 IDE 不会在性能较弱的笔记本电脑上解析它。这应该是您的主要信息来源。它甚至显示了一个函数调用了哪些内联函数。命名空间仅出现在泛型中。对于常规函数和变量,您可以在 `symbols.txt` 中搜索正确的名称。 ## symbols/PS2 此文件夹包含 PS2 构建 alpha 124 的调试信息转储。它对于确定成员可见性和虚函数的声明顺序很有用。 ## symbols/debug_lines.txt GameCube 地址 -> 行映射 ## symbols/file_names.txt GameCube 文件列表。不包含任何内联函数的头文件未列出。 ## ProStreet 的 PDB 另一个可以看到可见性和命名空间的重要来源是 ProStreet 的 Xbox 360 构建的 PDB。您可以使用 [resym](https://resym.chimpsatsea.com/) 在浏览器中打开它们。 ## symbols/Classes 此文件夹包含由 `tools/attrib_generator.py` 自动生成的 AttribSys 类,我们尚未确定它们是否可以被包含(可能它们使用了需要导入的结构体)。 ## symbols/vlt.txt 此文件包含 AttribSys 中使用的哈希值。 ## symbols/hashes.txt 此文件包含游戏不同部分中使用的哈希值。我们目前使用模板解决方案在编译时计算哈希值。但正如您在文件中所见,这相当冗长,我们需要找到一个更好的解决方案。 ## symbols/bchunks.txt 此文件包含 bChunk 块 ID。 # AI 贡献指南 ## 设置 - 运行 ./build/tools/dtk dwarf dump ./orig/NFSMWRELEASE.ELF -o ./symbols/mw_dwarfdump.nothpp python ./tools/split_dwarf_info.py ./symbols/mw_dwarfdump.nothpp ./symbols/Dwarf - 按上述说明设置项目和 Ghidra(从 decomp.dev 服务器获取 Ghidra 仓库,您需要申请访问权限)。 - 在 Ghidra 中,检出 `mw/GOWE69/NFSMWRELEASE.ELF` 和 `mw/SLES-53558/NFS.ELF.fixed` 并将它们都复制到项目的根目录。将 `NFS.ELF.fixed` 重命名为 `NFS.ELF`。 - 下载 [ghidra-cli](https://github.com/akiselev/ghidra-cli) 并将其放入您的路径中。 - 告诉 ghidra-cli 您的 Ghidra 安装路径 ghidra config set ghidra_install_dir /ghidra_11.4_DEV_20250425/ghidra_11.4_DEV - 告诉 ghidra-cli Ghidra 项目的路径 ghidra config set ghidra_project_dir - 将 NeedForSpeed 设置为默认项目 ghidra config set default_project NeedForSpeed - 将 GC 版本设置为默认程序 ghidra config set default_program NFSMWRELEASE.ELF ## 工作流程 只需告诉您最喜欢的助手参考 `AGENTS.md` 来反编译您选择的翻译单元,例如 `main/Speed/Indep/SourceLists/zEAXSound`。 # 贡献者 特别感谢 [Brawltendo](https://github.com/Brawltendo) 协助工具开发并让我使用他的部分反编译成果。 特别感谢 [r033](https://github.com/r-033) 和 [Toru the Red Fox](https://github.com/TorutheRedFox) 与我们分享他们的知识。
标签:C++, DNS解析, GameCube, NFS: Most Wanted, Ninja, PS2, Python, UML, URL提取, Xbox 360, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 反编译, 复古游戏, 开源项目, 数据擦除, 无后门, 极品飞车, 游戏开发, 游戏模组, 源码还原, 逆向工具, 逆向工程, 静态分析