题目:注册“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