当前位置: 首页 > news >正文

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修改的精髓所在。
http://www.rkmt.cn/news/1409959.html

相关文章:

  • 【MATLAB源码-第450期】基于MATLAB的GMSK调制系统中IQ相干、差分、鉴频与Viterbi解调算法对比仿真
  • ROCK5B新手避坑指南:用BalenaEtcher给NVMe刷Debian11,从驱动安装到首次登录的完整流程
  • 2026支持百度AI优化的GEO服务商测评:服务优质响应高效
  • 2026年4月花灯供货商怎么选,景区灯会/大型户外花灯/天幕花灯/春节国潮花灯/春节花灯/巡游花灯,花灯定做厂家推荐分析 - 品牌推荐师
  • 手把手教你用Ascend-Docker-Runtime部署昇腾AI推理容器:从环境配置到避坑指南(CANN 5.0.1)
  • 论文同时踩查重和AI检测红线?双效处理工具实测推荐
  • ChatGPT餐厅推荐生成的5大致命误区:92%开发者忽略的上下文断裂、地域偏差与合规雷区
  • ChatGPT谜题求解失效真相(92%用户忽略的思维建模断层)
  • 别再死磕ImageNet预训练了:实战中工业缺陷检测模型的‘水土不服’与调优方案
  • 从一次失败的渗透说起:我是如何审计Maccms搜索功能并挖到命令执行漏洞的
  • 全网最稳!WSL/Ubuntu 环境下部署 Ollama 的踩坑实录与避坑指南
  • 【网安-Web渗透测试-免杀系列】PowerShell免杀
  • 告别65535行限制:用QGIS一键把大型SHP文件导出为Excel表格
  • 如何高效使用AutoDingding实现钉钉自动打卡:终极实用指南
  • k8s-Prometheus的manifests 清单部署
  • 别再死记硬背公式了!用LTspice仿真带你直观理解Buck、Boost、Buck-Boost三大基础拓扑
  • LAMMPS转Material Studio数据流打通:从Perl脚本到MS建模的完整避坑实践
  • 别再只调包了!用PyTorch从零实现DCGAN生成二次元头像(附完整代码与数据集)
  • Agent进化,腾讯云全栈融合矩阵构建国产数字化底座
  • 从表单验证到数据统计:手把手教你用some、every和reduce搞定前端常见业务场景
  • 平平无奇的源码,竟藏着Agent的核心秘密?
  • 网站渗透实操!从getshell到CVE提权,Linux最新内核也可提权!
  • 从Arduino到ESP32:搞定3.3V/5V混接通信,这几种电平转换电路你试过吗?
  • Python实战:用XGBoost+SHAP搞定多分类业务预测(附完整代码与避坑指南)
  • LAMMPS新手避坑指南:从应力云图到MSD分析,这8个计算命令别再写错了
  • 告别手动移植:用STM32CubeIDE一站式搞定STM32WL的LoRaWAN节点工程
  • 从普通到Low ESR:手把手教你读懂铝电解电容规格书里的‘损耗角’与ESR换算
  • 保姆级教程:用Grad-CAM可视化Swin Transformer,看看你的模型到底在“看”哪里
  • 别让天线罩毁了你的毫米波雷达!从材料选择到壁厚计算,一份给硬件工程师的避坑指南
  • 信号处理/通信算法必看:用Wirtinger导数搞定复数域梯度下降(附Python代码)