题目:注册高速缓存管理器“Cacheman v5.1 ”
软件功能:通过优化磁盘高速缓存,内存及其他设置来提高计算机性能。它能够阻止频繁的换页,从而提高系统性能,响应时

间和稳定性。适用于 Windows 95/98/ME/NT4/2000/XP。
工具:Softice,PEid
引子:今天晚上搞掉Dr.Salman's 系统工具后,接着乘胜追击,又搞掉这个小软件。因为比较简单,我也顺手把破文写了一

下,算是工作日志吧。让大侠见笑了!拿PEID查看,是DELPHI开发的。不带壳,抓代码比较方便了。启动程序,点击help,

单击Enter Custermer ID,在出现的小窗口内输入ID号,比如111_22222222,为什么这么个格式,下面告诉你答案!调出

SOFTICE,下断点bpx hmemcpy,F5退出,然后点击OK,被拦截。7次F12来到程序空间,然后换F10跟踪到如下代码:
004BDABE  |. BA E0DB4B00    MOV EDX,CACHEMAN.004BDBE0                ; |ASCII "Please enter your 

customer ID code:"
004BDAC3  |. B8 0CDC4B00    MOV EAX,CACHEMAN.004BDC0C                ; |ASCII "Cacheman"
004BDAC8  |. E8 33A0F9FF    CALL CACHEMAN.00457B00                   ; \CACHEMAN.00457B00
004BDACD  |. 837D FC 00     CMP DWORD PTR SS:[EBP-4],0      //我们返回到这里来。
004BDAD1  |. 0F84 BA000000  JE CACHEMAN.004BDB91            //此处未跳。
004BDAD7  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]    //ID码地址送EAX。
004BDADA  |. E8 E10CFFFF    CALL CACHEMAN.004AE7C0          //这个CALL是关键,F8跟入。后面分析。(*)
004BDADF  |. 84C0           TEST AL,AL
004BDAE1  |. 0F84 88000000  JE CACHEMAN.004BDB6F
004BDAE7  |. A1 E45A4C00    MOV EAX,DWORD PTR DS:[4C5AE4]
004BDAEC  |. 83C0 14        ADD EAX,14
004BDAEF  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004BDAF2  |. E8 5D62F4FF    CALL CACHEMAN.00403D54
004BDAF7  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
004BDAFA  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004BDAFD  |. BA 20DC4B00    MOV EDX,CACHEMAN.004BDC20                ;  ASCII "Customer ID: "
004BDB02  |. E8 C564F4FF    CALL CACHEMAN.00403FCC
004BDB07  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]             ;  KERNEL32.BFF79138
004BDB0A  |. 8B83 64060000  MOV EAX,DWORD PTR DS:[EBX+664]
004BDB10  |. E8 3BA3F8FF    CALL CACHEMAN.00447E50
004BDB15  |. B2 01          MOV DL,1
004BDB17  |. 8B83 68060000  MOV EAX,DWORD PTR DS:[EBX+668]
004BDB1D  |. E8 16A2F8FF    CALL CACHEMAN.00447D38
004BDB22  |. 8B83 FC050000  MOV EAX,DWORD PTR DS:[EBX+5FC]
004BDB28  |. 83C0 70        ADD EAX,70
004BDB2B  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004BDB2E  |. BA 38DC4B00    MOV EDX,CACHEMAN.004BDC38                ;  ASCII "mailto:cacheman-

