关于KrKrZ的CXDEC加密大批量提取解包游戏文件的思路与方法技术的总结初步

逆向工程 实用技术 算法
8722 编辑于

本文重点在于制作映射表格以快速对CXDECExtracter提取的游戏文件分类重命名

本文参考:

https://www.kungal.com/topic/2670


使用项目提到的lst映射:

https://github.com/MLChinoo/hxv4_deobf_tools


Steamless:

https://github.com/atom0s/Steamless


撞库程序源码:

https://github.com/YuriSizuku/GalgameReverse/blob/master/project/krkr/src/krkr_hxv4_dumphash.cpp


XP3静态解析文档参考:

https://github.com/Kinotern/cxdec-hxv4-static-analysis


lst生成扫描思路:

https://github.com/Kinotern/Cxdec_Tools


静态提取XP3

无需运行时

Releases · Kinotern/CXdecStaticExtractor

rust语言开发,可批量解包

请在方案库填写会社/游戏/子版本

然后在解包队列选择你相应的游戏即可

lst需要自行维护,当前版本创建lst生成的映射暂未确认能否解包

无lst解包则只能解包出无名纯hash文件


运行时解包:

如果是steam游戏请看下面的脱壳与替换dll教学

https://github.com/Kinotern/KrkrExtractForCxdecV2Extra



Steam的KrKr游戏预处理

后续如果需要

实时dump获取这个映射lst表需要去掉壳子

所需的文件在

https://github.com/Kinotern/CXDECNameRipper/tree/main/Steam去除drm


如果不想这么麻烦可以选择下HF商城的官中,有一些游戏在HF暂未提供下载

如魔女的夜宴


Steamless脱壳

Steamless打开游戏exe

image.png

选1257项

点Unpack File

image.png出现绿色字,提取成功

image.png游戏目录会有一个叫SabbatOfTheWitch.exe.unpacked.exe


替换api(项目文件已含此dll)

将steamapi.dll覆盖过去



Dracu-Riot不要用steamapi64.dll来提取,应该是使用32位版本的程序提取

image.png

覆盖后报错直接打开是正常的

image.png

然后出现弹窗Malformed exe/dll detected或无法找到入口


原因是没绕过程序startup.tjs的if link fail逻辑

本文编写的小工具可以解决大多数这样的问题

并测试了魔女的夜宴,星光咖啡馆,病弱妹,DR,LLLJ这几个游戏都可以patch掉

其他若失败请提出issue

https://github.com/Kinotern/CXDECNameRipper/tree/main/去除MFD弹窗



实时dump与运行时

顺带找到名字恢复请看如下

https://github.com/Kinotern/KrkrExtractForCxdecV2Extra

走完游戏流程不一定百分百能恢复,但是把大部分都恢复好了

结束游戏前请点击停止实时恢复按钮



撞库确认此项存在

创建一个files.txt

里头写入如下字段或许你要撞库确认的话

编码建议为utf-16le

javascript
base.stage
cglist.csv
soundlist.csv
charvoice.csv
imagediffmap.csv
savelist.csv
scenelist.csv
replay.ks
_chthum_index.pbd
......


将version.dll(切记不要与kirikiritools的dll混在一起二者注入的东西不一样)

复制到游戏目录

打开游戏

然后打开游戏后出现弹窗有东西在闪就是在撞库了


等待一会后

[src/krkr_hxv4_dumphash.cpp,216,calc_thread,I] try to calc names in dirs.txt [src/krkr_hxv4_dumphash.cpp,218,calc_thread,I] calculate finish, results in files_match.txt, dirs_match.txt

直接关掉命令窗口就可以快速关掉游戏了

即可在游戏目录找到files_match.txt与dirs_match.txt

里头记载着撞库得到的信息

本文版权遵循 CC BY-NC 协议 本站版权政策

45 条回复

AKATSUKI
发布于

马上删除所有KrkrRev的内容

舞释
发布于

limage.png大佬我是少东西了吗?为啥说tee不是命令?

kinotern
发布于 (编辑于 )

@舞释 #4

或许我电脑有装tee就是Git for Windows这类支持工具,我重新写一下

frida -l krkr_hxv4_dumpkey.js -f SabbatOfTheWitch.exe

这个至少可以在控制台用删了保存那步骤

舞释
发布于
舞释
发布于

@kinotern #5

但是这样好像无法输出txt文件了~

舞释
发布于

@舞释 #4

image.pngimage.png

frida -l krkr_hxv4_dumpkey.js -f limelight_lj.exe > output.txt 2>&1
kinotern
发布于

@舞释 #10

你那边可以使用对吧

舞释
发布于
舞释
发布于

@舞释 #10

BIN文件也会在文件夹里

舞释
发布于

image.png更改了version.dll好像无法运行游戏了#

kinotern
发布于
xiaoxinxin
发布于

佬,那个output.txt输出来为

____ / _ | Frida 17.5.1 - A world-class dynamic instrumentation toolkit

