yuzu 金手指完全指南:从 Cheat 文件写到高级地址技巧,一次讲透如何修改游戏参数
【免费下载链接】yuzu项目地址: https://gitcode.com/GitHub_Trending/yuz/yuzu
很多新手以为 yuzu 的"金手指"就是往某个地址填个数字,但真实机制比这有意思得多——它运行着一个内置的作弊虚拟机,每 1/12 秒执行一次你写好的指令序列,可以写内存、跳指令、读按键、甚至暂停游戏进程。本文带你绕开各种"传抄攻略"里的错误说法,直接对着 src/core/memory/ 里的实现,讲清楚 yuzu cheat 到底怎么写、放哪里、怎么生效,以及不生效时该查什么。
先破除一个误区:yuzu 不用 INI,而是"指令序列"
不少教程声称 yuzu 的配置文件长这样:
[无限生命] address = 0xABCDEF value = 0x64这并不符合 yuzu 的实际实现。真正被加载的是纯文本指令文件,解析逻辑在 src/core/memory/cheat_engine.cpp 的TextCheatParser::Parse里:它以[名称]作为一条 cheat 的起始标记,之后连续读取每 8 位十六进制数作为指令(opcode),空格和换行会被直接忽略。
换句话说,yuzu 的 cheat 文件更接近一台迷你计算机的程序:每条 32 位指令都描述"往哪块内存区域、按什么规则写什么值"。执行引擎则是 src/core/memory/dmnt_cheat_vm.cpp 中的DmntCheatVm,它带有一套寄存器、条件栈和循环结构,能力远不止"改一个数"。
文件放哪里:目录结构决定一切
加载逻辑在 src/core/file_sys/patch_manager.cpp 的PatchManager::CreateCheatList中,它按以下规则查找文件:
加载目录(Load 目录)→ 以16 位十六进制标题 ID命名的文件夹 →
cheats子目录 → 以build ID命名的.txt文件
举个具体例子:
load/ └── 0001000000012345/ ← 标题 ID(16 位十六进制) └── cheats/ ├── 5AB3C2D4...txt ← 该版本 build ID 命名,精确匹配 └── global.txt ← 通用文件,找不到 build ID 文件时回退使用两个实用细节:
- 精确优先:先用 build ID 匹配文件名,匹配不到才回退到通用文件,所以你可以给游戏不同更新版本配不同的 cheat(例如 v1.0.0 和 v1.1.0 内存布局变了)。
- 在界面里直达:yuzu 主界面游戏列表右键菜单里有 "Mod Data" 入口,会直接打开
加载目录/<标题ID>这个文件夹,实现见 src/yuzu/main.cpp,不用自己手打十六进制路径。
五分钟上手:一个能跑的 cheat 文件
文件内容遵循"标题行 + 8 位指令"的极简规则:
[全局设置] 01D3F910 [加血补丁] 01D40A2C 01D40A2D- 第一行的
[名称]会显示在勾选列表里,Parse函数会把它截断存储进CheatDefinition::readable_name; - 每条指令是 8 位大写十六进制数,指令的具体编码由
DmntCheatVm的解码逻辑解释,包括写 32/64 位值、跳转指令、读内存条件、按键触发暂停等类别; - 第一条(通常叫"Global")承载全局状态,建议保留一个空的
[Global]头部。
提示:完整指令编码(写值、比较、循环、按键触发等)定义在 src/core/memory/dmnt_cheat_vm.h 的枚举与指令结构体中,想自己"造"高级 cheat 时照着它写即可。
进阶:四块地址空间,对应四种地址前缀
yuzu 允许 cheat 指定"相对哪块区域取地址",这是它比"写死绝对地址"强大的核心原因。GetCheatProcessAddress(同样在 src/core/memory/dmnt_cheat_vm.cpp)支持四种区域:
| 区域 | 含义 | 适合场景 |
|---|---|---|
| MainNso | 游戏主代码段 | 改代码常量、数据表(默认区域) |
| Heap | 堆内存 | 改运行时动态分配的数值,如生命值、金币 |
| Alias | 别名映射区 | 处理 Switch 特有的内存别名映射 |
| Aslr | 随机化加载区 | 指向随机基址加载的内容 |
由于 ASLR 会让部分地址每次启动都变,用"区域 + 相对偏移"的写法天然免疫这一点——这也是为什么不建议把别人贴的绝对地址直接抄进自己的文件。
引擎的防护逻辑在StandardVmCallbacks里:非法地址的写操作会被直接跳过(记一条 Debug 日志),非法读返回 0,所以写错地址通常表现为"没效果",而不是当场崩溃——这给了你排错的余地。
不生效?按这个顺序排查
| 症状 | 最可能的原因 |
|---|---|
| 文件放了却完全没加载 | 目录层级不对(缺cheats子目录)、标题 ID 位数不足 16 位 |
| 加载了但无效果 | build ID 对不上(游戏更新过)、地址区域(MainNso/Heap)选错、相对偏移过期 |
| 只在游戏刚启动时无效 | 正常现象,CheatEngine::Initialize启动时页面表尚未就绪,代码里对这种情况有专门的宽松处理 |
| 想确认它到底在跑 | 打开调试日志,搜索CheatEngine标签,每次执行都会输出指令指针和寄存器状态 |
另外,per-game 的 Add-Ons 管理界面(src/yuzu/configuration/configure_per_game_addons.cpp)会以列表形式展示当前游戏检测到的 Mod / Cheat / Patch,勾选即启用,无需重启游戏——因为CheatEngine注册了 1/12 秒一次的定时任务(见 src/core/memory/cheat_engine.cpp 的FrameCallback),热重载会立即把新指令注入虚拟机。
风险与边界,一次说清
- 存档风险:写 Heap 的 cheat 改的是游戏自己维护的运行时数据,写得激进(比如数值溢出游戏预期范围)可能污染存档,用之前先备份。
- 在线游戏:多人模式下的内存修改可能触发反作弊或影响联机行为,建议在单机环境使用。
- 版本敏感:游戏更新后 NSO 的 build ID 和内部偏移都会变,旧的 cheat 文件基本需要重新适配。
小结
yuzu 的金手指本质上是一个按标题 ID + build ID 定位、以 1/12 秒为节拍运行的指令虚拟机:文件放对位置、格式用"名称行 + 8 位十六进制指令"、地址用区域相对偏移而非裸绝对地址,这三点掌握之后,从改数值到跳指令都能自己搭出来。想深入时,直接翻 src/core/memory/ 下cheat_engine与dmnt_cheat_vm两个文件,全部机制都摊开在那里。
【免费下载链接】yuzu项目地址: https://gitcode.com/GitHub_Trending/yuz/yuzu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考