0x0 参考资料
巨佬:https://space.bilibili.com/685540771
巨佬:https://github.com/YuriSizuku
0x1 背景
大概从2021年开始,部分KiriKiriZ引擎的galgame无法使用Garbro或者KrkrExtract一键拆包了,并且修改游戏的exe还会有如下弹窗:
原因是wamsoft给KiriKiriZ加了个Cxdec,游戏运行的时候会往下面这个路径释放一个DLL:
C:\Users{用户名}\AppData\Local\Temp\krkr_{随机12位字符}_{随机8位字符}_{随机5位字符}
,路径的生成在如下位置:
脚本要读取文件 -> 把对应的文件名送给cxdec计算hash -> 用hash去XP3封包里面找文件
0x2 方法
-
运行时dump,也是我最早采用的:KirikiriTools和KrkrDump均可,但是工作量太大了,需要把整个游戏所有分支全部跑一遍,无法自动化处理。
-
hook cxdec,最近采用的方法: KrkrExtractForCxdecV2提取出所有文件(hash名称)-> 暴力扫描每个文件的签名(krkrz的脚本基本上都是ks.scn,文件签名为PSB)-> FreeMote解压PSB -> 解析json,提取出所有的文件名 -> 用krkr_hxv4_dumphash hook住cxdec那个DLL,往里面灌文件名得到对应的hash -> 对照映射表还原文件名。
-
动态替换tjs2脚本,将要采用的方法:KirikiriTools不仅能dump文件,也能注入文件 把下面的代码保存为
appconfig.tjs
,放在unencrypted文件夹内就能让引擎自己吐文件:textKAGLoadScript("KAGEnvPlayer.tjs"); var scn_list = KAGEnvPlayer.internalGetSceneFileList("!scnlist.txt"); for (var i = 0; i < scn_list.count; ++i) { try { Scripts.evalStorage(scn_list[i] + ".scn"); } catch{} } System.exit();
拿到scn以后可以用这个脚本解析生成新的tjs去提取别的文件,例如:
texttry { Scripts.evalStorage("uts001_001.ogg"); } catch{} try { Scripts.evalStorage("uts001_002.ogg"); } catch{} try { Scripts.evalStorage("uts001_003.ogg"); } catch{} try { Scripts.evalStorage("uts001_004.ogg"); } catch{} System.exit();
现在主打一个露头就秒