题目:注册“Dr.Salman's Windows Power Tools V3.95”
软件功能:Windows系统优化工具,大幅提高系统速度,内存利用率,减少内存碎片,调节硬盘缓存,优化因特网设置,提高
ISDN及拨号上网速度,该软件支持 Windows 95/98/Me/NT4/2000/XP. 注册费 U.S. $49.95。未注册版本只有7天试用期。
工具:TRW,PEID。
引子:今天又安装试验了一下这个软件,发现功能比较强大。拿PEID查看,结果是用ASProtect 1.2 / 1.2c-> Alexey
Solodovnikov加壳的。今天就在不脱壳的情况下把注册码跟踪出来好了。没有想到比较顺利。随便把跟踪过程一写,算是给
菜鸟的Crackme作业吧。因为没有脱壳,所以跟踪用TRW,为了U出代码好写这篇破文啦。启动注册程序RegWizard.exe,输入
注册码654321。调出TRW,下断点bpx hmemcpy,然后F5退出,点击“Authenticate and RegisterMe”按钮,被拦住。按8
次F12,换F10跟踪到如下代码处:
0197:6607B2B5 CALL NEAR [ECX+10]
0197:6607B2B8 MOV EAX,[6610F7FC] //我们返回到这里来。
0197:6607B2BD TEST EAX,EAX
0197:6607B2BF JZ 6607B2D6
0197:6607B2C1 MOV EAX,[EAX]
0197:6607B2C3 TEST EAX,EAX
0197:6607B2C5 JZ 6607B2D6
0197:6607B2C7 MOV EBX,[EBX] //假码地址送EBX。
0197:6607B2C9 TEST EBX,EBX
0197:6607B2CB JNZ 6607B2D2 //跳走。
0197:6607B2CD MOV EBX,66005020
0197:6607B2D2 PUSH EBX
0197:6607B2D3 CALL EAX //这个函数对注册码进行测试是否为1E,1F。
0197:6607B2D5 POP ECX
0197:6607B2D6 XOR EAX,EAX
0197:6607B2D8 JMP SHORT 6607B2A2 //跳到上面去,返回到如下代码处。
===============================================================
下面我们来到主程序空间了:
0197:0047B7F7 CALL NEAR [ECX+A0]
0197:0047B7FD TEST EAX,EAX //返回到这里。
0197:0047B7FF FNCLEX
0197:0047B801 JNL 0047B815 //此处自然跳。
0197:0047B803 PUSH DWORD A0
0197:0047B808 PUSH DWORD 0040C3E0
0197:0047B80D PUSH EDI
0197:0047B80E PUSH EAX
0197:0047B80F CALL NEAR [00401050]
0197:0047B815 MOV EAX,[EBP-18] //假码地址送EAX。
0197:0047B818 PUSH EAX
0197:0047B819 PUSH DWORD 0040B858 //这个就是真码地址。不知为什么此程序员把这个放在眼皮底下呢?
0197:0047B81E CALL NEAR [004010B4] //进入这个CALL就是比较了。我们也进去看看。代码在后。(*)
0197:0047B824 MOV EDI,EAX
0197:0047B826 LEA ECX,[EBP-18]
0197:0047B829 NEG EDI
0197:0047B82B SBB EDI,EDI
0197:0047B82D INC EDI
0197:0047B82E NEG EDI
0197:0047B830 CALL NEAR [004011C8]
0197:0047B836 LEA ECX,[EBP-1C]
0197:0047B839 CALL NEAR [004011C4]
0197:0047B83F TEST DI,DI //如果注册码正确,则DI为FFFF。
0197:0047B842 JZ NEAR 0047B8E2 //这个不会跳则OK。
0197:0047B848 PUSH DWORD 0040B858 //这个又是正确注册码地址。
0197:0047B84D PUSH DWORD 0040B678
0197:0047B852 PUSH DWORD 0040B830
0197:0047B857 PUSH DWORD 0040B818
0197:0047B85C PUSH DWORD 80000002
0197:0047B861 CALL 004738F0
0197:0047B866 MOV ECX,[ESI]
0197:0047B868 PUSH ESI
===============================================================
下面是(*)处的函数调用代码:
0197:66024718 PUSH BYTE +00
0197:6602471A CALL `MSVBVM60!__vbaStrComp`
0197:6602471F RET 08
0197:66024722 CMP DWORD [ESP+04],BYTE +02
0197:66024727 JZ NEAR 660470E0
0197:6602472D PUSH DWORD 00030001
0197:66024732 PUSH DWORD [ESP+08]
0197:66024736 PUSH DWORD [ESP+10] //假码地址进栈。
0197:6602473A PUSH DWORD [ESP+18] //真码地址进栈。
0197:6602473E CALL `OLEAUT32!VarBstrCmp` //此处比较。
0197:66024744 TEST EAX,EAX
0197:66024746 JL NEAR 660470E7
0197:6602474C DEC EAX
===============================================================
0197:653C2DED PUSH EBP
0197:653C2DEE MOV EBP,ESP
0197:653C2DF0 PUSH ECX
0197:653C2DF1 PUSH EBX
0197:653C2DF2 PUSH ESI
0197:653C2DF3 MOV ESI,[EBP+08]
0197:653C2DF6 PUSH EDI //假码地址进栈。
0197:653C2DF7 TEST ESI,ESI
0197:653C2DF9 JNZ 653C2E47 //此处跳下去。
0197:653C2DFB AND [EBP-04],ESI
0197:653C2DFE MOV ECX,[EBP+0C] //真码地址送ECX。
0197:653C2E01 TEST ECX,ECX
0197:653C2E03 JNZ 653C2E4F //此处自然跳下面。
0197:653C2E05 XOR EBX,EBX
0197:653C2E07 CMP [EBP-04],EBX
0197:653C2E0A MOV EDX,[EBP-04]
0197:653C2E0D JC 653C2E11 //此处跳。
0197:653C2E0F MOV EDX,EBX
0197:653C2E11 MOV EAX,[EBP+10]
0197:653C2E14 TEST EAX,EAX
0197:653C2E16 JNZ 653C2E73 //此处不跳。
0197:653C2E18 TEST EDX,EDX
0197:653C2E1A JZ 653C2E7C //此处没跳。
0197:653C2E1C MOV EAX,EDX
0197:653C2E1E SHR EAX,1
0197:653C2E20 MOV [EBP+10],EAX
0197:653C2E23 MOV EDI,[EBP+0C] //真码送EDI。
0197:653C2E26 MOV ESI,[EBP+08] //假码送ESI。
0197:653C2E29 MOV ECX,[EBP+10] //比较次数为6。
0197:653C2E2C XOR EAX,EAX
0197:653C2E2E REPE CMPSW //比较。
0197:653C2E31 JZ 653C2E38 //跳走。
0197:653C2E33 SBB EAX,EAX
0197:653C2E35 SBB EAX,BYTE -01
0197:653C2E38 TEST EAX,EAX
0197:653C2E3A JG 653C2E81 //不跳。
0197:653C2E3C JNL 653C2E54 //跳走。
0197:653C2E3E XOR EAX,EAX
0197:653C2E40 POP EDI
0197:653C2E41 POP ESI
0197:653C2E42 POP EBX
0197:653C2E43 LEAVE
0197:653C2E44 RET 10
0197:653C2E47 MOV EAX,[ESI-04]
0197:653C2E4A MOV [EBP-04],EAX
0197:653C2E4D JMP SHORT 653C2DFE //此处跳上去。
0197:653C2E4F MOV EBX,[ECX-04]
0197:653C2E52 JMP SHORT 653C2E07 //此处跳上去。
0197:653C2E54 TEST DL,01
0197:653C2E57 JZ 653C2E7C //跳走。
*略去几行*
0197:653C2E7C CMP [EBP-04],EBX
0197:653C2E7F JNA 653C2E86 //跳走。
0197:653C2E81 PUSH BYTE +02
0197:653C2E83 POP EAX
0197:653C2E84 JMP SHORT 653C2E40
0197:653C2E86 SBB EAX,EAX
0197:653C2E88 INC EAX
0197:653C2E89 JMP SHORT 653C2E40 //从这里跳上去,并返回。
===============================================================
后记:小软件几乎是把注册码给你提供到眼皮底下的,作者比较仁慈啊。不过开发者收取的注册费可是不低。这个程序是用VB
写的,既然能够跟踪出其注册码来,就不辛苦的去脱壳了。这个软件不值得费那么大力气。把精力放到更为复杂的程序更好。
用10分钟跟踪出代码,用30分钟才能够写好破文。感谢各位的支持!让大侠笑掉大牙了,非常抱歉!
结论:
JPX785-GT56F-KPL98-RTWQ9
另外,这个软件在H.L.M\Software\Powertool键下面创建了子键SerialNumber,里面放的是注册码的明码。如果修改一下
,就可以重新注册。
qduwg
qduwg@163.com
完稿:2006年1月30日Ethiopia
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!