| (| | > _ | Commands: // |_| help -> Displays the help system . . . . object? -> Display information about 'object' . . . . exit/quit -> Exit . . . . . . . . More info at https://frida.re/docs/home/ . . . . . . . . Connected to Local System (id=local) Spawning limelight_lj.exe... Failed to load script: 'utf-8' codec can't decode byte 0xa1 in position 376: invalid start byte

Thank you for using Frida!

是什么情况

xiaoxinxin
发布于
舞释
发布于

大佬大佬~
image.pngfiles_match.txt只有60条是正常的吗
image.pngdirs_match.txt里面是空的
image.png这些都是正常的吗?~

kinotern
发布于

@舞释 #18

dirsmatch没关系,况且你用了utf-16le的编码,在经过了撞库之后由ANSI转为utf-8方便软件读取

只有十来个文件时不正常的

kinotern
发布于

@舞释 #18

不对啊?你咋把游戏源文件给放进去了,这个不是这么用的哈,是拿份模拟版本汇总文件输入进去

kinotern
发布于

@xiaoxinxin #17

我也纳闷,这一块frida输出我装了git类linux支持的却可以直接导出去,我研究下

xiaoxinxin
发布于

@kinotern #21

ok,谢谢,解决了,应该是是编码问题

舞释
发布于

@kinotern #20

哦!原来如此谢谢大佬

aionfatedio
发布于

基本到最后一步了结果编译那块死活过不去。试了一下病弱妹,现在有control_block.bin,有HxNames.lst。HxNames.lst前几行是

javascript
5BA0F09AC06320DDC5A6ACBEBEDD832024CD075FA185D3413DFECFF0D21943ED:appconfig.tjs
8DE715758FCC3D48A1918EDF85F7E3B0D0802607D7ED9E3F10E0A5B7CB917703:currev.ini
D9FB4859A254D7B9EDA6621CFBE7DFD9D428082090CA08E32A9314E7116548E9:startup.tjs
1F1FA2B4921F0AC7AFAB6600687F69E244CFB9DC262B4202CF504F6CED353E4A:bgimage\base.stage
8907AAFB1750F86E7C2626EB5F24B3698EA658BF47C8F94DBF2B5DED4C456000:bgimage\bg01\bg01_01.png
96CC624760F1F89665317CBE7F151C12FC73B1BFB6B02D3DE89D2EF41782D3BD:bgimage\bg01\bg01_02.png
B962E6A451088690BD76D0C586704341DAB877C7808A0327780A0EF27AF4E43C:bgimage\bg01\bg01_03.png
B7BA29DB35B0C6B5BD16CAB0274F64BAA3A5FA97E5FB215CE4C8CFFF370897AF:bgimage\bg01\bg01_04.png
B485E1EF3C7F4BF3712053C152876887D2A9ACC2FDC4791D49D79B5DD0F1CF07:bgimage\bg02\bg02_夕.png
76D370BD763E8302A821A8814DDF33102B76B78257FF7D2CA323C169DA437C9F:bgimage\bg02\bg02_夕_ガラス戸.png
99139F684640B0E44B30A5A26FD3BB20971DFEA5FF608690B4B3A98E5D44DD81:bgimage\bg02\bg02_夜_消灯.png

确保我没弄错,UTF-8编码。然后进VS2026编译,默认其实没有GameData\Formats\文件夹所以我自己创了个,把control_block.bin和HxNames.lst扔进去然后切release开始生成解决方案,看结果数据库里没有sickly_days这项。因为Program.cs写的是

cs
……

                scheme.KnownSchemes.Add("sickly_days", crypt);
            }

            var gameMap = typeof(GameRes.FormatCatalog).GetField("m_game_map", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
                .GetValue(GameRes.FormatCatalog.Instance) as Dictionary<string, string>;

            if (gameMap != null)
            {
                gameMap.Add("sickly_days_crack.exe", "sickly_days");
            }

            // Save database
            using (Stream stream = File.Create(".\\GameData\\Formats.dat"))
            {
                GameRes.FormatCatalog.Instance.SerializeScheme(stream);
            }

然后把SchemeTool.exe编译出来,control_block.bin和HxNames.lst放相对路径运行一下才更新Formats.dat。进数据库有sickly_days但解密后还是字符乱码,也就是映射没生效。跟着教程来估计哪一步错了,求助大佬。

kinotern
发布于

@aionfatedio #24

请注意bin与lst是放入编译后创建的Formats的而不是编译前放入

aionfatedio
发布于 (编辑于 )

@kinotern #25

编译后并没有自动生成Release\GameData\Formats文件夹且列表中并没有对应游戏名称是哪里出了问题?
fork的是nanami的mod版本,编译release后没有Formats文件夹就自己建了个,发现游戏列表里没有sickly_days。另外注意到sln在编译时默认会不编译生成schemetool,这个工具有用吗。大佬给的编译教程已经很详细了,但是初次上手操作还是有些难度,希望大佬指教

kinotern
发布于

@aionfatedio #24

哦哦我之前记错了,我重新编写了文档了

aionfatedio
发布于 (编辑于 )

@kinotern #27

大佬,GARbroV2后续步骤怎么做?加密方式重新再选一下,选HxCrypt,然后点Creat之后,把一些基本数据填了填,撞库的映射表HxNames.lst还需要吗,希望能完善后续教程。
---
我大概明白了,但目前文件夹根据哈希映射都还原出来了,文件名还是处于加密状态,但我填了
image.png它却显示image.png目前是文件夹名已经还原状态
image.png但似乎文件还在加密,是哪里出了问题吗?

kinotern
发布于

@aionfatedio #28

我也还在研究他,私聊探讨吧,这个我昨天才发现这个好东西

kinotern
发布于
bfloat16
发布于

@aionfatedio #28

cxdec hash的是xp3里面的文件名,hxcrypt加密的是xp3里面的文件内容,两个都要处理

柚香希冀
发布于

佬佬,带sig的xp3有头绪吗

kinotern
发布于
kinotern
发布于

@bfloat16 #31

浮点小兄弟,你有头绪吗,具体要做些啥呢😉