support@outertech.com?subject=Cacheman Support Request, Customer ID: "
004BDB33  |. E8 9464F4FF    CALL CACHEMAN.00403FCC
004BDB38  |. A1 E45A4C00    MOV EAX,DWORD PTR DS:[4C5AE4]
004BDB3D  |. 8B40 14        MOV EAX,DWORD PTR DS:[EAX+14]            ;  CACHEMAN.004C1004
004BDB40  |. 50             PUSH EAX                                 ;  CACHEMAN.<ModuleEntryPoint>
004BDB41  |. A1 CC5A4C00    MOV EAX,DWORD PTR DS:[4C5ACC]
004BDB46  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
004BDB48  |. B9 98DC4B00    MOV ECX,CACHEMAN.004BDC98                ;  ASCII "CustomerID"
004BDB4D  |. BA ACDC4B00    MOV EDX,CACHEMAN.004BDCAC                ;  ASCII "Information"
004BDB52  |. 8B18           MOV EBX,DWORD PTR DS:[EAX]
004BDB54  |. FF53 04        CALL DWORD PTR DS:[EBX+4]
004BDB57  |. A1 CC5A4C00    MOV EAX,DWORD PTR DS:[4C5ACC]
004BDB5C  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
004BDB5E  |. 8B10           MOV EDX,DWORD PTR DS:[EAX]
004BDB60  |. FF52 4C        CALL DWORD PTR DS:[EDX+4C]
004BDB63  |. B8 C0DC4B00    MOV EAX,CACHEMAN.004BDCC0                ;  ASCII "Thank you for 

registering. The customer ID will be shown in the support section.
When launching the "Send support request" function from the help menu it will be
automatically inserted to the subject of the mail!"
004BDB68  |. E8 779CF9FF    CALL CACHEMAN.004577E4
004BDB6D  |. EB 22          JMP SHORT CACHEMAN.004BDB91
004BDB6F  |> 68 A0DD4B00    PUSH CACHEMAN.004BDDA0
004BDB74  |. FF75 FC        PUSH DWORD PTR SS:[EBP-4]
004BDB77  |. 68 ACDD4B00    PUSH CACHEMAN.004BDDAC                   ;  ASCII "" is not a valid 

Customer ID!"
004BDB7C  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004BDB7F  |. BA 03000000    MOV EDX,3
004BDB84  |. E8 B764F4FF    CALL CACHEMAN.00404040
004BDB89  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]             ;  KERNEL32.BFFC0D90
004BDB8C  |. E8 539CF9FF    CALL CACHEMAN.004577E4
004BDB91  |> 33C0           XOR EAX,EAX                              ;  CACHEMAN.<ModuleEntryPoint>
004BDB93  |. 5A             POP EDX                                  ;  KERNEL32.BFF8B86C
004BDB94  |. 59             POP ECX                                  ;  KERNEL32.BFF8B86C
004BDB95  |. 59             POP ECX                                  ;  KERNEL32.BFF8B86C
004BDB96  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004BDB99  |. 68 B3DB4B00    PUSH CACHEMAN.004BDBB3
004BDB9E  |> 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004BDBA1  |. BA 03000000    MOV EDX,3
004BDBA6  |. E8 7961F4FF    CALL CACHEMAN.00403D24
004BDBAB  \. C3             RETN
======================================================================
下面是004BDADA  CALL CACHEMAN.004AE7C0 代码分析:      (*)
004AE7C0  /$ 55             PUSH EBP
004AE7C1  |. 8BEC           MOV EBP,ESP
004AE7C3  |. 6A 00          PUSH 0
004AE7C5  |. 6A 00          PUSH 0
004AE7C7  |. 6A 00          PUSH 0
004AE7C9  |. 53             PUSH EBX
004AE7CA  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX           
004AE7CD  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004AE7D0  |. E8 5F59F5FF    CALL CACHEMAN.00404134
004AE7D5  |. 33C0           XOR EAX,EAX                            
004AE7D7  |. 55             PUSH EBP
004AE7D8  |. 68 6AE84A00    PUSH CACHEMAN.004AE86A
004AE7DD  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
004AE7E0  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
004AE7E3  |. 33DB           XOR EBX,EBX
004AE7E5  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004AE7E8  |. B8 80E84A00    MOV EAX,CACHEMAN.004AE880
004AE7ED  |. E8 7A5AF5FF    CALL CACHEMAN.0040426C          //这个函数是判断前4位ID号最后一位是否是下划线

