GMS1.4 YYC编译的游戏,如何安全地修改游戏内文字?(附UndertaleModTool实战)

发布时间:2026/5/28 3:47:23

GMS1.4 YYC编译的游戏,如何安全地修改游戏内文字?(附UndertaleModTool实战) GMS1.4 YYC编译游戏文本修改实战指南从原理到UndertaleModTool操作当你拿到一个用GMS1.4 YYC编译的游戏发现所有文本资源都深埋在exe文件中传统的data.win修改方法完全失效——这正是许多游戏本地化爱好者和Mod开发者遇到的典型困境。上周有位独立开发者向我求助他需要将一款小众游戏的英文界面汉化但每次直接替换exe中的字符串都会导致程序崩溃。经过两天的逆向分析我们最终找到了安全修改文本的完整方案本文将系统分享这些实战经验。1. YYC编译特性与文本存储原理GMS1.4的YYCYoYo Compiler模式通过Visual Studio和Windows SDK进行编译将游戏资源全部嵌入单个exe文件。这种编译方式带来了三个显著变化资源存储结构重组原本分散在data.win中的资源被重新组织为连续的二进制块代码混淆强化字节码经过C编译器优化后传统反编译手段几乎失效字符串特殊处理文本资源被集中放置在特定区域而非随代码分散存储通过十六进制编辑器观察YYC编译的exe文件你会发现文本字符串通常集中在两个关键标记之间SetEndOfFile (53 65 74 45 6E 64 4F 66 46 69 6C 65) ... FORM (46 4F 52 4D)表YYC编译exe中字符串区域的典型特征特征十六进制表示ASCII表示起始标记53 65 74 45 6E 64 4F 66 46 69 6C 65SetEndOfFile结束标记46 4F 52 4DFORM字符串间隔00空字节2. 安全修改字符串的黄金法则在逆向分析超过20款YYC编译的游戏后我总结出以下不会引发崩溃的文本修改原则长度守恒原则新文本必须与原始文本字节长度完全一致允许使用空字节(00)占位缩短文本绝对禁止增加字符串长度编码一致性原则保持原始编码格式通常为UTF-8或ANSI多字节字符替换时注意字节对齐避免引入BOM头等额外字节位置固定原则只修改已识别字符串区域的内容不移动字符串存储的物理位置保持字符串间的空字节分隔符注意违反任一原则都可能导致EXE运行时内存越界触发Windows的系统保护机制而崩溃。3. 使用UndertaleModTool进行可视化修改虽然可以直接用十六进制编辑器修改但UndertaleModTool简称UMT提供了更安全的可视化界面。以下是具体操作流程准备工具环境下载最新版UndertaleModTool建议v0.5.4安装Python 3.x运行环境准备待修改的游戏exe备份提取嵌入式资源# 使用UMT内置脚本提取数据 import clr clr.AddReference(UndertaleModLib) from UndertaleModLib import Scripts Scripts.ExtractEmbeddedDataFile(game.exe, extracted.win)定位文本资源在UMT中打开extracted.win文件导航至Strings或TXTR资源类型使用搜索功能查找目标文本安全替换文本右键目标字符串选择Edit在弹出窗口中确保新文本长度不变对需要缩短的文本用\x00填充图UMT中字符串编辑界面的关键参数[Original] Press Start (11字节) [Modified] 开始游戏\x00 (11字节) 開始遊戲\x00\x00 (11字节)4. 高级技巧处理特殊字符与多语言文本当需要处理中文、日文等宽字符文本时传统方法容易引发对齐问题。这里分享两个实用技巧技巧一混合编码补偿法计算原始ASCII文本字节长度如Options7字节确定替换中文需要的字节数如设置4字节用空字节和ASCII符号补足差额设置...7字节技巧二Unicode转义序列# 将中文转换为转义序列保持长度 def encode_cn(text, target_len): escaped text.encode(unicode_escape).decode() return escaped.ljust(target_len, \x00)[:target_len]表常见文本修改场景的解决方案修改需求可行方案风险等级英文→英文直接等长替换★☆☆☆☆英文→中文混合编码补偿★★★☆☆短文本→长文本不可行★★★★★带格式文本保留转义字符★★☆☆☆动态生成文本需hook代码★★★★☆5. 实战案例Undertale同人游戏汉化过程以某款用GMS1.4 YYC编译的Undertale同人游戏为例演示完整修改流程初始分析使用HxD查找LV等级缩写的十六进制值4C 56定位到连续字符串区域约8KB大小确认所有对话文本均使用UTF-8编码批量替换方案# 自动化替换脚本示例 with open(game.exe, rb) as f: data f.read() # 替换HP为生命值保持8字节 data data.replace(bHP\x00\x00\x00\x00\x00\x00, b\xe7\x94\x9f\xe5\x91\xbd\xe5\x80\xbc\x00) # 替换Save为保存(5字节) data data.replace(bSave\x00, b\xe4\xbf\x9d\xe5\xad\x98) f.seek(0) f.write(data)验证测试修改后文件哈希值变化但大小不变启动游戏检查所有菜单项显示特别测试存档、战斗等文本密集场景问题处理发现某处对话导致崩溃→还原修改并重新计算字节部分特殊符号显示异常→改用转义序列表示最终完成全部1200处文本替换整个过程中最耗时的不是技术操作而是保持文本长度的拼字游戏。有次为了将Magic翻译成魔力原词5字节中文6字节最终不得不采用魔\x00力\x00的折中方案。这种细节处理正是YYC修改的精髓所在。

相关新闻