以蓝色星原:旅谣为例 —— HybridCLR 解密记录 V2
在 BW 试玩过蓝色星原 (蓝色原神) 之后,一直想找包解,浑身刺挠( 包体流出后,发现 AB 包只是单纯的 UnityCN 特色解密(无聊 但是在解密 global-metadata.dat 时,发现被加密了,解密完后头 magic 是 CODEPHIL,一眼代码哲学出品 翻文件的时候,发现几个 CDPH 开头的文件,同时又有 .NET 的 Metadata 段 magic + HybridCLR 的存在,估计这玩意是新的热加载 DLL,故写了这篇文章来记录 ¯\_(ツ)_/¯ 补: 这篇文章所涉及的加解密与代码哲学新推出与 HybridCLR 共同使用的 Obfuz 混淆器相关 分析 global-metadata.dat 解密在 IDA 中搜索 CODEPHIL 或者 global-metadata.dat,前者对应 DecryptMetaData,后者对应 il2cpp::vm::GlobalMetadata::Initialize DecryptMetaData 核心流程 清空输出指针:*a2 = 0。 校验头魔术 0x1357FEDA(不...
看雪·2025 KCTF 第十题 WriteUP
前言LLM 还是有极限的,还是人脑子好使(虽然高考完三个月脑子就没动过 导致好久才转过来弯 悲 1. 分析先用错误的 Flag 试一遍,看下程序输出 拉进 IDA,发现这些字符串并不存在,那就直接拉进 x64dbg,在输入 flag 前按下暂停,从堆栈找 mainFunc (0x140057A20) 通过对 mainFunc (0x140057A20) 伪代码 switch-case 结构的分析,得到下面的操作流程 1234567891011121314151617181920212223[EnterPoint] | (0) 预处理+打印提示 | (1) ? | a1+4708 > 41 (2/3) 判断器 ───────────────> (4) 根据 a1 + 4576 的大小来决定输出 Wrong! / Correct! | | a1+4708 < 41 └────────┐ | (5) 将用户输入映射为只有 0x2/0x3 ...
看雪·2025 KCTF 第九题 WriteUP
前言GPT-5 还是 Pro 好用,Thinking 老是走弯路,浪费了不少时间 本文的分析由 GPT-5 Pro + Thinking 写成,我只干了脱壳的事(❁´◡`❁) LLM 万岁(雾 1. 脱壳用 DIE 查壳,发现加了 Enigma Virtual Box 的壳,用 EnigmaVBUnpacker 脱壳后可得到源代码。 对于释放出来的 20250805Calc, 直接在程序运行的时候从temp复制过来就行,或者 dnSpy 直接导出就可以得到原始可执行文件 对 20250805Calc.exe 使用 pyinstxtractor + PyLingual 还原原始代码 1234567891011121314151617181920212223# Decompiled with PyLingual (https://pylingual.io)# Internal filename: 20250805Calc-pub.py# Bytecode version: 3.12.0rc2 (3531)# Source timestamp: 19...
看雪·2025 KCTF 第七题 WriteUP
开始看着是 iOT 的题要跑虚拟机,实则 IDA 都能做出来(雾 IDA 直接加载完主程序,检验逻辑直接写在 main() 里面了,但是有一些不明所以的变量 直接复制粘贴到 VS Code 里面改变量名就舒服多了 -O- 分析string_to_code 中 字符串和对应数值的映射直接看伪代码,可以推出 act=0, con=0, abort=1, cancel=1, enable=2, start=2, run=2, stop=3, reset=4, reboot=4 于是我们可以将伪代码中 string_to_code(x) 直接换成对应的数值 v39 缓冲区填充123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657p_argc = &argc;printf("key:");if ( fgets...
HybridCLR C# 方法体解密记录 V1 —— 以23年的少女前线2追放为例
本来标题我想写 HybridCLR 标准代码加固解密记录 的,但考虑到不确定ym是否基于社区版的基础上作的修改,因而作罢 不过人家官网上确实有少前2的商业合作案例来着 初探在翻文件目录的时候,我发现了在 GF2_Exilium_Data\StreamingAssets\ClientRes_Windows\Codes 下有很多 bytes 文件,且文件名都是 Unity 在 Mono 模式编译下的编译产物 扔进 dnSpy 看一下,方法识别没有问题,但是方法体里面的 IL 指令全部被混淆,没办法解析 研究看了一下之前导出的 dump 文件,发现这玩意的解释运行是基于 HybridCLR 的 对于 HybridCLR 的源码解析,知乎有一篇文章写的不错 【划时代的代码热更新方案——hybridclr源码流程解析】 但对于我们调试苦逼人来说,还是官网的指点比较有性价比 () 【官网链接-HybridCLR源码结构及调试】 在官网中提到了,IL层指令集转换在 HybridCLR/transform/transform.cpp 的 HiTransform::Transform 函数,...
它加密了吗,如加——明日方舟:终末地 资源解密记录
它加密了吗,如加——明日方舟:终末地 CBT1 资源解密记录没啥可说的,鸽了几个月的东西() 观察先看看AB包,这种奇怪后缀肯定加了料 不加我倒立 瞄一下程序行为,读取AB包看起来比较正常,偏移看上去没问题 扔进 AssetStudio,改了压缩类型,大概率也做了加密 (和某厂差不多的味道) 分析这玩意的 UnityPlayer.dll 不仅加了VMP3,也加了不知名压缩壳,我选择直接 dump 出来之后再静态分析 (差了几倍你敢信???) 找到 CreateDecompressor, 果然使用了自定义的flag 解压函数一时半会看不出来什么问题,先去看看前面的处理,一般来说不在解压做解密,那就会在读取做解密 找到 ArchiveStorageReader::ReadFromStorage,发现了点问题,直接一个jmp大跳跳到别的函数去读取了 这个函数实际上就是将读取的工作扔去 FairGuardProtect.dll 里面,具体可以看下面 GPT4 的解释 动态一下(其实看堆栈也行),跳转来到了 FairGuardProtect.dll + 0x26F50...
一种新的辨认VMP3的方法
最近,VMP 3.5.1 的源码被完整泄露了 等不及看见国产虚拟机了 朋友在读源码的时候发现了 VMP 编译器水印的位置,我只是个调试菜鸡, 写这个文章来记录一下过程 思路 [来自朋友友情赞助]在 cores/processors.cc 的第 2070 行,出现了一个函数 BaseFunction::AddWatermark, 内容如下 1234567891011121314151617181920212223242526272829303132333435uint8_t *version_watermark = NULL;uint8_t *owner_watermark = NULL;void BaseFunction::AddWatermark(Watermark *watermark, int copy_count){ Watermark secure_watermark(NULL); std::string value; uint8_t *internal_watermarks[] = {version_watermark, own...
少前2:追放 资源解密记录
本文仅供个人研究所用,不提供任何解密后的资源,侵删 最近,某个总是被人说药丸的游戏出了一个新游戏,闲的没事想看看资源结果被加密了(⊙ˍ⊙) 直接掏出珍藏已久的 IDA,干他 :) 1. global-metadata.dat 解密一般来说像YM这种体量不大的厂商,一般只会在业务代码中写解密逻辑,不大可能在 Unity 源码里面塞解密和修改 global-metadata.dat 的读取结构 (点名某个厂商), 所以先把 il2cpp 的符号还原会看着舒服点。 先拿 010 Editor 看下文件,标准签名头没有修改 (AF 1B B1 FA),但是后面的内容全部被加密了 启动游戏,Process Monitor看一眼,直接一眼丁真,鉴定为纯纯的传统派,这不就是把内容直接映射到内存然后解密吗,找到内存直接 dump 出来,再拿 il2cppdumper 把符号导出来就完事了 ᕕ(◠ڼ◠)ᕗ 跟着堆栈走一圈,最终跟到了 NEP2.dll 里面,等解密完之后把内存 dump 出来,再把 4~8 字节的 SDK 版本号给他修一下就可以获得符号了 (忘记截图了就来张压缩包的照...