_。后面分析。(**)
004AE7F2  |. 83F8 04        CMP EAX,4                       //如果ID码第四位是下划线,则返回4。
004AE7F5  |. 75 58          JNZ SHORT CACHEMAN.004AE84F     //此处就不跳。
004AE7F7  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 
004AE7FA  |. E8 8157F5FF    CALL CACHEMAN.00403F80          //判断ID总长是否为C,即12位。
004AE7FF  |. 83F8 0C        CMP EAX,0C
004AE802  |. 75 4B          JNZ SHORT CACHEMAN.004AE84F    //如果是12位则不跳。否则OVER。
004AE804  |. 8D4D F4        LEA ECX,DWORD PTR SS:[EBP-C]
004AE807  |. BA 03000000    MOV EDX,3
004AE80C  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004AE80F  |. E8 F8240100    CALL CACHEMAN.004C0D0C     
004AE814  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]            
004AE817  |. 33D2           XOR EDX,EDX
004AE819  |. E8 6EA4F5FF    CALL CACHEMAN.00408C8C           //这个函数处理前3位ID码。后面分析(***)。
004AE81E  |. 8BD8           MOV EBX,EAX                      //EBX保存了前3位注册码的16进制值。后面用于比

较。
004AE820  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004AE823  |. BA 08000000    MOV EDX,8
004AE828  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004AE82B  |. E8 34250100    CALL CACHEMAN.004C0D64           // 把下划线'_'后面的8位字符复制到另外地方去


004AE830  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]     //把后8位ID码地址送EAX。         
004AE833  |. E8 4857F5FF    CALL CACHEMAN.00403F80    
004AE838  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]            
004AE83B  |. 0FB64402 FF    MOVZX EAX,BYTE PTR DS:[EDX+EAX-1] //取8位ID码的最后一位送EAX。
004AE840  |. 03C0           ADD EAX,EAX                                   //EAX=EAX+EAX。
004AE842  |. 8D0440         LEA EAX,DWORD PTR DS:[EAX+EAX*2]  //EAX=EAX*3。
004AE845  |. 83F0 14        XOR EAX,14                        //EAX与14异或运算。
004AE848  |. 3BC3           CMP EAX,EBX                       //EBX内放的是前面计算得到的16进制数,与刚刚

计算得到的EAX比较。相等则OK。
004AE84A  |. 0F94C0         SETE AL                           //相等则置AL为1。
004AE84D  |. 8BD8           MOV EBX,EAX                            
004AE84F  |> 33C0           XOR EAX,EAX                           
004AE851  |. 5A             POP EDX                               
004AE852  |. 59             POP ECX                               
004AE853  |. 59             POP ECX                                 
004AE854  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004AE857  |. 68 71E84A00    PUSH CACHEMAN.004AE871
004AE85C  |> 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004AE85F  |. BA 03000000    MOV EDX,3
004AE864  |. E8 BB54F5FF    CALL CACHEMAN.00403D24
004AE869  \. C3             RETN
======================================================================
下面分析004AE7ED CALL CACHEMAN.0040426C 。(**)
0040426C  /$ 85C0           TEST EAX,EAX
0040426E  |. 74 40          JE SHORT CACHEMAN.004042B0
00404270  |. 85D2           TEST EDX,EDX
00404272  |. 74 31          JE SHORT CACHEMAN.004042A5
00404274  |. 53             PUSH EBX
00404275  |. 56             PUSH ESI
00404276  |. 57             PUSH EDI
00404277  |. 89C6           MOV ESI,EAX
00404279  |. 89D7           MOV EDI,EDX
0040427B  |. 8B4F FC        MOV ECX,DWORD PTR DS:[EDI-4]
0040427E  |. 57             PUSH EDI
0040427F  |. 8B56 FC        MOV EDX,DWORD PTR DS:[ESI-4]
00404282  |. 4A             DEC EDX
00404283  |. 78 1B          JS SHORT CACHEMAN.004042A0 
00404285  |. 8A06           MOV AL,BYTE PTR DS:[ESI]
00404287  |. 46             INC ESI
00404288  |. 29D1           SUB ECX,EDX
0040428A  |. 7E 14          JLE SHORT CACHEMAN.004042A0
0040428C  |> F2:AE          /REPNE SCAS BYTE PTR ES:[EDI]   //用下划线字符依次与ID码字符比较。
0040428E  |. 75 10          |JNZ SHORT CACHEMAN.004042A0
00404290  |. 89CB           |MOV EBX,ECX
00404292  |. 56             |PUSH ESI
00404293  |. 57             |PUSH EDI
00404294  |. 89D1           |MOV ECX,EDX
00404296  |. F3:A6          |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00404298  |. 5F             |POP EDI
00404299  |. 5E             |POP ESI
0040429A  |. 74 0C          |JE SHORT CACHEMAN.004042A8    //如果存在下划线则OK。
0040429C  |. 89D9           |MOV ECX,EBX
0040429E  |.^EB EC          \JMP SHORT CACHEMAN.0040428C
004042A0  |> 5A             POP EDX
004042A1  |. 31C0           XOR EAX,EAX
004042A3  |. EB 08          JMP SHORT CACHEMAN.004042AD
004042A5  |> 31C0           XOR EAX,EAX
004042A7  |. C3             RETN
004042A8  |> 5A             POP EDX
004042A9  |. 89F8           MOV EAX,EDI
004042AB  |. 29D0           SUB EAX,EDX                    //下划线字符地址与首字符地址相减得子串长度。即

