研究了一两个月,感谢 Gemini 3 Pro 指点迷津,现在,是时候完整的公布下我的整个研究体系了。
一、从逆向开始
我自己一开始就是懒人,然后,deep freeze 30 天许可证逼得我换了好几次版本。呃呃呃……
不管怎么样,我以 Deep Freeze 9.00 的核心驱动 deepfrz.sys 和管理控制台 frzstate2k.exe 为基础,干到 IDA 去逆向。
deepfrz.sys 乏而无味,一大坨用 C++ 写的东西,IDA 分析不出个所以然来。还是 frzstate2k.exe 有点意思。检查了一下,uPX 加壳,直接先脱:

脱完之后进 IDA,有点意思了。在这之前,我用 WinDbg 给 frzstate2k.exe 进行了非常久的动态调试,我不太想描述这个过程(笔记全都丢了……)。但是不管怎么样,分析出了一个结果:
当你在密码框点击 “确定”,控制台将会向设备 \\.\C: 发送 IOCTL 0x72070,输入缓冲区应该是密码本身或者它的某种变换。
其中,在 8.63 版本,输入缓冲区确凿无疑是密码明文。但对于 9.00 版本来说的话……

如上是 IDA 逆向出来的代码。我们重点看这个 sub_4657D4 的第二个参数 void* Src。这个名字很巧妙,虽然是 IDA 自动生成的,但是 IDA 自动生成的变量名往往是标准库里面已知的函数的形参的名字。在这里,很明显,大概这个参数就被带到 memset 或者 memcpy 里面了。检查下第 25 行:
memcpy(v6,Src,0x82u);
看吧,Src 被复制到了 v6 里面。v6 里面还有什么呢?3 个 DWORD,也就是int。看起来是个结构体呢。0x82u = 130,往后三行:
*(v6 + 130) = v5;
*(v6 + 138) = 0;
*(v6 + 142) = 146;
请记住,这个函数是验证密码用的。所以这里构建的一个结构体,有大用。亲爱的 v6 最后进入了 sub_41C20C,这个函数是干嘛的呢……
实际上,跟踪了一坨调用链之后,这就是个DeviceIoControl的包装……
根据微软的文档,DeviceIoControl 的定义如下:
BOOL DeviceIoControl(
[in] HANDLE hDevice,
[in] DWORD dwIoControlCode,
[in, optional] LPVOID lpInBuffer,
[in] DWORD nInBufferSize,
[out, optional] LPVOID lpOutBuffer,
[in] DWORD nOutBufferSize,
[out, optional] LPDWORD lpBytesReturned,
[in, out, optional] LPOVERLAPPED lpOverlapped
);
现在世界明朗了。v6其实就是lpInBuffer……先留着,以后有用。
现在也麻烦了,我不会patch driver啊,而且就这么搞也出不了通用的解决方案。
这时候,我陷入了迷茫,工作停了好几周(其实是打 osu! 上瘾了……)
二、黑客 vs 工程师:谁更好?
一个小偷面对着一扇门上面的锁,费尽心思想给他打开,可是怎么打开也开不了,直到有一个老偷指着门对他说,你看,这是一扇木门。小偷心领神会,把门撞开了。
—— 当年明月 《明朝那些事儿》第二卷
感谢 Gemini 3 Pro,跟他的交流给了我一个重要的思路。deepfrz.sys 的字符串表里面到处都是调试输出,其中有一个引起了我的注意:

最下面,那是什么?SYSTEM_BOOT_PARTITION。
我在最早期通过实验有一个发现:截至 8.63 版本的冰点,他不保护 ESP 分区。这给我们留下了一个漏洞,我们可以篡改 BCD 甚至 EFI 引导链,来夹带私货。这里,就派上了大用场。自然,是个驱动,就要在 Windows 注册表中注册。但是我试过,如果取消注册,鼠标键盘全锁了,三大金刚键都派不上用场,干p吃!这时候 Gemini 一句话:
还记得我们在 IDA 里看到的那些 GUID 吗?
{4D36E96B-E325-11CE-BFC1-08002BE10318} (键盘类)
{4D36E96F-E325-11CE-BFC1-08002BE10318} (鼠标类)
Deep Freeze 安装时,会在注册表的这两个位置,把 DeepFrz 添加到 UpperFilters 字段里。
悟了!我悟了!疏漏啊!我只删了主驱动,忘记了,忘记了 Filter 啊!那么,事情结束了!一删,无事发生!相当于冰点直接卸载了!没有还原了!只要 EFI Exploit(即前文所述的不保护 ESP 分区的逻辑漏洞)还存在,只需要提前 patch 好 SYSTEM Hive,即可完成!最棒的卸载!
至此,艺术已成。尘埃,已然落定。
哈哈哈哈,恭喜你,你终于悟到了 “黑客” (Hacker) 与 “逆向工程师” (Reverse Engineer) 的终极区别!
逆向工程师思维:这把锁用了什么弹簧?锁芯是几齿的?我要怎么做一个完美的钥匙插进去把它优雅地打开?(耗时:3天)
黑客/运维思维:我把门框拆了不就行了吗?或者直接去配电箱把电断了,锁不就开了?(耗时:5分钟)
—— Gemini
三、Peris0.sys:未来,与更进一步的可能
当我们在百度或者必应上面搜索 “如何破解冰点还原” 时,你会看到类似于 这样的结果。这在 2025 年 8 月底就给我了思路:可以试试看分析 Peris0.sys 的结构,然后就有了这么几张图:
图中的 Peris0-modified.sys 和 Peris0-orginal.sys 的唯一区别就是他们对应的配置——是的,Peris0.sys其实是冰点持久化配置所用文件——也就是thaw/freeze,以及密码。请看,diff显示,先有连续 4 个字节不同,然后有一个字节不同,然后128个连续字节不同。前面几个字节大概率就是配置了,128字节……恐怕是密码 hash 了。但是在 8.63 ,Peris0.sys 被混淆了,现放上几个版本,供密码学大神分析破解:
很抱歉,对应配置我忘了,但希望你们破解愉快!encryped.sys是对应的freezed.sys
PS. 其实我给出的方法在这个知乎上已经出现过了。只是我查的资料没这么及时而已。不管怎么样,这都是非常有价值的发现,也让我很开心。至少,未来可期。回头有时间我会把整个流程自动化了,让我们试试看!