《诡计对逻辑》汉化研究

前言 去年(2018)年中,有汉化组的成员表示希望汉化这款游戏,托我研究一下技术上是否可行。但由于现实中的事情,加上拖延症,以及有其它汉化坑,迟迟没有开坑这个游戏。经过漫长的拖延,终于在今年年初抽出时间开始研究。 这是我第一次接触PSP游戏的破解,我对这个平台并不了解。不过好在模拟器PPSSPP的调试功能还算完备,对逆向分析游戏十分有帮助。 初步分析 首先,我们需要将游戏的镜像文件解包。PSP游戏镜像是ISO格式,7zip、WinRAR等软件都能直接解压,在Windows 10上还能挂载到文件系统中直接访问。 我们来观察一下解包出来的目录结构(部分文件未展示): PSP游戏遵循程序和数据分别储存的原则:程序二进制代码的路径是PSP_GAME/SYSDIR/EBOOT.BIN,这是一个加密的ELF文件,关于如何让解密这个ELF后面会提及;数据的路径是PSP_GAME/USRDIR/,一般来说需要汉化的文本、图片等内容都在数据目录下,当然,少数情况下,EBOOT.BIN中也可能会有一些文本。 下面着重看一下USRDIR这个目录。在USRDIR/data下有几个子目录,根据它们的命名,可以猜测当中包含的文件的用途,分别是:视频(movie)、共享游戏(sharing)、音频(sound),很明显,我们需要汉化的文本,并不存在于这些目录下。那么,我们可以猜测,文本应该是储存在data目录下的bin文件中的,但是这些bin(二进制)文件到底是什么呢? 为了研究这些bin文件,我们用16进制编辑器打开这些文件进行观察。 可以看到,这些文件最开始的8个字节都是字符串"SECTPACK",我们可以顾名思义地作出假设,这些文件都是PACK,即文件包。我们继续往下看。 从0x310字节开始,有一系列的文件路径一样的字符串,几乎可以肯定之前的猜测,这些bin文件就是文件包,而这些字符串就是打包到文件包中的文件。 那么从现在开始,我们把这些bin文件称为SectPack。 仔细观察可以发现,0x10~0x310之间有0x300字节的意义不明的内容,这到底是什么呢? 根据以往的经验,对于文件包格式,比较常见的结构是把文件数据偏移、文件数据长度、文件名偏移等信息作为一个列表保存在文件包头部。那么很自然的,这个列表的大小,会随着文件包中包含的文件数量增加而增大。因此,SectPack开头的0x300字节不可能是保存这些信息的列表,因为所有包的文件数量完全一致的情况并不多见。实际上,通过统计各文件包中的文件路径数量也可以验证这个判断。 并且,我们可以注意到,在每一条文件路径之间还有一些意义不明的字节。 很显然,依靠简单地找规律的做法,是没办法破解SectPack文件的。 进一步分析 为了进一步分析,我们利用模拟器进行调试。 首先,勾选调试菜单中的“载入后停止”选项,并打开反汇编窗口: 然后,加载游戏,此时游戏就会停止在程序入口处: PPSSPP会对SDK中的一些函数进行自动标记,这是一个非常方便的功能。 我们要分析 SectPack 文件,不妨先思考一下,从这些文件包中读取文件,需要经历哪些过程。 首先,一个最基本的事实:这些 SectPack 都是 ISO 文件系统中的文件。因此必定会调用标准库中的打开文件函数; 然后,在打开文件后,必然需要读取,读取文件也是标准库中包含的函数之一; 接着,需要调整文件指针来读取指定位置中的内容,就需要 fseek 之类的函数; 另外,要打开/读取 SectPack 中的文件,假设包中的文件是通过路径来索引的(从文件头部附近确实也看到了一些文件路径), 那么就需要进行字符串比较,也就是 strcmp。 大致整理一下思路,我们可以着手进行分析的函数分别是SDK中的sceIoOpenAsync、sceIoReadAsync、sceIoLseekAsync,以及 strcmp ,这些函数,模拟器已经标注出来了: 关于以上几个io函数的原型,我们可以参考 pspsdk 中的文档。 以下是从 pspsdk 网站中摘抄的函数说明: SceUID sceIoOpenAsync( const char * file, int flags, SceMode mode ) Open or create a file for reading or writing (asynchronous) Parameters file - Pointer to a string holding the name of the file to open flags - Libc styled flags that are or'ed together mode - File access mode (One or more SceIoMode)....

2019 年 4 月 22 日 · 2 分钟 · LITTOMA

第一节 - 游戏汉化的基本流程