包含下划线字符在内字符数。返回到004AE7F2地址处与4比较,所以这里一定让第四位是下划线。否则返回值不匹配。
004042AD  |> 5F             POP EDI
004042AE  |. 5E             POP ESI
004042AF  |. 5B             POP EBX
004042B0  \> C3             RETN
======================================================================
下面分析004AE819  CALL CACHEMAN.00408C8C 。这个函数处理前3位ID码。(***)
00408C8C  /$ 53             PUSH EBX
00408C8D  |. 51             PUSH ECX
00408C8E  |. 8BDA           MOV EBX,EDX                   //EDX=0,并给EBX赋值。
00408C90  |. 8BD4           MOV EDX,ESP        
00408C92  |. E8 2D9FFFFF    CALL CACHEMAN.00402BC4        //我们跟入这个函数看看。(****)
00408C97  |. 833C24 00      CMP DWORD PTR SS:[ESP],0      //这里[ESP]内返回0。
00408C9B  |. 74 02          JE SHORT CACHEMAN.00408C9F    //这里则跳。
00408C9D  |. 8BC3           MOV EAX,EBX     //否则下面EBX把EAX覆盖为0。
00408C9F  |> 5A             POP EDX
00408CA0  |. 5B             POP EBX
00408CA1  \. C3             RETN
======================================================================
下面是00408C92 CALL CACHEMAN.00402BC4 代码分析:(****)
00402BC4  /$ 53             PUSH EBX
00402BC5  |. 56             PUSH ESI
00402BC6  |. 57             PUSH EDI
00402BC7  |. 89C6           MOV ESI,EAX
00402BC9  |. 50             PUSH EAX
00402BCA  |. 85C0           TEST EAX,EAX
00402BCC  |. 74 73          JE SHORT CACHEMAN.00402C41
00402BCE  |. 31C0           XOR EAX,EAX
00402BD0  |. 31DB           XOR EBX,EBX
00402BD2  |. BF CCCCCC0C    MOV EDI,0CCCCCCC
00402BD7  |> 8A1E           /MOV BL,BYTE PTR DS:[ESI]    //先判断注册码是否为空格。
00402BD9  |. 46             |INC ESI
00402BDA  |. 80FB 20        |CMP BL,20
00402BDD  |.^74 F8          \JE SHORT CACHEMAN.00402BD7 
00402BDF  |. B5 00          MOV CH,0
00402BE1  |. 80FB 2D        CMP BL,2D                   //判断是否为减号。
00402BE4  |. 74 69          JE SHORT CACHEMAN.00402C4F
00402BE6  |. 80FB 2B        CMP BL,2B                   //判断是否为加号。
00402BE9  |. 74 66          JE SHORT CACHEMAN.00402C51
00402BEB  |. 80FB 24        CMP BL,24                   //判断是否为$号。   
00402BEE  |. 74 66          JE SHORT CACHEMAN.00402C56
00402BF0  |. 80FB 78        CMP BL,78                   //判断是否为x。
00402BF3  |. 74 61          JE SHORT CACHEMAN.00402C56
00402BF5  |. 80FB 58        CMP BL,58                   //判断是否为X。
00402BF8  |. 74 5C          JE SHORT CACHEMAN.00402C56
00402BFA  |. 80FB 30        CMP BL,30                   //判断是否为0。
00402BFD  |. 75 13          JNZ SHORT CACHEMAN.00402C12 //不为0则跳到下面处理。
*略去几行*
00402C12  |> 84DB           TEST BL,BL
00402C14  |. 74 34          JE SHORT CACHEMAN.00402C4A
00402C16  |> 80EB 30        /SUB BL,30                  //减去30h。
00402C19  |. 80FB 09        |CMP BL,9                   //与9比较。
00402C1C  |. 77 2C          |JA SHORT CACHEMAN.00402C4A //大于9则跳走。
00402C1E  |. 39F8           |CMP EAX,EDI
00402C20  |. 77 28          |JA SHORT CACHEMAN.00402C4A
00402C22  |. 8D0480         |LEA EAX,DWORD PTR DS:[EAX+EAX*4]  //EAX=5*EAX。
00402C25  |. 01C0           |ADD EAX,EAX                //EAX=2*EAX。
00402C27  |. 01D8           |ADD EAX,EBX                //把EBX累加到EAX。EBX内为转换为16进制的数。
00402C29  |. 8A1E           |MOV BL,BYTE PTR DS:[ESI]   //取下一个数。
00402C2B  |. 46             |INC ESI
00402C2C  |. 84DB           |TEST BL,BL
00402C2E  |.^75 E6          \JNZ SHORT CACHEMAN.00402C16  //不等于0继续循环。
00402C30  |> FECD           DEC CH
00402C32  |. 74 10          JE SHORT CACHEMAN.00402C44    //不跳。
00402C34  |. 85C0           TEST EAX,EAX
00402C36  |. 7C 12          JL SHORT CACHEMAN.00402C4A    //不跳。
00402C38  |> 59             POP ECX
00402C39  |. 31F6           XOR ESI,ESI
00402C3B  |> 8932           MOV DWORD PTR DS:[EDX],ESI    //ESI=0,把[EDX]单元清0。EDX=ESP(看408C90处即

