最近几天学习脱ASPR1.23RC4壳,没有一点进展,无奈之中想找个软柿子捏捏,于是就有了这篇破文。
破解工具:OLLYDBG1.09d,PEID0.8
破解对象:数学助理 V1.03
下载地址:
http://www.skycn.com/soft/16972.html
软件简介:
本版本功能有:解一元一次方程,解一元二次方程,解二元一次方程组,解三元一次方程组,(输入输出数为整数或小数)解一元三次因式分解,解一元二次因式分解,解部分二元二次因式分解(输入输出系数为整数)。未注册前可试用《一元一次不等式之一》的功能,其它功能注册后可使用。
破解过程:
程序运行后出现注册提示,有功能限制,点击限制使用的功能程序立即退出。随便填入注册码点击注册,程序退出。PEID查看是VB程序,于是用VBDED反编译,未果,没有什么有用的信息。
用OD载入,下VB最常见的比较断点:__vbaVarTstEq、__vbaStrComp,程序都没有断下来,看来程序没有用这些比较函数或之前有长度判断。于是下断点:__vbaLenBStr,点注册后程序终于断下,但F8跟踪发现一直在MSVBVM60.DLL中打转。
6A3881D9 50 PUSH EAX
6A3881DA 33C0 XOR EAX,EAX
6A3881DC 8A06 MOV AL,BYTE PTR DS:[ESI] --->读程序代码,
6A3881DE 46 INC ESI
6A3881DF FF2485 58FA376A JMP DWORD PTR DS:[EAX*4+6A37FA58] --->解释执行
6A3881E6 59 POP ECX
6A3881E7 0BC9 OR ECX,ECX
6A3881E9 74 03 JE SHORT MSVBVM60.6A3881EE
6A3881EB 8B49 FC MOV ECX,DWORD PTR DS:[ECX-4]
6A3881EE 51 PUSH ECX
6A3881EF 33C0 XOR EAX,EAX
6A3881F1 8A06 MOV AL,BYTE PTR DS:[ESI]
6A3881F3 46 INC ESI
6A3881F4 FF2485 58FA376A JMP DWORD PTR DS:[EAX*4+6A37FA58]
看来这是个Pcode编译的程序,程序代码都是由MSVBVM60.DLL解释执行的。于是祭出破Pcode程序的杀手锏WKTVBDE,结果出现非法操作。看来程序在防破解上还是下了功夫的。
记得有位前辈说过:破解需要好的头脑+耐心+运气。今天就来试试我的运气好不好。再次用OD载入,Alt+M打开内存查看窗,在401000段下内存访问断点,不断F9运行,直到眼前一亮,在堆栈中看到了输入的注册码。
以下F8不断走,在一些CALL中F7跟进去看看,会发现很多VB函数如__rtcR8ValFromBstr,是双精度转化函数,将注册码转化为双精度值。继续往下走,不断看到FSTP,TILD,估计会用到浮点比较。往下走,直到看到将输入的注册码压入浮点寄存器。小心F8走,看到CALL就F7一下看看,直到:
6A38104D 68 01000300 PUSH 30001
6A381052 50 PUSH EAX
6A381053 51 PUSH ECX
6A381054 52 PUSH EDX
6A381055 FF15 700E396A CALL DWORD PTR DS:[6A390E70] ; OLEAUT32.VarCmp 比较函数,今天太幸运了!!!
F7跟入此CALL,F8到
7716B5E3 MOV ECX,DWORD PTR SS:[EBP+8]
7716B5E6 FLD QWORD PTR DS:[ECX+8] ; 输入码压入浮点寄存器st(0)
7716B5E9 MOV EDX,DWORD PTR SS:[EBP+C]
7716B5EC FILD DWORD PTR DS:[EDX+8] ; 正确码压入st(0)
7716B5EF FCOMPP ; 比较
再次启动,输入正确注册码,OK!
总结:这程序防VBDED、WKTVBDE较好,但明码比较是败笔,只要在OLEAUT32.VarCmp函数上下断点,马上就来到比较的核心。VBPcode程序总是在VB的DLL中,跟踪时最好用WKTVBDE,否则就要看运气是不是有我今天这么好了。平时多看看VB的函数,了解对字符、数字的处理方法,对破解是很有帮助的。
声明:破解此程序纯属运气,请勿效仿。
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!