3DNes字符串汉化不成功的问题定位解决

查看 47|回复 2
作者:lies2014   
3DNes字符串汉化不成功的问题定位解决
这篇文章的起因是来自 shaokui123 在论坛的求助帖:
https://www.52pojie.cn/thread-1927454-1-1.html
(原帖附件火绒报毒并成功杀毒,我在百度云盘传了一份杀过毒的以供练手:
链接:https://pan.baidu.com/s/1QD-ffT2LAalOoE7jXxaYQw 提取码:0fkp)
shaokui123 在汉化 3DNes 的过程中遇到两处汉化不成功的字符串(位于文件“\3DNes\3dnes_Data\level0”中):
1、文件偏移 0x1E7A0 处的字符串“Depth”
2、文件偏移 0x197B8 处的字符串“Open”
一、“Depth”汉化
需要汉化为两个字的 UTF8 编码汉字,占用 6 各字节
字符串会有长度信息和不带长度信息两种,前者根据长度信息读取相应位数的字符串,后者遇到0才停止读取
再看看字符串之前4个字节,“05”这个数字正好是字符串的长度,猜想有可能是长度信息,把它改成“06”试试,果然就成功了。这处比较简单,下一处就有点麻烦了


image.png (11.83 KB, 下载次数: 0)
下载附件
2024-6-10 16:51 上传

二、“Open”汉化
这个字符串藏得比较深,打开程序(注意勾选窗口化,否则全屏了),点击“Play”按键,再点击“Open”按键,下一界面出现的“Open”按键才是汉化不成功的目标字符串
这个字符串之前也有长度信息,但改过之后,整个按键的文字都不显示了,猜测还有地方限制了显示长度
这个软件是个 Unity 程序,试过用 AssetStudio 查找资源,也没有头绪,看来还得硬钢
首先想到的是要找到这个字符串出现的代码位置,再跟踪程序是如何处理这个字符串的,看看是否有线索
(“Open”在文件中出现两次,为了便于分析,把目标字符串改成了“1pen”)
1、先在内存中搜索“1pen”这串字符,找不到,改成搜索 Unicode,这次倒是搜到了,但这已经是转换过的,不是数据来源
考虑到字符串保存在文件“level0”中,要使用肯定要先读取
用调试器 x32dbg 载入主程序,在 API ReadFile 上下断点,运行至断下后回溯到用户代码
[Asm] 纯文本查看 复制代码00B491BD call dword ptr ds:[]        
00B491C3 mov esi,eax        
发现读取了很多不同的文件,“level0”也是分段多次读取,怎样才准确定位到“1pen”读入的时机呢?
在地址 0xB491C3 下断点(此时 ReadFile 已执行完毕将文件读入内存),并编辑断点条件如下:
暂停条件:$result>0 (找到结果暂停)
命令:findallmem 0,"31 70 65 6E" (内存查找“1pen”)
命令条件:strstr(utf8(ebx),"level0" (文件名包含“level0”)
运行后一会儿成功断下,查看内存,字符串“1pen”已经读入
2、在字符串“1pen”上设置硬件访问断点,继续执行后断下,但断下的位置看不出端倪
我们来到“堆栈调用”标签中查看堆栈回溯,看到经过了多级调用才来到断点位置
[table][tr][td]地址

字符串, 汉化

ccb666   

有的软件翻译成gb18030的中文显示乱码,是啥原因?
xiaofan1990   

大神学习了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部