明白)。
00402C3D  |. 5F             POP EDI
00402C3E  |. 5E             POP ESI
00402C3F  |. 5B             POP EBX
00402C40  |. C3             RETN      
======================================================================
后记:
这个小软件的注册码算法比较简单,最后一位数的ASSIC码经过乘以6后与14H异或,所得的16进制数与前3位数字的16进制相

比较,如果相等则OK。注册码算法只与前3位与最后一位有关,与其他位无关。所以比较简单。下面给出一个注册机。

#include "stdlib.h"
#include "time.h"
main()
{
int a;
char b[9]={0};
int s,i;
randomize();   //随机数种子。
a=random(10); //取到随机数
s=6*(a+0x30);  //变成ASSIC码。
s=s^0x14;       //异或运算。

for(i=0;i<7;i++)
b[i]=random(10)+0x30;  //填充中间7位。
b[7]=a+0x30;      //加上最后一位。
printf("the key is \n");
printf("%d_%s",s,b);
}


感谢您的阅读与大力支持!!

qduwg@163.com
qduwg

2006年1月30 日晚结稿

  • 标 题: 答复
  • 作 者:qduwg
  • 时 间:2006-02-05 19:38

To: Saver 

感谢 Saver 的大力的及时的关注和支持!希望共同提高!


To:慈云山

你是俺的大力赞助商啊!看到你的支持俺真高兴!祝你春节快乐,共同进步!

TO:starwar 

你这一拜,可实不敢当,我也给你拜个年可以啦。我可是道道地地的社会主义初级阶段,还没有发展到高手地步呢。感谢您的支持!感谢您的关注!

TO:心蓝 

我能够出这么多,是因为我还比较能够找时间坐下来静心搞这个。在国内就没有那么多精力,每个人都很忙,很浮躁。怎么搞技术啊?在这里什么都没有就是有点时间。在国内什么都有,就是没有时间。真是矛盾。

TO:qq2003

感谢支持啦。春节快乐!

TO: yujinjianx  

谢谢您的参与与阅读,给我无穷力量继续努力!

to: kimmygzh,感谢您的支持!我一点不可畏:)