关于rUGP破解现状的备忘

在rUGP这个坑里折腾了一个多月,收获实在是不大。到现在为止,仍然只是解决了两种主要格式的CG/背景图片的提取。而且找代码/模仿/猜测的搞法也快到头了,想取得更多进展必须上OllyDbg或者IDA pro了。这就要从长计议了。目前的打算就是把已经知道的事情记下来,然后给现有的成果做个界面release一个,然后不理程序了回去翻文本。rUGP的破解十来年都没人深入搞(从君望算起的话),一来说明难度大,二来不会有人急着等成果。虽然有些虎头蛇尾,也没有办法。在此写一下这段时间了解到的关于rUGP的破解的事情,作为备忘。

一、 那些变成传说的

在google上搜索过各种中文/日文/英文的关键词后,找到的与rUGP破解有关的最早的信息似乎和age社自己做的一个叫riorha2.rpo的插件有关。这个东西是用来访问一些rio文件中的资源的,现在还在age官网上挂着供下载。因为用了mpeg的库,被GPL协议搞了(我不清楚细节),age公开了riorha2的源代码。我没有尝试插件本身的效果,只是看了下代码,看上去涉及了音频和视频对象。按常理说这东西应该是个不错的突破口。然而,至今没有见过提取rio文件中音频或视频的任何工具,关于它的寥寥的讨论也仅限于“这东西应该有帮助”。

然后的一个被不少地方提及的、传说中的工具,叫RioDecode。之所以说“传说中”,是因为所有提及它的地方都指向同一个、现在已经不存在的页面。我现在还不知道去哪儿能弄到这东西。因此,RioDecode是谁做的,什么样的,能做什么,就不得而知了。

二、 hikobae的成果

再之后,就是2003年的rio2png和2006年的alterdec了。这两个东西都是hikobae做的。猜测hikobae是日本人,因为他的个人页面是纯日文,他混日文论坛,而且没有见过他发表英文的东西。这两个工具都公布了源码,这也是我找到的仅有的源码。应该说,我做的所有事情,都起源自这两套代码。非常感谢hikobae辛勤的劳动和无私的奉献。根据简短的blog,他应该是用softice跟踪了游戏程序。而他得到的,是数十个资源类型的初步或深入解析,和100多K写得非常紧凑(或许过分紧凑了)的代码。这个工作量粗估可能要几百甚至上千小时。

rio2png是一个用来解Muv-Luv 18X版中CG/背景图的工具。研究后发现,其实只解了Rip008类型图片的一部分,虽说数量上确实是绝大多数了。一种更老的图片类型(还没确认到名称)和r6Ti类型没有涉及;Rip008类型也有一部分在程序中绕过了没有处理,从代码上看应该是没解决这部分的解码。在rio2png的基础上,结合后来的alterdec的代码,我猜出了Rip008类型绕过的那部分的解码方式。其实底层操作hikobae都找出来了,就是怎么根据flag组合起来没有给出。

alterdec是一个伟大的工具。它可以解压Muv-Luv Alternative 18X版中的CG/背景/文本。在我看来,它有两个巨大的贡献:一是从非常复杂的脚本对象中提取出了文本;二是解析出了rUGP中对象的树状结构。rUGP的脚本相当复杂,除文本外有三百余种对象(VmGenericMsg中的message各不相同需要区别对待)。这些对象以二进制的形式直接存在脚本里,长度和内容有关,而且没有存所占字节数也没有分隔字节。这就意味着即使不想要它们的内容只想跳过,也必须分别采取正确的方式。hikobae就给出了这三百种对象的跳过方式。另一方面,树状结构的解析让我们得以窥见rio的全貌,给出了可靠遍历和辨认所有资源的手段。后来的WESTSIDE社的工具,也明显是采取了遍历树的方式。证据就是用它们打开ML 18X版的rio文件会报relicUnitedGameProject错误:这个类是根节点,而这种树状结构是从MLA 18X版才开始起用的,更早的作品以及后来的君望LE都没有这个根节点。

alterdec很强大,但是还有问题。一个结构性的问题是,如果rio中出现新的对象类型,旧的程序解析树状结构就可能出错。只要采用树状遍历,就没法避免。结果就是只能做专门针对某一个游戏的解压工具,面对其他作品的rio文件,“有可能成功运行”,也有可能crash。事实上,无论alterdec还是后来WESTSIDE社的工具,都是如此。从这个意义上,rio2png的识别特征码的方式,虽然不够系统,效率也受限,却有可能用来做出通用的提取工具,因为主要的对象类型的格式变化不太频繁。

