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

逆向工程 实用技术 算法KrKrZCXDEC魔女的夜宴柚子社hxv4天使纷扰柠檬即兴曲
浏览数 - 6681 发布于 -

重新编辑于 -

本文Python代码与文章内容遵循MIT协议

Textile
Copyright <2025> <Kinotern>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

仅供逆向汉化学习参考,不得用于其他非法用途


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

本文参考:

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

使用项目:

HXNames.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

Steam的KrKr游戏处理

所需的文件在

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

Steam版本的游戏提取需去除DRM后使用

如果不想这么麻烦可以选择下HF商城的官中


Steamless脱壳

Steamless打开游戏exe

image.png

选1257项

点Unpack File

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

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


替换api

将steamapi.dll覆盖过去

Dracu-Riot的也是,不要用steamapi64.dll来提取

image.png

覆盖后报错直接是正常的

image.png

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


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

本小工具优化了一些修改startup.tjs的方法

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

其他若失败请提出issue

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

提取XP3内容

接下来使用CxdecExtractor拿到加密的文件夹映射表

https://github.com/Kinotern/KrkrExtractForCxdecV3.3Extra

将处理好的游戏程序拖到CxdecExtractor.exe上放松开即可

然后有这个窗口

image.png点击add files,把所有XP3选中打开

或者把xp3拖拽到弹出窗口以创建任务队列

image.png

选择打开后会立马开始任务队列处理等待即可

image.png

完成后关闭游戏再重新拖到提取程序打开

然后点第二个加载字符串Hash


实时dump与运行时顺带找到名字恢复请看如下

https://github.com/Kinotern/KrkrExtractForCxdecV2Extra




使用hxv4_deobf_tools制作补充表格

我稍微魔改了一下改成GUI形式我懒得在代码文件指定路径这么难受了

直接打开选择文件夹就可以干活了,不过在这之前要准备一些些文件


KirikiriTools动态提取文件

批量提取Scn剧情脚本

吐游戏scn

https://github.com/Kinotern/CXDECNameRipper/tree/main/指定文件提取/吐游戏Scn

第一种让游戏自己吐出来

在使用之前确保以下文件

Version.dll

unencrypted.xp3

patch.xp3

不要出现在目录中,如果你下的是汉化版记得把汉化补丁移到别的目录

启动时候不要启动汉化版exe请启动原版日版exe


第二种解包汉化补丁xp3

garbro2解包汉化补丁中的Scn到指定目录即可

撞库提取记载表

创建一个files.txt

里头写入如下字段

简单无日文的文件名编码建议为utf-16le

若进行更复杂的文件撞库一定要保存为utf-16le不带Bom!

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

l![image.png](https://image.kungal.com/topic/user_37647/舞释-1764404364239.webp)大佬我是少东西了吗?为啥说tee不是命令?

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

frida -l krkr_hxv4_dumpkey.js -f SabbatOfTheWitch.exe

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

舞释
发布于
回复 @kinotern#5

好的谢谢啦~

舞释
发布于
回复 @kinotern#5

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

舞释
发布于
回复 @舞释#4

l![image.png](https://image.kungal.com/topic/user_37647/舞释-1764404364239.webp)大佬我是少东西了吗?为啥说tee不是命令?

image.pngimage.png

frida -l krkr_hxv4_dumpkey.js -f limelight_lj.exe > output.txt 2>&1
kinotern
发布于
回复 @舞释#10

你那边可以使用对吧

舞释
发布于
回复 @kinotern#11

对的~

舞释
发布于
回复 @舞释#10

BIN文件也会在文件夹里

舞释
发布于

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

kinotern
发布于
回复 @舞释#14

![image.png](https://image.kungal.com/topic/user_37647/舞释-1764408353449.webp)更改了version.dll好像无法运行游戏了#

标记——已解决

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
发布于
回复 @xiaoxinxin#16

佬,那个output.txt输出来为 &#x20;\_\_\_\_ / \_ | Frida 17.5.1 - A world-class dynamic instrumentation toolkit \| (*| | \> \_ | Commands: /*/ |\_| help ->

需要改什么东西吗,

舞释
发布于

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

kinotern
发布于
回复 @舞释#18

大佬大佬\~\ ![image.png](https://image.kungal.com/topic/user_37647/舞释-1764437509283.webp)files\_match.txt只有60条是正常的吗\ ![image.png](https://image.kungal.com

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

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

kinotern
发布于
回复 @舞释#18

大佬大佬\~\ ![image.png](https://image.kungal.com/topic/user_37647/舞释-1764437509283.webp)files\_match.txt只有60条是正常的吗\ ![image.png](https://image.kungal.com

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

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

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

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

aionfatedio
发布于 (编辑于 )
回复 @kinotern#25

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

kinotern
发布于
回复 @aionfatedio#24

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

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

aionfatedio
发布于 (编辑于 )
回复 @kinotern#27

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

kinotern
发布于
回复 @aionfatedio#28

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

kinotern
发布于
回复 @aionfatedio#28

offest要不试试去0x看看?

bfloat16
发布于
回复 @aionfatedio#28

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

柚香希冀
发布于

佬佬,带sig的xp3有头绪吗

kinotern
发布于

佬佬,带sig的xp3有头绪吗

举例举例具体游戏

kinotern
发布于
回复 @bfloat16#31

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