游戏汉化,或者其它语言的本土化,可以简单概括为一句话:将游戏中可见的文字元素从源语言修改成目的语言。对于汉化而言,就是将其它语言的文字修改为汉语,并确保在游戏中正常显示。 要完成这个工作,一般要经历以下步骤: 游戏分析->资源导出->文字、图像处理->资源导入->测试->发布 一、游戏分析 游戏汉化通常需要修改的资源类型有:文本/脚本(Text/Message/Script)、图像(Texture)、字库(Font),有时还包括视频(Video/Movie)、音频(Sound)、模型(Model)等。 游戏分析,就是要找出这些资源的所在位置,并分析它们的封装格式,为后面的导出、导入做准备。这个过程,就是我们通常所说的“破解”。 在过去,当文件系统的概念还没有在游戏上普及时,游戏资源往往会跟游戏代码混合在一起,这时要找出这些资源所在,就成了一件极为困难的事情。所幸,3DS作为一个现代的游戏平台,任天堂提供了一套清晰的文件系统标准,这为游戏的分析过程带来了极大的便利。需要汉化的资源,通常就在包含它们的英文名称的目录下,找到这些目录就能找到这些资源。 二、资源导出 资源导出,就是通过编写或使用现有工具,将游戏资源转换为常见的、方便编辑的格式,以便进行后续的翻译工作。 例如,对于文本/脚本,最好将其转换成文本文档(.txt文件),这种格式可以很方便地在各种操作系统平台上找到编辑工具,查看和编辑都比较方便。 当然,你也可以针对游戏编写专门的编辑工具,但是这样不仅需要耗费额外的时间和精力去开发和维护一套工具,并且耗时耗力开发出来的工具可能只能在极少游戏上适用,因此我们不建议采用这种做法。 三、文字、图像处理 这个部分往往是汉化过程中工作量最大、涉及人员最多的部分。 文字处理,需要对文字进行翻译、校对、润色处理,这些文字包括文本或脚本中以特定编码保存的文本、UI上以图片形式呈现的文字等; 图像处理,是在文字处理基础上对以图片形式呈现的资源进行修改。 这个步骤通常需要不同人员分工合作才可能完成。 四、资源导入 这个步骤是资源导出的逆过程。同样地,我们需要根据第一步的分析结果,编写或者使用现有工具,将前面导出的资源重新转换成游戏所支持的格式。 五、测试 游玩汉化版游戏,找出汉化版游戏中出现的问题并进行修正,直到修复所有存在的问题为止。 六、发布 完成前面的步骤后,我们的游戏就可以跟玩家见面了。

2019 年 1 月 16 日 · 1 分钟 · PB 汉化组
banner

3DS游戏汉化:从入门到入土 - 序

各位关注PB汉化组的朋友们,大家新年好!我是PB汉化组的组长,LITTOMA。 时光飞逝,转眼间我们就迎来了2019年的新年。 今年是我们汉化组成立的第5年,距离我们发布的第一款汉化作品,也快过去4年了。 我们是一个由热爱游戏的玩家自发组成的团体,成员来自五湖四海,大部分成员之间素未谋面。只是出于热爱,我们相聚在一起,并坚持到了今天。 五年前,我第一次产生自己动手汉化自己喜欢的游戏的想法,是因为感叹于当时官方中文游戏的匮乏,同时也希望借此结交一些跟我有相同爱好的朋友。 今天,我可以荣幸地说,当初的愿望已经实现了。我拥有了一群十分难得的朋友,在和他们共同努力下,完成了一个又一个游戏的汉化。 五年走来,跌跌撞撞,踩过不少的坑,接触过各种各样的游戏。通过对这些游戏的汉化,我了解到了不少有趣的东西, 涨了很多知识,从一个对汉化一窍不通的新手走到现在。 在很早之前我就有把这些经历写下来的想法,但由于生活和工作的原因,一直没有足够的时间; 同时也生怕自己的水平不足,导致所写的文字出现严重谬误,给其他人带来误导,于是迟迟没有开始。 在汉化组成立的第五年,我终于决定开始动手,把这些经历写下来。毕竟现在不开始,还等什么呢? 这个系列计划分为两大部分: 第一部分以讲述基础知识为主,我会尽量详细地讲述3DS游戏汉化中所需要的一切基础知识; 第二部分,我会以我亲身参与的一些汉化项目为例,从头到尾,讲述这些汉化项目从0到1的完整过程。 阅读读这些文章要求读者有一定的计算机常识,能读懂C/C++、C#、Java、Python等编程语言所写代码的逻辑。 如果文章中有错误或无法理解的地方,欢迎给我留言,或者给我发送邮件。 这个系列会不定期在我们的主页(www.pbteam.cn)上更新,文章列表也会在本文下方更新,所以有兴趣的朋友可以收藏本文链接作为目录。 正如文章标题所言,“从入门到入土”,游戏汉化绝对不是一件简单轻松的事,所以这个系列的目标是以劝退为主, 希望仍在坑前观望的朋友在看了这个系列文章后,悬崖勒马,及时回头。 如果在那之后,你仍然有强烈的跳坑愿望,那么恭喜你,你已经在坑里了。 【文章列表】 第一节 - 游戏汉化的基本流程

2019 年 1 月 6 日 · 1 分钟 · PB 汉化组