马里奥弹珠乐园(GBA)的逆向工程和修改

这是一篇关于使用 Ghidra 对《Mario Pinball Land for GBA》进行逆向工程并尝试修改游戏的文章,主要内容如下:

  • 游戏现状及问题:《Mario Pinball Land for GBA》存在控制受限(二进制弹球控制和缺少桌子推动控制)、音轨通用、游戏存档易丢失、游戏玩法单一(房间简单无滚动、 boss 重复使用)、游戏难度人为增加(离开房间进度丢失等)等问题。
  • 工具与设置:使用 Ghidra 进行逆向工程,搭配 NO$GBA 模拟器进行调试,VisualBoyAdvance-M 用于作弊查找功能。将文件导入 Ghidra 后设置相关语言和映射地址。
  • 游戏修改内容

    • 修复游戏存档:通过查找 DMA 寄存器相关代码,找到保存数据的布局和无效化原因,将保存验证常量修改为正确值,解决了意外断电导致存档无效的问题。
    • 添加模拟弹球板:通过查找弹球板移动代码,修改其以接受模拟值,实现了模拟弹球板控制,并在模拟器中进行了测试。
    • 允许所有门打开:通过查找控制门打开的函数,将其修改为不限制门打开数量,解决了游戏中不能同时打开所有门的问题。
    • 降低门的星星要求:通过修改创建门和控制门访问的代码,降低了某些门的星星要求,使游戏更容易。
    • 增加可用内存:将 ROM 大小从 8MB 增加到 16MB,释放了 EWRAM 空间用于游戏修改,同时提取并解压了一些资源。
    • 理解关卡控制流程:确定了游戏中与关卡控制相关的主要函数和数据结构,包括关卡切换、设置、循环等过程,以及关卡之间的链接关系。
    • 保存关卡数据:通过在关卡切换时保存和恢复更多关卡数据(如门状态、敌人、硬币和星星等),去除了关卡重置机制,提高了游戏体验。
  • 总结与展望:文章因篇幅较长而在此处停止,作者成功通过逆向工程修改了游戏的核心功能,虽然对 Ghidra 的反汇编功能有些失望,但对其 decompiler 仍持乐观态度,未来可能会继续为游戏添加新内容。
阅读 24
0 条评论