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就可能已被破解。