近期rUGP方面进展的若干备忘

进入六月后搞了三周rUGP,还是有点收获的。一方面搞定了立绘,也做了个粗略的文本提取功能;另一方面开始跟踪调试Nagato的补丁,对钩子怎么做有了个很初步的概念。不过又要开始忙了。老样子,写备忘,收工……

一 关于资源的静态提取

从接触到的几部分材料看,最关键的参考资料还是hikobae的alterdec。RIODecode所做的限于脚本中文本的提取和打包,以及.rio.ici文件的解码和编码;而WESTSIDE社的工具是alterdec的继承和扩展——从字符串看,其中很大一部分可能直接就用的是alterdec的代码。要想完整正确地提取文本,要想提取更多类型的资源,恐怕只能回归hikobae的ReadObject(),乖乖地把一路上遇到的对象都解出来。在RioX上,下一步可以考虑去做的是增加遍历资源树、完整正确提取文本的模式——这也是alterdec原本就具备的功能——不过,想要支持MLA以外的作品仍是一个颇为困难的事情。

最近在想的另一个方向是能否调用rUGP各dll中的函数提取资源。alterdec很伟大,但是相应的算法分析过程还是太艰苦。为了提取资源,我们并不是真的需要确切的算法。能正确找出dll中的函数并正确调用的话,也一样可以提取。当然这两个“正确”是另一个难题,需要不少跟踪调试的努力。而且age社也在不断更新dll,基本每一作出来,dll都和上一作有些不同。总之,现在的我连Olly都不熟,还做不到这些,留作悬案吧。

二 关于Nagato的钩子

最近开始用IDA+Hex-Ray和OllyDbg研究Nagato的mlhookv2.rpo。初步的跟踪发现,该补丁动态修改了rvmm.dll、UnivUI.dll、Vm60.dll和GMfc.dll,替换了14处资源/字符串/代码,并安装了19个inline hook。字符串和代码的替换比较明了,.rsrc段的替换应该也不难查明白,比较麻烦的是那19个钩子。每个钩子都是覆盖10个字节,先把被钩位置所在模块的基地址压栈,再跳转一个远地址到mlhookv2.rpo里,相应处理做完后跳到原址后面某处继续执行。

麻烦的是,这个事情似乎是在汇编层面上做的。一方面,所钩的位置在函数内,跟上下文关系密切,比如有一个就装在push/push/push/call序列的第二个push语句上;另一方面,跳转到的位置不是一般的C函数,更像C/汇编混合编的代码段,栈都不一定平衡。这样一来,要搞明白发生了什么,就得把两边的汇编都看明白。当然,调试mlhookv2相比调试rUGP找函数省事,不过还是需要一些努力。目前暂时就做到这里,后面的工作有空再说吧。

总之收工忙正事去…起码文本替换钩子是要做的,不过也要看时间了…早几年都没摸破解这摊事(毕竟我不是爱好技术的人),现在有兴趣了却没那么闲了……如果把当年花在博得和无冬上的时间拿过来……当然,现在再谈这样的如果什么用都没有……