以前都是看到想拆的游戏就自己动手搞搞,但是后面就觉得麻烦了,因为 krkr 的框架都是一样的,各厂只是在封包上做了点小修改,为每个游戏都适配一遍实在是太费时间了。所以决定弄个通用点的工具出来。
首先还是查资料,翻翻 krkr2 的源码。其他的废话就不说了,用 krkr tjs 脚本接口的 TVPCreateIStream 可以创建封包中的文件流,调用 IStream::Read 接口就能直接读到解密后的原始数据了。IStream 是 windows 的 COM 接口之一。
可以在游戏中通过 “IStream * ::TVPCreateIStream(const ttstr &,tjs_uint32)” 定位到 TVPCreateIStream 函数的地址,然后手动调用来创建文件流。也可以自己写个插件插入游戏,然后在插件里就可以直接调用普通函数一般直接使用了,比手动 hook 显得更方便些。但反过来要 hook 插件的加载流程让游戏加载自己的插件。写插件的话需要用到 tp_stub.h/.cpp 这两个文件。
传递给 TVPCreateIStream 函数的文件名还有些不同,大部分的游戏只要传入形如 “d:\game\data.xp3>startup.tjs” 的文件名即可,但有些游戏要传入 “archive://data.xp3/startup.tjs” 才能正确解码,否则创建出的 IStream* 本体是个“不完整”的基类类型,只能将文件原原本本读取出来,无法完成附加的解密动作。目前来看是 krkrz 这种有特殊节的都用这个方式解。
另外就是文件索引表的提取。像feng、柚子社还有艹猫的结构与常规的封包多了额外用来储存文件名的字段,palette 的 9-nine 还把所有的文件名全塞到最前面,后面再跟上常规的索引表,防不胜防啊。
放个链接:BlackSheep
使用时将 Loader.exe / BlackSheep.dll / zlib.dll 放到游戏目录下,命令行里输入
Loader.exe <游戏 exe 路径> <要提取的 xp3 路径>即可进行提取。提取前后都有消息提示,提取过程中保持游戏主程序运行(有时环境不正确游戏可能会弹窗报错,点了确认就会直接退出游戏,这时不要去点击按钮,等待提取完成即可)。完成后可在游戏目录下的 blacksheepreport.txt 中查看文件提取的详细情况。
一些压缩文本的解压、psb 之类以后再说吧。_(┐「ε:)_
最后膜拜一下大佬作品 (>ω<) KrkrExtract