Skip to content

pret 反编译项目

是什么

pret 是一个知名的逆向工程社区项目,致力于将经典 Pokémon 游戏的 ROM 完整反编译为可编译的 C 源代码。其中 pokeemerald 是 pret 项目针对 Pokémon Emerald(绿宝石版)的反编译成果,托管在 GitHub 上的 github.com/pret/pokeemerald 仓库。该项目的代码质量极高,编译产物与原始 ROM 逐字节一致。

为什么需要

pret/pokeemerald 是 pokeemerald-wasm 项目的代码基础。没有 pret 项目的反编译成果,将 Pokémon Emerald 移植到浏览器中运行几乎不可能实现:

  • 完整源码:pret 提供了整个游戏的 C 源代码,包括游戏逻辑、图形渲染、音频处理、UI 系统等所有模块。
  • 可编译验证:源码可以通过 devkitARM 编译为与原始 ROM 完全相同的 .gba 文件,确保反编译的正确性。
  • 代码注释:社区对代码进行了大量注释,帮助理解游戏内部的工作机制。
  • 构建系统:提供了完整的 Makefile 和构建脚本,支持灵活的编译配置。

原理与实现

反编译过程

pret 项目的反编译是一个极其复杂的过程,大致包括:

  1. ROM 解析:使用工具(如 binutilsmGBA 调试器)分析 ROM 的二进制结构。
  2. 反汇编:将 ARM/Thumb 机器码反汇编为汇编代码。
  3. 函数识别:识别每个函数的边界、参数和返回值。
  4. C 代码重构:将汇编代码手动重写为等效的 C 代码。
  5. 数据结构还原:还原游戏中的结构体、数组、常量等数据定义。
  6. 资源提取:将 ROM 中嵌入的图形、音频、地图数据等资源提取为独立的文件。
  7. 验证:编译 C 代码并与原始 ROM 进行二进制对比,确保逐字节一致。

代码结构

pret/pokeemerald 的代码库结构大致如下:

  • src/ — 游戏 C 源代码(主逻辑、战斗系统、地图系统等)
  • data/ — 游戏数据(地图、精灵、技能等配置)
  • graphics/ — 图形资源(精灵图、背景图、UI 等)
  • sound/ — 音频资源
  • include/ — 头文件
  • tools/ — 构建辅助工具
  • Makefile — 构建脚本

匹配验证

pret 项目的一个核心原则是"匹配"(matching)——编译产物必须与原始 ROM 完全一致。这通过在 Makefile 中使用 COMPARE=1 选项来验证,构建系统会自动对比编译输出和原始 ROM 的哈希值。

在 pokeemerald-wasm 中的实现

pokeemerald-wasm 基于 pret/pokeemerald 的代码库,在其基础上添加了 WebAssembly 编译支持:

  1. 代码库分支:pokeemerald-wasm 是 pret/pokeemerald 的一个分支(fork),保留了原始代码结构。
  2. Wasm 适配:添加了 Wasm 编译所需的适配代码,包括:
    • 硬件抽象层的替换(如 I/O 寄存器访问改为内存操作)。
    • AgbMainWasmRunFrame 等 Wasm 入口函数。
    • 音频输出的 Web Audio API 桥接。
  3. 构建系统扩展:在原始 Makefile 基础上添加了 Wasm 构建目标,支持使用 Clang + wasm-ld 编译。
  4. 资源处理generate_wasm_assets.py 脚本处理原始构建路径中的 INCGFX/INCBIN 资源引用,将其转换为 Wasm 可用的格式。
  5. Web 前端:添加了 app.js 等 Web 文件,负责渲染、输入处理和 Wasm 模块加载。

相关概念

  • GBA — pret 反编译项目的目标硬件平台
  • devkitARM — pret 项目使用的编译工具链