想要汉化一个游戏遇到的程序破解问题
本帖最后由 zmrn 于 2020-5-12 21:29 编辑这两天出于兴趣想要汉化一个文字游戏,于是开始撬游戏的程序。本人没有什么逆向经验,这是第一次正儿八经破解程序。幸好程序也没有加壳。
其中.arc文件为游戏打包的文件,包含了各种图片,语音,音效等。
用了一个日本人写的提取器exoozoarc(http://asmodean.reverse.net/pages/exoozoarc.html),从.arc文件中提取出了.ws2格式的游戏脚本。发现ws2脚本是加密的。
从下面的文章里知道了ws2脚本是循环位移加密,顺便用了帖子里的程序来解密。(然后就顺便一直用Nodejs写的代码)
https://zhuanlan.zhihu.com/p/42466485
日本的文字游戏往往在中文系统的windows上不转区是无法直接玩的,因为打开以后文字是乱码。必须转到日区才能正常游玩。
这个游戏很独特的一点是,它不需要转区就可以正常打开显示日语。我本以为它脚本是utf-8写的,可是打开ws2以后可以看到,实际上脚本里的日文还是shift-jis编码的。
我试着写了个nodejs脚本提取文本,然后替换成utf-8的中文编码,然后根据exoozoarc的源代码和.arc文件的结构写了一个封包程序。
替换成utf-8的中文脚本,果然游戏无法正常显示,是乱码。
于是我用odb调试了一下源程序,发现程序会将shift-jis的脚本转化为Unicode。
图中红框部分原本是shift-jis的字符集代码,我改成了UTF-8。
我觉着这样,程序就会把读取的脚本里的utf-8编码的中文转换成Unicode显示了。
把部分文本导入替换掉以后,一切看起来都很好,字体虽然不好看但至少没错。文本也提取完了,可以正式开始汉化了。
本以为这样就万事大吉了。可是我完全无法处理,甚至找不到原因的玄学问题出现了。
游戏的文本分散在了数十个ws2脚本文件里,每个文件通常只有几十句台词。图上第一个文件便是游戏刚开始载入的脚本。该脚本的最后让游戏播放了片头动画,然后指定了下一个脚本的名字。
汉化了前两三句的时候,程序一切正常,当我导入更多的汉化之后,游戏开始出现问题了。我导入的文本的量不同,内容不同,游戏展现的问题都完全不同。那些替换掉原文的文本以不明的方式影响到了游戏的运行。
导入不同的汉化文本后,下面的问题都出现过。
问题1:片头动画无法跳过,本来看过一次以后就能跳过了。而且播放完之后白屏,并没有载入第二个脚本。
问题2:片头动画播放的时候,按一下鼠标应该可以跳过。可实际上按一下鼠标导致动画重播了一遍……播放完一次以后又重播一次。
问题3:游戏默认在快进模式,而且无法停止快进。快进一段时间后莫名其妙又停止快进了。
总之是一堆十分玄学的问题。我本来以为是我修改了shift-jis才出现的问题。
可是当我换回原版的程序,把日文原文提取出来,每句话只保留前几个日文字符,以shift-jis写入回去以后,依旧会发生问题。
那么是不是我写的打包程序有问题?于是我试着把脚本提取出来以后直接打包放回去,结果游戏可以正常运行。
也就是说……替换文本这件事本身就可能影响到游戏的运行,甚至你替换成日文文本都会出问题。而且很玄学,某些文本不会影响,某些文本会影响。调试了很久完全一头雾水。明明只是替换掉了几个字符串,为什么会影响到游戏的运行呢?而且还是以这种莫名其妙的方式出问题,闪退或者弹个框也好啊。
于是陷入了僵局。希望大佬们能帮帮我。
{:301_971:}
本帖最后由 monvvv 于 2020-5-7 18:40 编辑
zmrn 发表于 2020-5-7 13:07
我试了试ahdprc,似乎也是单纯的替换了字符串,还是有一样的问题……
毕竟已经很老的工具了,那个仓库乱七八糟的。试试https://github.com/marcussacana/WillPlusManager
或者
https://github.com/Amarillys/JSUtils/blob/master/advhd-mkz.js
如果全都不行,你只能do it for yourself了。
PS:汉化游戏有一万个坑。
Edit: 你也可以试试去问问代码作者 字库问题?不太懂 需要汉化的WS2文件是什么格式的?是怎么被读取的? monvvv 发表于 2020-5-6 20:16
需要汉化的WS2文件是什么格式的?是怎么被读取的?
额……其实我并没有成功解析WS2的结构。图上能看出,除了文本部分以外,其他部分都是二进制标记。我只是写了个程序单纯地替换掉了WS2里的文本。想要看着二进制文件解析WS2的内容实在是有点难啊。 本帖最后由 monvvv 于 2020-5-6 21:57 编辑
zmrn 发表于 2020-5-6 20:59
额……其实我并没有成功解析WS2的结构。图上能看出,除了文本部分以外,其他部分都是二进制标记。我只是 ...
不知道格式直接文本替换出现问题实现是不值得奇怪。举个例子,比如文件内的每个字符串都是通过偏移(offset)定位的,你修改文本后长度变化直接导致偏移改变,读取就会出错。
看了你贴的知乎链接,显然ws2文件不能直接文本替换(根据他后面贴的提取代码)。不过那人贴的代码不完善,repo也不能访问了。你可以试试用'ahdprc'(https://github.com/Inori/FuckGalEngine)。
如果也不能用,那你就只能自己慢慢逆了(lua字节码可以用unluac)。 monvvv 发表于 2020-5-6 21:55
不知道格式直接文本替换出现问题实现是不值得奇怪。举个例子,比如文件内的每个字符串都是通过偏移(offse ...
卧槽原来还有此等好物,是我查资料不足了。虽然在那个文章里看到了ahdprc的字眼,也去搜索过,不过没找到就放弃了。我去试试。lua的文件试着用unlua还有几个其他的东西处理过,不过没能成功破解出来……如果需要修改的话我再去想想办法吧。 monvvv 发表于 2020-5-6 21:55
不知道格式直接文本替换出现问题实现是不值得奇怪。举个例子,比如文件内的每个字符串都是通过偏移(offse ...
我试了试ahdprc,似乎也是单纯的替换了字符串,还是有一样的问题…… monvvv 发表于 2020-5-7 18:38
毕竟已经很老的工具了,那个仓库乱七八糟的。试试https://github.com/marcussacana/WillPlusManager
或 ...
谢谢大佬的帮助。打包这东西实在太痛苦了,所以我还是换了个思路。。用DLL注入搞定了,把原文和译文读取保存到map里,hook了一下转换Unicode的API直接替换文本……现在没问题了= =
页:
[1]