admin 管理员组

文章数量: 887017

                  标 题: 【原创】冰点密码破解 — 强悍的调试器 SOFTICE
作 者: 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