krkr引擎解包工具介绍


背景

krkr引擎,是日本的一个开源免费galgame游戏引擎,由于不用钱,也不用游戏厂家自己维护,所以被广为使用。我知道的就包括柚子社全家桶、Lose全家桶、《9nine》、《Atri》这些。由于这个引擎可定制化非常高,所以厂家经常会对游戏资源进行各种各样的加密,这也给解包带来了困难,好在引擎是统一的,所以也有一些针对krkr引擎的通用解包工具。接下来首先会介绍一些krkr引擎的游戏特征和加载包的大致流程,然后介绍比较实用的解包工具,最后介绍一下动态解包Steam版galgame需要进行的操作。

krkr引擎的游戏特征

右键点击游戏的exe主程序,选择属性-详细信息,在版权那一栏看到KIRI KIRI core...字样,就说明是krkr引擎的游戏了。不过也有一些版本会删去这条信息,好在还有其他的特征,包括:

krkr引擎加载包的大致流程

  1. 读取游戏资源文件中的子文件列表,可以将xp3文件理解成一个压缩包,子文件列表就是压缩包中包含的文件的列表
  2. 当需要某个资源时,发出子文件名请求,通过子文件列表查找到子文件对应的位置,将子文件从xp3文件提取出来,注意这时候读取出的子文件是加密过的
  3. 调用解密模块,对子文件进行解密,然后执行接下来的资源处理流程

从这个流程可以看到,krkr引擎的解包基本也就分两种方式:

静态解包的好处是直接对整个xp3文件进行解包,一次就能得到所有解密后的文件,方便快捷。坏处一个是需要反编译解密模块,当然这对那些逆向大佬说不是什么难题,另一个更主要的是工具制作者要将五花八门的解密程序统一成一个框架,还要对后续出现的新游戏、新加密方式进行不断的添加维护,这工作量就不是一点半点了,正如之前的非常流行,但现在停更的解包工具KrkrExtract作者所说:

受保护的程序一律不支持,支持就是打开潘多拉魔盒,你得保证各类bypass不冲突。

动态解包的好处是万金油,基本所有的程序都可以用这种方法解决,不需要不断更新。但坏处就是资源必须游戏发起了相应的请求才能hook到,如果像获取所有解密后的文件,可能就需要把整部游戏的所有情节过一遍,时间成本非常高,甚至某些游戏触发CG啥的有特殊条件(比如当前时间、情节过的次数等),那更是麻烦。

解包工具

Garbro

Garbro是一个非常强大的解包工具,支持多种格式的galgame解包,基本常见厂家的引擎它都支持(除了key社的Siglus Engine和Unity,不过这两种有其他的解包工具),krkr也包括在内。不过前面说了,krkr引擎的游戏加密方式五花八门,作为静态解包工具,Garbro虽然现在还一直在更新,但也总有游戏是解不了的。而且,即使是同一个游戏的不同版本,也有可能有的能解有的不能解,比如《Maitetsu Last Run》Garbro显示能解,但我的Steam中文版《爱上火车Last Run》却解不了,可能能解的是日语原版或英文版;又比如9nine官汉的前四部能解,但民汉的新章不能解,这都得看运气。Github上还有大佬fork了Garbro然后自己补充了一些krkr游戏的解密程序,比如这个仓库,可以根据需要选择,哪个支持自己想解包的游戏就选哪个。

KrkrzExtract

KrkrzExtract和上面说的KrkrExtract是同一个作者。这个工具使用的是动态解包,使用方法就是直接让KrkrzExtract运行游戏文件,它就会自动注入hook,游戏运行过程中加载的资源文件都会被保存下来。正如上面所说,适用范围很广,而且不需要更新,但是想获取所有文件比较麻烦。

基于子文件列表的工具

我之前用KrkrzExtract的时候就在想,它的局限性是想要的资源文件并不一定会被游戏加载。而加载的过程,必然也是游戏中的一个函数,那么我在游戏的某个位置hook一下,然后将xp3子文件列表的所有文件都作为参数调用一下这个函数,那不就能保存解包出来的所有文件了。后来一搜,果然有这类工具,比如这位大佬的仓库,他在这篇文章里介绍了这个工具的原理,和我的想法基本一致。不过文章也提到,xp3的子文件列表也不一定每种游戏的实现方式都一样,所以该工具可能泛用性还是不如KrkrzExtract,不过比起多种多样的加密方式,子文件列表的实现方式应该会少很多,所以泛用性应该比Garbro会强一些。使用方式和KrkrzExtract也差不多,都是让它运行游戏文件,自动注入然后游戏运行过程中保存文件,不过和KrkrzExtract不同,参数里需要选择xp3文件名,保存的是这个xp3解包的所有文件而不是游戏主动加载的文件。

前面所说的fork了Garbro并自行添加功能的大佬也实现了一个解包工具,我没有用过,原理应该也是基于子文件列表的,但因为没有文章介绍,所以我也不清楚它是怎么考虑xp3子文件列表的的兼容性问题的。

动态解包Steam版krkr游戏

比起硬盘版游戏,动态解包Steam版游戏要稍微麻烦一点,主要有两个原因:

不管怎么说,想动态解包Steam版游戏就需要两步:把DRM去掉,以及让游戏能独立执行(不需要Steam作为启动器)。前者可以用Steamless,它会将游戏主程序的DRM机制去掉,生成一个新的游戏主程序,但这个程序往往不能直接执行,因为它还是依赖Steam作为启动器给它提供各种API支持。后者可以用GoldBerg Emulator,它提供修改之后的steam_api.dll等Steam环境动态链接库,用它们替换原游戏文件下的同类文件即可。之后就可以按照硬盘版的方式运行动态解包工具了。当然这个方法不保证成功,毕竟这一套流程也是制作盗版游戏的流程,技术力高的厂家可能会在这一点做专门的防范。

这里有一个需要额外的注意的地方,就是像KrkrzExtract只会保存游戏加载的文件,所以要是修改后的游戏没有继承存档就会很难受。这里说一下继承存档的方法,在Steam的安装文件夹下应该会有一个userdata文件夹,里面有个数字文件夹,数字文件夹打开之后是一堆数字文件夹,这些数字实际上是游戏的id,根据游戏的id打开对应的文件夹,再打开remote文件夹,里面那些东西就是存档相关的文件。然后再找到GoldBerg Emulator的存档目录,复制过去就可以了。

总结

以上就是krkr引擎解包相关的一些介绍。我个人解包纯粹是为了把CG保存下来自己欣赏,这样就不需要保存整部游戏,节省硬盘空间。实际上解包最主要的应用应该还是汉化游戏,这方面我不太了解,所以也不能确定以上方法一定有效。