制作 Switch 游戏金手指文件
2024-03-17 17:33:41

作弊工具

目前在大气层系统中,作弊工具有两个:EdiZon SEBreeze。都出自同一个作者。
EdiZon SE 是老牌工具,UI 操作反人类,相关教程与工具会多一写。
Breeze 是新秀,UI 更人性化,速度更快,支持修改汇编代码。

内存区域概念

作弊分为两类,修改游戏数据和修改游戏逻辑代码。

  1. 修改数据:向内存区域写入数据,比如将金币改为 9999。这种方式不需要了解汇编代码。
  2. 修改逻辑:改变程序的执行逻辑,比如购买物品会扣掉 100 金币,改为购买物品增加 100 金币。


无论是哪种方式,都需要先找到要修改的内存地址,而内存地址可能是会随着每次启动游戏而变动的。
为了搞清有哪些内存区域,可以用在 IDA 附加后,在下方命令栏输入get info查询,得到信息如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GDB>get info
Process: 0x89 (Application)
Program Id: 0x01007ef00011e000
Application: 1
Hbl: 0
Layout:
Alias: 0x5b9a200000 - 0x6b9a1fffff
Heap: 0x765e400000 - 0x785e3fffff
Aslr: 0x0008000000 - 0x7fffffffff
Stack: 0x6f25a00000 - 0x6fa59fffff
Modules:
0x350d600000 - 0x350d601fff nnrtld.elf
0x350d604000 - 0x350f72dfff U-King.nss
0x351036a000 - 0x35106ddfff multimedia.elf
0x3510a87000 - 0x3510fb4fff nnSdk.elf

留意后缀为 .nss 的模块,这是主程序的代码区,也就是所谓的 Main 区段,当我们要修改程序逻辑的时候就是针对这一块区域。
另一个要关注的就是 Heap 区段,几乎绝大多数游戏数据都会在这一块区域。

另外,也可以用 Breeze 来查看游戏内存布局信息:

制作金手指文件

这里以塞尔达传说:旷野之息为例。游戏信息:

1
2
TID:01007EF00011E000
BID:8E9978D50BDD20B4

数据搜索过程很简单就不多说了。卢比的修改地址是:
真实数值:heap + 0E435B40
显示数值:heap + A0E26620

金手指文件格式是怎样的呢?不得不先看看大气层官方文档 作弊码格式 一节。
卢比是 u32 类型,占用 4 字节。并且我们是向 Heap 区域写入,那么最终的金手指格式如下:

1
2
3
[10000 卢比]
04100000 0E435B40 00002710
04100000 A0E26620 00002710

第一部分是操作码,第二部分是前面内存偏移地址,第三部分是待写入的值。

然后将文件保存到sdmc:/atmosphere/contents/{TID}/cheats/{BID}.txt
其中 TID 是应用的标识符,每个程序唯一的。BID 对应该游戏的不同版本,每个版本有不同的 BID。

最后看看效果,成功!

搜索指针

实际上,heap 的地址是不稳定的,是易变的。虽然不知道为什么我重开游戏后金手指仍然有效,但是要稳定的话还是建议用指针定位内存地址。

JNoexs 附加到游戏,搜索一次数据后软件会在当前目录tmp下生成一个.dmp文件。
第一次搜索数据需要很长时间,因为是全内存搜索。搜索时切记不要让 Switch 息屏,否则软件会停止工作。

然后切换到Pointer Search页面,Dump File选择刚才产生的.dmp文件,Address选择数据内存地址,main填入 main 区起始地址,其他设置保持默认就行了

运气好的话,Output区域会显示一个结果,那么就可以制作金手指了。
但如果结果非常多,那么就尝试将Max Offset设置更大些再搜索。

用指针定位内存地址的方式在制作金手指时要稍微复杂一点点,可以用 Simple SX OS Code Builder 这款工具来生成金手指代码。

相关资料

GDB for Switch Modding Cheatsheet/Tutorial
Cheats
Swtich金手指制作 指针寻找 Noexes使用全面教程
Jnoexs查找指针地址金手指代码制作