alterdec的另一个问题是图片格式的解析不够给力。程序只处理了r6Ti类型和Rip类型(似乎是单色mask),Bg2d类型的解析还有错。rio2png里做过的Rip008都没写进去,似乎也是因为前面提到那个解压的问题没解决。我所做的就是把两处的r6Ti和Rip008的解码整合在一起,补足了未解决部分,并修正了Bg2d类型的错误。目前手头有的rio文件中的r6Ti和Rip008类型的图都可以正确解压了。只是在此过程中又发现了一种不知道名称的图片类型,现在还没头绪。好在它只在部分作品中出现了个别几张,在MLA和MLAC中根本没出现,就先不管了。

三、 WESTSIDE社的工具

WESTSIDE社是一个提供各种游戏小工具软件的公司,产品要收钱的(不到1k日元一个)。其中做过四个跟rio文件有关的,分别对应ML全年龄版、MLA全年龄版、ML Supplement和ML Altered Fable,都是提取图片的。界面用MFC写的,而解压采取了alterdec的树遍历方式。这几个工具的亮点在于,可以解出很多类型的图,除了r6Ti和Rip008,能解那种未知CG/背景类型,能解立绘和表情差分,甚至还有ico等零碎东西。可惜人家是收钱的不公开代码,目前还不知道具体怎么做的,

四、 Nagato’s plugin

2011年出现了一个伟大的东西:Amaterasu Translations发布了MLA的英化补丁。在该组织的论坛(英文)上,可以下载到ML和MLA的英化补丁,而且似乎没有大的bug。补丁只有几十M,还有卸载功能,做得非常干净。实际运行发现替换了文本和部分图片,效果很好。从论坛的讨论中看,这个东西是Nagato做的,原理是写了一个mlhookv2.rpo插件(本质上是dll)去hook游戏运行时内存,每当把文本填入文本框时,替换要填入的字符串,不涉及内部资源格式的解析。

这是一个很好的思路,似乎也是近年来汉化中越来越多见的一个思路。替换资源文件涉及资源的编码、资源文件结构的修改、双语版本共存等问题。kirikiri这样的开源引擎倒无所谓,rUGP这样的引擎就是要人命的。而用hook不需要改变原资源文件,运行时替换即可。虽然还是拿不到立绘图,至少可以做汉化版了。只要不是跑起来很卡,就没啥问题。Amaterasu Translations没有放出代码,似乎关系到和age社交涉英文版授权的事;Nagato似乎已经宣布退休,我前些时在Amaterasu站短他也没理我。不过开源的ITH似乎解决了rUGP的文本hook,真要做的话应该还是能做的吧。

五、 yusjoel的工具

我目前跟着澄空age版的人搞ML系列汉化相关的事,而在这里找到的一个东西,就是yusjoel做的文本替换工具。这终于是一个同胞做的东西了。他做的事情是,首先是把rio文件中的文本提取出来,加偏移标记,并转换成GB2312(为啥是这个倒霉的内码呢…)。然后就是把翻译好的文本压回rio文件简单替换原来的脚本。还修改了rUGP若干配置文件,让游戏能够显示GB2312码。

简单替换的话,中文文本长于日文文本就是致命的。还好替换单位是数百上千行,而日语是一种很啰嗦的语言,实际中大约没问题吧。不过还有另一个问题就是文本颜色:原来是可以区分设置不同人物文本颜色的,替换后全白色了。似乎是跟JIS字体有关。其实我个人还是倾向于hook的方式,当然,问题是要有掌握相应技术的人来花功夫做这个事情。

结语

从年初以来,牺牲了做研究写paper的时间,一直在搞rUGP。对我这个还没入破解的门的人来说,果然还是够难的。复现和整合rio2png+alterdec的图片部分就花了三周。不过也挺有趣的,学了一些没用过的C++特性,学了一些没用过的工具,体验了一下解包。后面再深入些也不错,不过现在还是回来忙正事吧,再不找工作我就真成无业游民了。这篇东西把重要的事情做个备忘。

6 thoughts on “关于rUGP破解现状的备忘

    • 求RioDecode…
      給留的邮箱发邮件一直没回音。
      除了在这儿添句回复,不知道还能怎么办了……

      • 不知为何之前的回复被吞了,再次回复一遍……
        邮件已发过,那个邮箱是我平时注册ID用的邮箱,很少仔细去整理其中的各种邮件,原以为会在这里回复,结果等了两天没有看到,就给忘掉了。耽误了半个多月的时间十分抱歉!

  1. 啊,真抱歉,那个邮箱平时只是作为注册用,看得比较少……
    这里最开始看了几天没发现动静,就忙别的去了……明天即发。

Comments are closed.