如何逆向 NDS 游戏(上):配置环境
本教程将使用任天堂
关于本教程
本教程将手把手教你:
- 配置逆向工程环境。
- 入门汇编语言。
- 使用逆向工具
Ghidra 分析汇编代码。 - 使用
DesmuME 模拟器的调试工具:检查游戏内存 / 运行时调试。 - 寻找游戏资源和数据的逆向工程策略。
本教程讨论了一些特定于
跟随本教程需要什么技能?
- 编程知识(最好有
C 或 C++),加上下列相关方面: - 指针
- 结构体
- 位运算
- 16
进制数字
- 能使用模拟器基本顺畅地运行游戏。
- 对游戏逆向感兴趣!
什么是逆向工程
在编程语境里,逆向工程是指在不访问程序的原始实现(即源代码、文档等)的情况下弄清楚程序如何工作的过程。大多数游戏不会公开发布源代码,但可以通过分析游戏文件中的二进制数据来了解和重建游戏的许多细节。
对游戏进行逆向工程有几个原因:
游戏知识
游戏隐藏了许多有关其机制和实现的细节,游戏中的经验实验只能让你走这么远。进入逆向工程,你可以分析游戏的代码并准确了解游戏的工作原理。有了足够的游戏知识,人们可以运用这些知识来构建有用的工具,例如宝可梦战斗伤害计算器,乃至战斗模拟器。
打 Mod / 破解
在没有内置关卡编辑器的情况下,如何在游戏中构建自定义关卡、创建可让你无限飞行的作弊代码或为角色提供自定义的搞笑武器?大多数情况下,人们会对游戏进行逆向工程,最终搞明白如何修改游戏代码以添加这些功能。作弊代码(即
利用游戏漏洞
有一类漏洞被称为任意代码执行 (Arbitrary Code Execution, ACE),它允许玩家将代码注入游戏,以执行硬件支持的几乎所有操作。包括无限物品、立即跳转到片尾字幕,甚至将
解包获得情报
在内容定期更新的游戏中,开发人员有时会在游戏正式发布之前将新的游戏资源添加到游戏中。早期发布的演示版本还可能隐藏着完整游戏的部分内容。对游戏进行逆向工程以提取这些资源,并在正式发布之前了解新内容。
配置逆向工程环境
需要首先准备好以下软件:
- Ghidra - 用于静态代码分析的逆向工程工具。
- DeSmuME - 具有调试和内存查看功能的
NDS 模拟器。 - 《宝可梦不可思议的迷宫:空之探险队》的
ROM - 我们将要逆向工程的游戏。请确保使用游戏的 USA/NTSC 版本;其他版本如 EU/PAL 版本数据和功能的位置不同。
本教程使用
DeSmuME 作为首选的 NDS 模拟器,但值得一提的是另一个常用于调试的 NDS 模拟器 [No\(GBA](https://www.nogba.com/)。No\)GBA 具有比 DeSmuME 更高级的调试功能,但稳定性较差且用户不友好。
只有
以下
Ghidra 配置教程改编自 UsernameFodder 的出色指南,出自 pmdsky-debug 项目。
解压 ROM
要开始分析
使用 DSLazy
- 下载
DSLazy 并解压 zip 文件。 - 运行
DSLazy 的可执行文件( dslazy.exe
),启动程序。
- 单击
DSLazy 窗口左上角的 …
,然后在文件系统中选择《空之探险队》的ROM 文件。 - 单击
nds unpack 按钮解压 ROM。这需要几秒钟才能完成。有时即使成功完成,DSLazy 也无法显示解压已完成。如果解压时间超过几秒钟,请检查下一步以查看文件是否已解压。 - DSLazy
将打开文件资源管理器,其中包含一个包含解压文件的文件夹。此文件夹名为 “NDS_UNPACK”,位于 DSLazy 所在的文件夹中。
使用 ndstool
- 下载
ndstool(.tar.bz2 文件)并打开存档。 - 打开终端并
“cd” 到解压的 “ndstool-2.1.2” 文件夹,然后运行 “./configure && make && make install”。
- 根据你的权限,你可能需要运行
“sudo make install” 而不是 “make install” 以使用管理员权限运行安装。
- 创建一个文件夹来存储解压后的 ROM 文件,然后
“cd” 到该文件夹。 - 运行
ndstool -9 arm9.bin -7 arm7.bin -y9 y9.bin -y7 y7.bin -d data -y overlay -t banner.bin -h header.bin -x <ROM path>
,其中<ROM path>
是文件系统上《空之探险队》的 ROM 的文件路径。ROM 将被解压到你创建的文件夹中。
设置 Ghidra
Ghidra
对业余爱好者来说,Ghidra
是理想的代码分析、反汇编工具,功能齐全且无需付费。Ghidra 也有付费替代品,作为逆向工程行业标杆的专业商业软件 IDA。不过,IDA 的完整版本售价数千美元,对许多业余爱好者来说都太贵了,而 IDA 的免费版本又没有足够的功能满足我们的需求。
要安装
如果你使用的是较新版本的Ghidra/Features/Decompiler/os/mac_x86_64
,右键单击decompile
open
,并在open
。
安装后启动
创建 Ghidra 项目
使用解压缩的《空之探险队》ROM
- File > New Project…
- 项目默认设置为
“Non-Shared Project”。点击 Next。 - 选择项目名称和保存项目的目录,然后点击
Finish。 - File > Import File…
- 从解压缩的
ROM 文件中选择 arm9.bin 文件。 - 为
Ghidra 选择一个指令集架构(Language)来分析该二进制文件。NDS 使用 ARMv5T(具体来说是 ARMv5TE)指令集,采用小端序(ARM:LE:32:v5t),你可以通过在 language 选择中搜索 “v5t” 找到,然后选择 Endian 列下带有 “little” 的选项。
点击
Options…并将基址(Base Address)设置为 02000000。 点击
OK 让 Ghidra 检查该二进制文件。 完成后,Ghidra
会显示一些检查细节的报告。点击 OK 继续。 双击
Ghidra 中的 ROM 来打开 Ghidra 的代码查看器。 Ghidra
会提醒是否分析二进制文件。暂时点击 No,因为还要做一些设置。 如果此时运行分析,也不会造成任何不良影响。Ghidra
只是会根据现有信息进行部分分析,稍后可以在一切都设置好之后重新运行分析。 点击
File > Add To Program,然后在解压缩的 ROM 文件中查找 overlays
文件夹。选择该文件夹中的 overlay_0029.bin
。点击
Options… 将块名称设置为
“overlay_0029.bin”。 块名称不会影响分析,实际上可以是任何名称。不过我建议使用与
overlay 文件相同的名称以便于跟踪。 将基址设置为
22DC240。 点击
OK 确认你设置的选项,点击 OK 添加 overlay,然后当 Ghidra 显示添加完成时再点击 OK。 你可能注意到选项中有一个
Overlay 复选框,但对现在来说没啥用。请保持未选中状态以避免干扰 Ghidra 的分析。 使用
overlay 文件 overlay_0010.bin
重复步骤 12-16。使用 22BCA80 作为该文件的基址。 使用
overlay 文件 overlay_0031.bin
重复步骤 12-16。使用 2382820 作为该文件的基址。 通过选择
Analysis > Auto Analyze ‘<project>’…
运行分析,或使用热键 ‘a’。使用默认的分析设置并点击
Analyze。 等待
Ghidra 分析二进制文件。这可能需要几分钟。 当
Ghidra 的分析完成后,验证 Ghidra 是否正确设置。按 ‘g’,输入 “22E0354”,然后按 OK。你应该会看到如下页面。此时,Ghidra 已经设置完成,可以开始逆向工程游戏。
设置步骤解惑
如果我不告诉你,你咋知道要选
首先,搜索
至于端序(endianness)(数据中每个字(word) 的字节存储顺序),大多数
项目设置在添加
有些游戏会压缩arm9.bin
设置 DeSmuME 以运行《空之探险队》
设置好
- 从
DeSmuME 网站下载 DeSmuME 的最新稳定版本,并解压到心仪的文件夹中。 - 打开
DeSmuME,转到 File > Open ROM…,然后在文件系统中选择《空之探险队》的 ROM。确保使用原始 ROM(.nds)文件,而不是从中解压的文件。 - 如果需要,请在
Config > Control Config 查看和配置按钮映射。 - 观看游戏的介绍过场动画,然后开始新游戏。
- 游戏开始时有一个个性测验,它将决定你的玩家角色。回答问题,无论诚实与否,游戏都会为你分配一只神奇宝贝。
- 为自己、伙伴宝可梦和伙伴选择一个名字。
- 决定玩家和伙伴宝可梦后,你将进入过场动画。过场动画结束后,你将进入游戏的第一个迷宫,Beach Cave。
- 进入
Beach Cave 后,你就可以对游戏进行逆向工程了。
设置好