首页
社区
课程
招聘
庆祝贺论坛重新开通,发篇超级简单的VB程序破文。
2004-6-18 23:01 3888

庆祝贺论坛重新开通,发篇超级简单的VB程序破文。

2004-6-18 23:01
3888
破解对象:全国计算机等级考试考前模拟软件(一级Windows) 2004B
软件大小:6000 KB
下载地址:http://www.skycn.com/soft/13357.html
破解工具:Ollydbg1.1
破解说明:
    软件依据《全国计算机等级考试(一级Windows)最新考纲》编写而成,内容包括上机和笔试两部分,上机分为Windows基本操作(中文Windows98)、汉字录入、文字处理软件使用(Word)、电子表格软件使用(Excel)、演示文稿软件使用(Powrpoint)和上网操作(IE、Outlook Express);笔试分为选择题和填空题。 考试环境模拟真实,系统自动计时、评分,附带评析及参考答案等特点。
    一个好用的计算机等级考试考前模拟软件,最新的版本,很多人就靠它通过考试了。未注册版没有评分及考题分析功能,当然我们最需要的就是这个功能了。没办法,只好自力更生。
破解过程:
    运行软件,有注册提示警告,随便填入什么点击注册后都提示注册成功。哪有这么善良的软件?
    用OD载入程序,ALT+E查看模块,双击MSVBVM60.DLL,搜索当前模块名称,找到rtcMsgBox函数,F2下断,运行,点注册,程序中断下来,CTRL+F9返回,点确定后再次中断,返回到这里:
004438DF  CALL DWORD PTR DS:[<&MSVBVM60.#595>]                       ;  MSVBVM60.rtcMsgBox
向上看看,没有找到可跳过的代码,估计是先将信息保存起来重启验证。看到这句可疑:

0044385E  CALL 一级Wind.004300A0

可能是保存信息。跟进去看看。直到:

004300F7  MOV EDX,一级Wind.00418398   ;  UNICODE Software\Microsoft\Windows\systemnot"

基本明白了,程序将信息保存在注册表中。重启程序,bp RegQueryValueExA,不断F9运行,直到程序读注册信息。CTRL+F9返回,逐步到这里:

0043034B  CMP SI,WORD PTR SS:[EBP-AC]   --->开始循环
00430352  JG 一级Wind.00430408   --->跳出循环
00430358  MOV CX,SI
0043035B  AND CX,1
0043035F  JNS SHORT 一级Wind.00430369
00430361  DEC CX
00430363  OR CX,0FFFE
00430367  INC CX
00430369  CMP CX,1
0043036D  JNZ 一级Wind.004303F3
00430373  MOV EDX,DWORD PTR SS:[EBP-34]
00430376  MOV DWORD PTR SS:[EBP-9C],EDX
0043037C  MOV DWORD PTR SS:[EBP-A4],8
00430386  MOV DWORD PTR SS:[EBP-4C],1
0043038D  MOV DWORD PTR SS:[EBP-54],2
00430394  LEA EAX,DWORD PTR SS:[EBP-38]
00430397  MOV DWORD PTR SS:[EBP-7C],EAX
0043039A  MOV DWORD PTR SS:[EBP-84],4008
004303A4  LEA ECX,DWORD PTR SS:[EBP-54]
004303A7  PUSH ECX
004303A8  MOVSX EDX,SI
004303AB  PUSH EDX
004303AC  LEA EAX,DWORD PTR SS:[EBP-84]
004303B2  PUSH EAX
004303B3  LEA ECX,DWORD PTR SS:[EBP-64]
004303B6  PUSH ECX
004303B7  CALL DWORD PTR DS:[<&MSVBVM60.#632>]   ;  MSVBVM60.rtcMidCharVar  --->看名称就知道截取信息
004303BD  LEA EDX,DWORD PTR SS:[EBP-A4]
004303C3  PUSH EDX
004303C4  LEA EAX,DWORD PTR SS:[EBP-64]
004303C7  PUSH EAX
004303C8  LEA ECX,DWORD PTR SS:[EBP-74]
004303CB  PUSH ECX
004303CC  CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarCat>]   ;  MSVBVM60.__vbaVarCat  --->连接刚才截取的信息
004303D2  PUSH EAX
004303D3  CALL EDI
004303D5  MOV EDX,EAX   --->在此处可看到连接后的内容
004303D7  LEA ECX,DWORD PTR SS:[EBP-34]
004303DA  CALL EBX
004303DC  LEA EDX,DWORD PTR SS:[EBP-74]
004303DF  PUSH EDX
004303E0  LEA EAX,DWORD PTR SS:[EBP-64]
004303E3  PUSH EAX
004303E4  LEA ECX,DWORD PTR SS:[EBP-54]
004303E7  PUSH ECX
004303E8  PUSH 3
004303EA  CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeVarList>]           ;  MSVBVM60.__vbaFreeVarList
004303F0  ADD ESP,10
004303F3  MOV EAX,1
004303F8  ADD AX,SI
004303FB  JO 一级Wind.004304A8
00430401  MOV ESI,EAX
00430403  JMP 一级Wind.0043034B   --->循环
00430408  MOV EDX,DWORD PTR SS:[EBP-34]  --->连接后的最终结果。

从结果来看,程序是隔位取字,如1234567890,取字后为13579。
继续F8跟踪直到返回,来到这里:

004317E7  MOV EDX,EAX
004317E9  LEA ECX,DWORD PTR SS:[EBP-18]
004317EC  CALL ESI
004317EE  PUSH EAX
004317EF  CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBstr>]  ;  MSVBVM60.__vbaLenBstr  --->结果的长度
004317F5  XOR ECX,ECX
004317F7  CMP EAX,0F  --->与0F比较
004317FA  SETL CL     --->大于则将CL置0
004317FD  NEG ECX
004317FF  MOV WORD PTR SS:[EBP-A8],CX
00431806  LEA ECX,DWORD PTR SS:[EBP-18]
00431809  CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>]  ;  MSVBVM60.__vbaFreeStr
0043180F  CMP WORD PTR SS:[EBP-A8],DI
00431816  JE SHORT 一级Wind.0043188D  --->判断刚才比较的结果,不跳则会出现注册提示。

在此行跳过后,程序不再比较,直接出现主界面。难道只判断长度就行了?肯定还有其它陷阱。
于是用VB程序最常用的比较语句vbaStrComp和vbaVarTstEq下断,F9运行,中断在vbaStrComp,
从堆栈上看出程序是分别将注册信息的奇数位与偶数位分别取出,然后分别与另两个正确注册码比较。正确的注册码怎么生成我就不再研究了。

总结:注册码必须31位,用vbaStrComp下断即可看到程序分别比较奇数位和偶数位。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 5
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回