Visual Parse++的破解经历

今天down了一个Visual Parse++来研究,可没想到连测试版也需要注册码。按照提示发了封索取注册码的邮件,半天不见回应,就干脆自己动手破解。

使用OllyDbg加载SSVParse.exe文件,运行一下,还好文件没有加壳,一切正常。破解过程最重要的就是找到对注册码进行操作的代码,方法有很多,但不外乎是设置断点。找了半天没找到SSVParse.exe对GetWindowText的调用,只好对MessageBoxA和strcmp函数设置断点。可惜,在提示注册码不正确的对话框弹出后,程序没有被中断。:(

我把提示对话框中的提示字符串抄下来,然后在OllyDbg中查找字符参考,搜索提示字符串。幸运的很,找到了!跳到引用提示字符串的代码,回溯到上级调用,多找几个地方设置断点。重新启动程序,终于程序被中断了!剩下的任务就是对程序进行分析了。我不想找出它的注册码生成算法,只想Crack,程序能用就行。

以下是截取的一段汇编代码,我在代码的右边进行了注释。

004343BE  CALL SSVParse.004A0244  ; 初始化测试
004343C3   TEST EAX,EAX
004343C5   JNZ SSVParse.004344C6004344CB  ; 弹对话框: "Initialization failed - Error %lu"
...
004343D9   CALL SSVParse.0049FEAD   ; 分析密钥文件: "C:/WINDOWS/SSVP500D.LIC"
004343DE   CMP BYTE PTR SS:[ESP+8],44  ; SS:[ESP+8]应该保存的是分析密钥文件的结果,
                                                                                ;其中低字节为44表示用户已经成功的输入过密钥
004343E3   JNZ SHORT SSVParse.0043443B ; 如果用户还没输入密钥(低字节不等于44),
                                                                                    ; 转到弹出输入密钥对话框的代码
...
004343EC  SSVParse.0049FCFB                   ; 进一步对密钥文件"C:/WINDOWS/SSVP500D.LIC"进行分析
004343F1   MOV ECX,EAX    ; 分析结果(状态码)返回在EAX中
004343F3   SUB ECX,0                                ;  Switch (cases 0..1A)
004343F6   JE SSVParse.00434499  ; 如果状态码为0,跳转到SSVParse.00434499
004343FC   DEC ECX
004343FD  JE SHORT SSVParse.00434468  ; 状态码为1,跳转到SSVParse.00434468: 弹出对话框
                                                                                   ; "The trial has expired, contact Sandstone", 并退出程序
004343FF   SUB ECX,19     
00434402   JE SHORT SSVParse.0043442D  ; 状态码为1a,跳转到SSVParse.0043442D
00434404   PUSH EAX                                 ;  Default case of switch 004343F3
...
00434409   PUSH SSVParse.005714A4                   ;  ASCII "Expiration test failed - Error %lu"
...
0043440F  CALL <JMP.&MFC42.#2818>   ; 弹出对话框: "Expiration test failed - Error %lu"
...
00434425   PUSH 1                                   ; status = 1
00434427   CALL DWORD PTR DS:[<&MSVCRT.exit>]       ; 退出程序

在几个关键的地方改变一下Z标志,终于进入了程序主界面。得意忘形之余,我对"C:/WINDOWS/SSVP500D.LIC"文件发生了兴趣,用写字板打开了一下,没找到什么有用的信息,索性把它给删除了。重新对程序进行跟踪,这下糟糕,程序弹出一个找不到"C:/WINDOWS/SSVP500D.LIC"文件的错误对话框后就退出了。估计重施,继续查找字符参考,搜索对话框中的提示信息。顺利找到用于测试密钥文件"C:/WINDOWS/SSVP500D.LIC"的代码,其入口为00434210。继续跟踪、分析,发现Visual Parse++的安全强度最多只有2位!也就是说,只要把SSVParse.exe文件中的两位进行反置,便能顺利破解Visual Parse++。以下是破解的位置:

0043431B  |. 74 0C          JE SHORT SSVParse.00434329  ==>
0043431B     75 0C          JNZ SHORT SSVParse.00434329

00433FC2   . 75 5F          JNZ SHORT SSVParse.00434023 ==>
00433FC2     74 5F          JE SHORT SSVParse.00434023

将文件绝对位置0x3431b中的0x74改为0x75,将0x33fc2中的0x75改为0x74。看似更改了两个字节,其实只有两位而已。这时候突然想起了以前看得一本破解书籍,作者提到windows系统的安全强度可能只有1位。也就是说某个程序,或者是出于某种以外(比如电压的波动),导致系统内存中的某一位发生了变化,windows就可能已被破解。

posted @ 2006-03-23 17:04  Goncely  阅读(295)  评论(0编辑  收藏  举报