admin 管理员组文章数量: 887017
作 者: figo
时 间: 2007-06-11,15:17
链 接: http://bbs.pediy/showthread.php?t=46153
【文章标题】: 冰点密码破解
【文章作者】: figo
【作者邮箱】: yangtengfei@56
【作者QQ号】: 382174647
【软件名称】: 冰点6.00.220.1692 企业版
【加壳方式】: 未知壳
【保护方式】: ANIT DEBUG,加壳
【编写语言】: C , ASM32
【使用工具】: SOFTICE MASM32 VC++ 6.0
【操作平台】: WINXP
【作者声明】: 纯技术交流,不针对任何软件.请勿用于恶意破坏等非法用途,
否则给自己或他人带来严重后果,概与本人无关.失误之处恳请批评指正,
或有更好的方法或者技巧,欢迎互相交流.
--------------------------------------------------------------------------------
【软件介绍】:
Deep Freeze 是一款类似于还原精灵的系统还原软件,但它比还原精灵强悍,无论加密强度或安全性.
据介绍这软件无解,至今为找到破解方法.一旦弄丢了管理 密码,只能格式化磁盘重新安装系统了.
笔者发布此文章只是为了交流技术,并无其它目的,请不要用于恶意破坏等非法用途.
如果文章能丢失为 密码的用户带来一点帮助的话,笔者会十分欣慰的,毕竟好几天的努力才完成这文章的,
Deep Freeze 的下载地址也不提供了,网上到处都是,版本是 6.20.220.1692
【详细过程】
破解前的准备:
先安装好 冰点 和 SOFTICE,笔者用的 DS3.2 中的 SOFTICE. 还有 IceExt 0.70 插件的安装(这并不是必须的,
只是写文章的时候要用到,后面会介绍 IceExt 插件的妙用).装好 冰点后,把客户端的 密码设置为:382174647
(呵呵,这是我的QQ号, 当然,你也可以设置为任意 密码 ),把还原的盘设为 Z 盘(也可以任意,
但一般不设为自己的硬盘分区),最后安装客户端.
开始分析:
首先,按住键盘上的 CTRL + ALT + SHIFT + F6 四个键,调出 冰点的 密码输入对话框. 输入任意 密码,如: 234234.
CTRL + D 调出 SOFTICE. 此时,你可千万别指望能在内存中找到 '234234' 的数据,并置断点.
用 S 指令搜遍整个 4G 空间也一样,就算找到了,那也不是 密码文本框的.
因为当改变文本框的内容时,该文本框会自动调用 NT 的 Native API :RtlRunEncodeUnicodeString 函数 进行加密.
当应用程序想获取文本内容时,该文本框又会调用 RtlRunDecodeUnicodeString 函数进行解密.
关于 RtlRunEncodeUnicodeString 和 RtlRunDecodeUnicodeString 的源代码可以在 NT 源代码中的 sertl.c 文件中找到.
其实 RtlRunEncodeUnicodeString 只是对数据进行简单的 XOR 运算,尽管加密算法简单,却很有效的防止在内存中被找出明码.
虽然我们可以不用知道 RtlRunDecodeUnicodeString 的具体算法,但为了利于破解,我们还是有必要知道它的定义:
VOID RtlRunDecodeUnicodeString( UCHAR Seed, PUNICODE_STRING String )
第一个参数是 :
字节类型, 加密的种子的值.
第二个参数是:
是个 PUNICODE_STRING 数据类型
指向被解密的数据的地址(注意了,是双重指针)
好了,通过上面的分析,我们开始对 RtlRunDecodeUnicodeString 下断点,点击 OK 按纽,程序被中断在如下代码:
EAX=0000002A EBX=00000006 ECX=7C822E07 EDX=00140608 ESI=0014C2A8
EDI=0014CDB0 EBP=0012F088 ESP=0012F06C EIP=7C94EF8B o d I s Z a P c
CS=001B DS=0023 SS=0023 ES=0023 FS=003B GS=0000
--------------------------------------------------byte--------------PROT---(0)--
0023:00E20034 B0 CD 14 00 03 00 00 00-28 CF 14 00 68 00 E2 00 ........(...h.?
0023:00E20044 00 00 00 00 03 00 01 00-90 A5 15 00 03 00 01 00 ........惀......
0023:00E20054 B0 65 17 00 03 00 01 00-D0 25 19 00 03 00 01 00 .e.......%......
0023:00E20064 F0 E5 1A 00 70 00 E2 00-00 00 00 00 78 00 E2 00 .?.p.?....x.?
------ntdll!RtlRunEncodeUnicodeString+004D-------------------------------PROT32-
ntdll!RtlRunDecodeUnicodeString
001B:7C94EF8B 8BFF MOV EDI,EDI
001B:7C94EF8D 55 PUSH EBP
001B:7C94EF8E 8BEC MOV EBP,ESP
刚才我们了解到 RtlRunDecodeUnicodeString 的第二个参数是指向密文的双重指针,输入:
D *(ESP - 08)
这时,密文的地址如上面DATA 窗口所示,为 14CDB0H.
不要急着下断点,要等到它解密完毕.
P RET ,跳出 RtlRunDecodeUnicodeString
然后 D 14CDB0
--------------------------------------------------byte--------------PROT---(0)--
0023:0014CDB0 32 33 34 32 33 34 00 00-00 00 00 00 00 00 00 00 234234..........
0023:0014CDC0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
可以看到明码已经出现在我们面前. 好了,可以对它下硬件读断点
bpm 14CDB0 R
G 运行. 程序被中断在如下代码:
------USER32!EditWndProc+0566--------------------------------------------PROT32-
001B:77D3352D F3A5 REPZ MOVSD
001B:77D3352F 8BC8 MOV ECX,EAX
001B:77D33531 83E103 AND ECX,03
001B:77D33534 F3A4 REPZ MOVSB
001B:77D33536 E8E3FBFFFF CALL 77D3311E
001B:77D3353B 5F POP EDI
001B:77D3353C 5E POP ESI
001B:77D3353D 8BC3 MOV EAX,EBX
001B:77D3353F 5B POP EBX
001B:77D33540 5D POP EBP
001B:77D33541 C21000 RET 0010
不难看出,这段代码主要是实现数据的复制
这时的 EDI = 00BC932C, 而 ESI 则是刚才明码的地址, ESI = 0014CDB0H
同样,对 00BC932CH 下硬件读断点.G 运行 .
接下来,程序再次中断在 RtlRunDecodeUnicodeString 上,我们再次重复上面这一过程.
唯一不同的是,这次明码是被复制到 00BCA488H 处.于是对 00BCA488H 再下一个硬件读断点.
G 运行 .
程序中断在如下代码:
AX=00BCA488 EBX=00BCA488 ECX=0012F348 EDX=32343332 ESI=0012F33C
EDI=00BCAE11 EBP=0012F284 ESP=0012F254 EIP=004961F2 o d I s Z a P c
CS=001B DS=0023 SS=0023 ES=0023 FS=003B GS=0000
--------------------------------------------------byte--------------PROT---(0)--
0023:00BCA488 32 33 34 32 33 34 00 00-26 00 00 00 EC 9C BC 00 234234..&...鞙..
0023:00BCA498 00 00 00 00 34 9D BC 00-00 00 00 00 13 00 00 00 ....4?.........
0023:00BCA4A8 00 00 00 00 01 00 00 00-24 00 00 00 16 00 00 00 ........$.......
0023:00BCA4B8 EC 46 BC 00 24 AA BC 00-4F 70 74 69 14 00 00 00 霧..$?.Opti....
-------------------------------------------------------------------------PROT32-
001B:004961F0 8B10 MOV EDX,[EAX]
001B:004961F2 83C004 ADD EAX,04
001B:004961F5 8BCA MOV ECX,EDX
001B:004961F7 81EA01010101 SUB EDX,01010101
001B:004961FD 81E280808080 AND EDX,80808080
001B:00496203 74EB JZ 004961F0
001B:00496205 F7D1 NOT ECX
001B:00496207 23D1 AND EDX,ECX
001B:00496209 74E5 JZ 004961F0
对每个字节减 1 ,再判断是否为负,这段代码应该是测试字符串长度的. 看看它返回的是什么值?
P RET
代码如下:
EAX=00000006 EBX=00BCA488 ECX=00BCA488 EDX=80800000 ESI=0012F33C
EDI=00BCAE11 EBP=0012F284 ESP=0012F25C EIP=0040BF90 o d I s z a P c
CS=001B DS=0023 SS=0023 ES=0023 FS=003B GS=0000 DS:00BCAE11=0014
----------------------------
版权声明:本文标题:冰点密码破解 — 强悍的调试器 SOFTICE 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726379506h948708.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论