题目:图像转换工具“魔法转换2.0”注册码分析
功能:功能强大的图像转换工具(吹牛?)。包括图像浏览、批量转换、图像增强及作品预览四大部分。图像增强包括调整图像大小、调整层次、旋转、镜象,还有锐化、模糊、马塞克、浮雕、底片、旋涡、喷雾等效果。你可以将这些效果自定义成方案,然后再进行批量转换。而且它还支持拖入文件到批量转换列表。同时它还能方便的将图像生成.EXE可执行文件。 
工具:softice,PEID,Casper

引子:今天又实验了一下这个图片批量转换工具,实在不敢恭维,里面没有帮助,我转换图片不成功,只是对其注册码机制感兴趣,所以才有了这篇破文。拿PEID检查一下,还是用ASPack 2.000 -> Alexey Solodovnikov加壳的。用CASPER可以脱壳,方便抓取代码写破文。启动程序,打开“帮助”菜单,点击“注册”,弹出注册窗口,输入姓名wanggang,注册码654321。调出Softice,下断点bpx hmemcpy,F5退出,然后点击“确定”,被拦截。按7次F12即可来到主程序空间内:

00561263  |> 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
00561266  |. 8B83 E8020000  MOV EAX,DWORD PTR DS:[EBX+2E8]
0056126C  |. E8 FB78EDFF    CALL MAGCT1.00438B6C
00561271  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]      //注册码地址送EAX。          
00561274  |. 50             PUSH EAX                                
00561275  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
00561278  |. 8B83 E4020000  MOV EAX,DWORD PTR DS:[EBX+2E4]
0056127E  |. E8 E978EDFF    CALL MAGCT1.00438B6C
00561283  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00561286  |. 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
00561289  |. E8 4E4CFFFF    CALL MAGCT1.00555EDC             //此函数产生注册码。分析在后面。 (1)
0056128E  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]            
00561291  |. 58             POP EAX                                 
00561292  |. E8 052FEAFF    CALL MAGCT1.0040419C             //这个函数比较真假码。分析在后面。(2)
00561297  |. 0F85 CE000000  JNZ MAGCT1.0056136B              //如果注册码正确,则这里就不跳。
0056129D  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
005612A0  |. E8 EF48FFFF    CALL MAGCT1.00555B94
005612A5  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
005612A8  |. BA D8135600    MOV EDX,MAGCT1.005613D8                 ;  ASCII "\win.ini"
005612AD  |. E8 E22DEAFF    CALL MAGCT1.00404094             //把注册码和用户名写入win.ini内。            
005612B2  |. 8B4D EC        MOV ECX,DWORD PTR SS:[EBP-14]
005612B5  |. B2 01          MOV DL,1
005612B7  |. A1 9C344700    MOV EAX,DWORD PTR DS:[47349C]
005612BC  |. E8 2B23F1FF    CALL MAGCT1.004735EC
005612C1  |. A3 E4675700    MOV DWORD PTR DS:[5767E4],EAX            
005612C6  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
005612C9  |. 8B83 E4020000  MOV EAX,DWORD PTR DS:[EBX+2E4]
005612CF  |. E8 9878EDFF    CALL MAGCT1.00438B6C
005612D4  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
005612D7  |. 50             PUSH EAX                                 
005612D8  |. B9 EC135600    MOV ECX,MAGCT1.005613EC                  ;  ASCII "name"
005612DD  |. BA FC135600    MOV EDX,MAGCT1.005613FC                  ;  ASCII "magct"
005612E2  |. A1 E4675700    MOV EAX,DWORD PTR DS:[5767E4]
005612E7  |. 8B30           MOV ESI,DWORD PTR DS:[EAX]
005612E9  |. FF56 04        CALL DWORD PTR DS:[ESI+4]
005612EC  |. 8D55 E4        LEA EDX,DWORD PTR SS:[EBP-1C]
005612EF  |. 8B83 E8020000  MOV EAX,DWORD PTR DS:[EBX+2E8]
005612F5  |. E8 7278EDFF    CALL MAGCT1.00438B6C
005612FA  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
005612FD  |. 50             PUSH EAX                               
005612FE  |. B9 0C145600    MOV ECX,MAGCT1.0056140C                  ;  ASCII "code"
00561303  |. BA FC135600    MOV EDX,MAGCT1.005613FC                  ;  ASCII "magct"
00561308  |. A1 E4675700    MOV EAX,DWORD PTR DS:[5767E4]
0056130D  |. 8B30           MOV ESI,DWORD PTR DS:[EAX]
0056130F  |. FF56 04        CALL DWORD PTR DS:[ESI+4]
00561312  |. A1 E4675700    MOV EAX,DWORD PTR DS:[5767E4]
00561317  |. E8 781DEAFF    CALL MAGCT1.00403094
0056131C  |. BA 1C145600    MOV EDX,MAGCT1.0056141C
00561321  |. 8B83 F4020000  MOV EAX,DWORD PTR DS:[EBX+2F4]
00561327  |. E8 7078EDFF    CALL MAGCT1.00438B9C
0056132C  |. 33D2           XOR EDX,EDX
0056132E  |. 8B83 F0020000  MOV EAX,DWORD PTR DS:[EBX+2F0]
00561334  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]
00561336  |. FF51 5C        CALL DWORD PTR DS:[ECX+5C]
00561339  |. 6A 40          PUSH 40
0056133B  |. 68 24145600    PUSH MAGCT1.00561424
00561340  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]
00561343  |. 8B83 E4020000  MOV EAX,DWORD PTR DS:[EBX+2E4]
00561349  |. E8 1E78EDFF    CALL MAGCT1.00438B6C
0056134E  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
00561351  |. BA 38145600    MOV EDX,MAGCT1.00561438
00561356  |. E8 392DEAFF    CALL MAGCT1.00404094
0056135B  |. 8B45 E0        MOV EAX,DWORD PTR SS:[EBP-20]
0056135E  |. E8 ED2EEAFF    CALL MAGCT1.00404250
00561363  |. 50             PUSH EAX                                 ; |Text = "U嬱兡餝3缐E鸶V"
00561364  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
00561366  |. E8 F567EAFF    CALL <JMP.&user32.MessageBoxA>           ; \MessageBox     //显示注册成功。
=====================================================================================================
下面分析(1)处的函数:
00555EDC  /$ 55             PUSH EBP
00555EDD  |. 8BEC           MOV EBP,ESP
00555EDF  |. 83C4 F4        ADD ESP,-0C
00555EE2  |. 53             PUSH EBX
00555EE3  |. 56             PUSH ESI
00555EE4  |. 57             PUSH EDI
00555EE5  |. 33C9           XOR ECX,ECX
00555EE7  |. 894D F4        MOV DWORD PTR SS:[EBP-C],ECX
00555EEA  |. 8BFA           MOV EDI,EDX
00555EEC  |. 8BF0           MOV ESI,EAX
00555EEE  |. 33C0           XOR EAX,EAX
00555EF0  |. 55             PUSH EBP
00555EF1  |. 68 A95F5500    PUSH MAGCT1.00555FA9
00555EF6  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00555EF9  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00555EFC  |. 85F6           TEST ESI,ESI
00555EFE  |. 0F84 8F000000  JE MAGCT1.00555F93
00555F04  |. 8BC6           MOV EAX,ESI
00555F06  |. E8 81E1EAFF    CALL MAGCT1.0040408C              //取用户名长度。
00555F0B  |. 85C0           TEST EAX,EAX
00555F0D  |. 7E 4D          JLE SHORT MAGCT1.00555F5C         //用户名长度为0则错。
00555F0F  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX      //用户名长度送[EBP-8],作为循环次数。 
00555F12  |. BB 01000000    MOV EBX,1                         //EBX初始化为1。
00555F17  |> 33C0           /XOR EAX,EAX
00555F19  |. 8A441E FF      |MOV AL,BYTE PTR DS:[ESI+EBX-1]   //用户名字符依次送AL。
00555F1D  |. 99             |CDQ                              //扩展到EDX。
00555F1E  |. F7FB           |IDIV EBX                         //除以EBX。EBX分别取1到用户名长度。
00555F20  |. 8945 FC        |MOV DWORD PTR SS:[EBP-4],EAX     //EAX为商,保存到[EBP-4]
00555F23  |. 8BC6           |MOV EAX,ESI
00555F25  |. E8 62E1EAFF    |CALL MAGCT1.0040408C             //取用户名长度。
00555F2A  |. 50             |PUSH EAX                         //长度压栈。
00555F2B  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]     //把商送EAX。
00555F2E  |. 5A             |POP EDX                          //长度出栈,送EDX。
00555F2F  |. 8BCA           |MOV ECX,EDX                      //EDX送ECX。
00555F31  |. 99             |CDQ
00555F32  |. F7F9           |IDIV ECX                         //EAX再次除以长度。
00555F34  |. 33D2           |XOR EDX,EDX
00555F36  |. 8A541E FF      |MOV DL,BYTE PTR DS:[ESI+EBX-1]   //用户名字符取到DL。
00555F3A  |. 83C2 03        |ADD EDX,3                        //字符加3。
00555F3D  |. F7EA           |IMUL EDX                         //EAX乘以EDX。
00555F3F  |. 8D4D F4        |LEA ECX,DWORD PTR SS:[EBP-C]     
00555F42  |. BA 03000000    |MOV EDX,3
00555F47  |. E8 BC34EBFF    |CALL MAGCT1.00409408             //此函数把得到的3字节数字变换为对应的3个ASSIC码。(3)
00555F4C  |. 8B55 F4        |MOV EDX,DWORD PTR SS:[EBP-C]     //新串地址送EDX。
00555F4F  |. 8BC7           |MOV EAX,EDI
00555F51  |. E8 3EE1EAFF    |CALL MAGCT1.00404094             //把每次得到的3位字符串接起来。
00555F56  |. 43             |INC EBX
00555F57  |. FF4D F8        |DEC DWORD PTR SS:[EBP-8]         //计数器减1。
00555F5A  |.^75 BB          \JNZ SHORT MAGCT1.00555F17        //未完则继续循环。
00555F5C  |> 8B07           MOV EAX,DWORD PTR DS:[EDI]
00555F5E  |. E8 29E1EAFF    CALL MAGCT1.0040408C              //取新串长度。
00555F63  |. 83F8 08        CMP EAX,8                     
00555F66  |. 7D 10          JGE SHORT MAGCT1.00555F78         //大于8则OK。
00555F68  |. 8B0F           MOV ECX,DWORD PTR DS:[EDI]
00555F6A  |. 8BC7           MOV EAX,EDI
00555F6C  |. BA C05F5500    MOV EDX,MAGCT1.00555FC0
00555F71  |. E8 62E1EAFF    CALL MAGCT1.004040D8
00555F76  |. EB 1B          JMP SHORT MAGCT1.00555F93
00555F78  |> 8B07           MOV EAX,DWORD PTR DS:[EDI]        //新串地址送EAX。
00555F7A  |. E8 0DE1EAFF    CALL MAGCT1.0040408C              //取串长。
00555F7F  |. 83F8 0C        CMP EAX,0C                        //与C比较。
00555F82  |. 7E 0F          JLE SHORT MAGCT1.00555F93         //小于等于C则跳。
00555F84  |. 57             PUSH EDI
00555F85  |. 8B07           MOV EAX,DWORD PTR DS:[EDI]
00555F87  |. B9 0C000000    MOV ECX,0C
00555F8C  |. 33D2           XOR EDX,EDX
00555F8E  |. E8 01E3EAFF    CALL MAGCT1.00404294              //此函数取产生的新串的前12位做为注册码。
00555F93  |> 33C0           XOR EAX,EAX
00555F95  |. 5A             POP EDX
00555F96  |. 59             POP ECX
00555F97  |. 59             POP ECX
00555F98  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
00555F9B  |. 68 B05F5500    PUSH MAGCT1.00555FB0
00555FA0  |> 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
00555FA3  |. E8 54DEEAFF    CALL MAGCT1.00403DFC
00555FA8  \. C3             RETN
=====================================================================================================
下面分析(2)处函数:
0040419C  /$ 53             PUSH EBX
0040419D  |. 56             PUSH ESI
0040419E  |. 57             PUSH EDI
0040419F  |. 89C6           MOV ESI,EAX
004041A1  |. 89D7           MOV EDI,EDX
004041A3  |. 39D0           CMP EAX,EDX
004041A5  |. 0F84 8F000000  JE MAGCT1.0040423A
004041AB  |. 85F6           TEST ESI,ESI
004041AD  |. 74 68          JE SHORT MAGCT1.00404217
004041AF  |. 85FF           TEST EDI,EDI
004041B1  |. 74 6B          JE SHORT MAGCT1.0040421E
004041B3  |. 8B46 FC        MOV EAX,DWORD PTR DS:[ESI-4]      //假码长度送EAX。
004041B6  |. 8B57 FC        MOV EDX,DWORD PTR DS:[EDI-4]      //真码长度送EDX。
004041B9  |. 29D0           SUB EAX,EDX
004041BB  |. 77 02          JA SHORT MAGCT1.004041BF          //假码比真码长则OVER。
004041BD  |. 01C2           ADD EDX,EAX
004041BF  |> 52             PUSH EDX
004041C0  |. C1EA 02        SHR EDX,2
004041C3  |. 74 26          JE SHORT MAGCT1.004041EB
004041C5  |> 8B0E           /MOV ECX,DWORD PTR DS:[ESI]       //假码送ECX。
004041C7  |. 8B1F           |MOV EBX,DWORD PTR DS:[EDI]       //真码送EBX。
004041C9  |. 39D9           |CMP ECX,EBX                      //比较。
004041CB  |. 75 58          |JNZ SHORT MAGCT1.00404225        //不等则OVER。
004041CD  |. 4A             |DEC EDX
004041CE  |. 74 15          |JE SHORT MAGCT1.004041E5         //比较结束则跳。
004041D0  |. 8B4E 04        |MOV ECX,DWORD PTR DS:[ESI+4]     
004041D3  |. 8B5F 04        |MOV EBX,DWORD PTR DS:[EDI+4]
004041D6  |. 39D9           |CMP ECX,EBX
004041D8  |. 75 4B          |JNZ SHORT MAGCT1.00404225
004041DA  |. 83C6 08        |ADD ESI,8
004041DD  |. 83C7 08        |ADD EDI,8
004041E0  |. 4A             |DEC EDX
004041E1  |.^75 E2          \JNZ SHORT MAGCT1.004041C5        //未完则继续循环。
004041E3  |. EB 06          JMP SHORT MAGCT1.004041EB
004041E5  |> 83C6 04        ADD ESI,4
004041E8  |. 83C7 04        ADD EDI,4
004041EB  |> 5A             POP EDX
004041EC  |. 83E2 03        AND EDX,3
*省去多行*
00404225  |> 5A             POP EDX
00404226  |. 38D9           CMP CL,BL
00404228  |. 75 10          JNZ SHORT MAGCT1.0040423A
0040422A  |. 38FD           CMP CH,BH
0040422C  |. 75 0C          JNZ SHORT MAGCT1.0040423A
0040422E  |. C1E9 10        SHR ECX,10
00404231  |. C1EB 10        SHR EBX,10
00404234  |. 38D9           CMP CL,BL
00404236  |. 75 02          JNZ SHORT MAGCT1.0040423A
00404238  |. 38FD           CMP CH,BH
0040423A  |> 5F             POP EDI
0040423B  |. 5E             POP ESI
0040423C  |. 5B             POP EBX
0040423D  \. C3             RETN
=====================================================================================================
下面分析(3)处函数:
00409408  /$ 83C4 F0        ADD ESP,-10
0040940B  |. 6A 01          PUSH 1
0040940D  |. 895424 04      MOV DWORD PTR SS:[ESP+4],EDX
00409411  |. C64424 08 00   MOV BYTE PTR SS:[ESP+8],0
00409416  |. 894424 0C      MOV DWORD PTR SS:[ESP+C],EAX
0040941A  |. C64424 10 00   MOV BYTE PTR SS:[ESP+10],0
0040941F  |. 8D4424 04      LEA EAX,DWORD PTR SS:[ESP+4]
00409423  |. BA 3C944000    MOV EDX,MAGCT1.0040943C
00409428  |. 91             XCHG EAX,ECX
00409429  |. E8 7A0E0000    CALL MAGCT1.0040A2A8              //跟入这个函数,代码在后面:      (4)
0040942E  |. 83C4 10        ADD ESP,10
00409431  \. C3             RETN
*****
函数(4)代码如下:
0040A2A8  /$ 55             PUSH EBP
0040A2A9  |. 8BEC           MOV EBP,ESP
0040A2AB  |. 81C4 04F0FFFF  ADD ESP,-0FFC
*省略多行*
0040A2F7  |. 8D85 F6EFFFFF  LEA EAX,DWORD PTR SS:[EBP-100A]
0040A2FD  |. E8 32FBFFFF    CALL MAGCT1.00409E34              //这个函数分解得到16进制数为字符。 (5)
0040A302  |. EB 0C          JMP SHORT MAGCT1.0040A310
0040A304  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040A307  |. E8 809DFFFF    CALL MAGCT1.0040408C
0040A30C  |. 8BD8           MOV EBX,EAX
0040A30E  |. 8BC3           MOV EAX,EBX
0040A310  |> 8BD3           MOV EDX,EBX
0040A312  |. 4A             DEC EDX
0040A313  |. 3BC2           CMP EAX,EDX
0040A315  |. 7C 43          JL SHORT MAGCT1.0040A35A         //此处跳走。
*省去多行*
0040A35A  |> 8D95 F6EFFFFF  LEA EDX,DWORD PTR SS:[EBP-100A]  //分解出的3位字符的地址送EDX。
0040A360  |. 8BCE           MOV ECX,ESI
0040A362  |. 91             XCHG EAX,ECX
0040A363  |. E8 7C9BFFFF    CALL MAGCT1.00403EE4             //复制得到3位字符到另外地址。
0040A368  |> 5E             POP ESI
0040A369  |. 5B             POP EBX
0040A36A  |. 8BE5           MOV ESP,EBP
0040A36C  |. 5D             POP EBP
0040A36D  \. C2 0400        RETN 4
函数(5)的代码如下:
*省去多行*
00409E84   > 8845 EB        MOV BYTE PTR SS:[EBP-15],AL
00409E87   . 80F8 2D        CMP AL,2D
00409E8A   . 75 05          JNZ SHORT MAGCT1.00409E91
00409E8C   . 39CE           CMP ESI,ECX
00409E8E   .^74 DA          JE SHORT MAGCT1.00409E6A
00409E90   . AC             LODS BYTE PTR DS:[ESI]
00409E91   > E8 80000000    CALL MAGCT1.00409F16                    
00409E96   . 80F8 3A        CMP AL,3A
00409E99   . 75 0A          JNZ SHORT MAGCT1.00409EA5
00409E9B   . 895D F8        MOV DWORD PTR SS:[EBP-8],EBX
00409E9E   . 39CE           CMP ESI,ECX
00409EA0   .^74 C8          JE SHORT MAGCT1.00409E6A
00409EA2   . AC             LODS BYTE PTR DS:[ESI]
00409EA3   .^EB DF          JMP SHORT MAGCT1.00409E84
00409EA5   > 895D E4        MOV DWORD PTR SS:[EBP-1C],EBX
00409EA8   . BB FFFFFFFF    MOV EBX,-1
00409EAD   . 80F8 2E        CMP AL,2E
00409EB0   . 75 0A          JNZ SHORT MAGCT1.00409EBC
00409EB2   . 39CE           CMP ESI,ECX
00409EB4   .^74 B4          JE SHORT MAGCT1.00409E6A
00409EB6   . AC             LODS BYTE PTR DS:[ESI]
00409EB7   . E8 5A000000    CALL MAGCT1.00409F16
00409EBC   > 895D E0        MOV DWORD PTR SS:[EBP-20],EBX
00409EBF   . 8975 DC        MOV DWORD PTR SS:[EBP-24],ESI
00409EC2   . 51             PUSH ECX
00409EC3   . 52             PUSH EDX
00409EC4   . E8 96000000    CALL MAGCT1.00409F5F              //在这个函数内进行变换。         (6)
00409EC9   . 5A             POP EDX
00409ECA   . 8B5D E4        MOV EBX,DWORD PTR SS:[EBP-1C]
00409ECD   . 29CB           SUB EBX,ECX
00409ECF   . 73 02          JNB SHORT MAGCT1.00409ED3
*省略多行*
00409EFB   > F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]   //把分解的字符复制到另外地址。
00409EFD   . 837D F4 00     CMP DWORD PTR SS:[EBP-C],0
00409F01   . 74 0A          JE SHORT MAGCT1.00409F0D
00409F03   . 52             PUSH EDX
00409F04   . 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
00409F07   . E8 1CFFFFFF    CALL MAGCT1.00409E28
00409F0C   . 5A             POP EDX
00409F0D   > 59             POP ECX
00409F0E   . 8B75 DC        MOV ESI,DWORD PTR SS:[EBP-24]
00409F11   .^E9 42FFFFFF    JMP MAGCT1.00409E58
函数(6)的代码如下:

00409F5F  /$ 24 DF          AND AL,0DF
00409F61  |. 88C1           MOV CL,AL
00409F63  |. B8 01000000    MOV EAX,1
00409F68  |. 8B5D F8        MOV EBX,DWORD PTR SS:[EBP-8]
00409F6B  |. 3B5D 08        CMP EBX,DWORD PTR SS:[EBP+8]
00409F6E  |. 77 5C          JA SHORT MAGCT1.00409FCC
00409F70  |. FF45 F8        INC DWORD PTR SS:[EBP-8]
00409F73  |. 8B75 0C        MOV ESI,DWORD PTR SS:[EBP+C]
00409F76  |. 8D34DE         LEA ESI,DWORD PTR DS:[ESI+EBX*8]
00409F79  |. 8B06           MOV EAX,DWORD PTR DS:[ESI]         //取分解之前的数到EAX。
00409F7B  |. 0FB65E 04      MOVZX EBX,BYTE PTR DS:[ESI+4]
00409F7F  |. FF249D 869F400>JMP DWORD PTR DS:[EBX*4+409F86]    
*省去多行*
0040A0AE  |> 31D2           /XOR EDX,EDX
0040A0B0  |. F7F1           |DIV ECX                          //EAX除以ECX,ECX内为10h。          
0040A0B2  |. 80C2 30        |ADD DL,30                        //余数加30h。
0040A0B5  |. 80FA 3A        |CMP DL,3A                        //与3A比较。
0040A0B8  |. 72 03          |JB SHORT MAGCT1.0040A0BD         //如果小于则为数字。
0040A0BA  |. 80C2 07        |ADD DL,7                         //否则加7,变为大写字符。
0040A0BD  |> 4E             |DEC ESI
0040A0BE  |. 8816           |MOV BYTE PTR DS:[ESI],DL
0040A0C0  |. 09C0           |OR EAX,EAX
0040A0C2  |.^75 EA          \JNZ SHORT MAGCT1.0040A0AE        //未完继续。
0040A0C4  |. 8D4D 9F        LEA ECX,DWORD PTR SS:[EBP-61]
0040A0C7  |. 29F1           SUB ECX,ESI
0040A0C9  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
0040A0CC  |. 83FA 10        CMP EDX,10
0040A0CF  |. 76 01          JBE SHORT MAGCT1.0040A0D2
0040A0D1  |. C3             RETN
================================================================================
后记:
跟踪这个软件倒是没有费多大劲,写这篇破文也就用了1个小时。注册机制比较简单,就是根据用户名前4位计算得到12位注册码。下面附上一个比较简单的注册机,TC写的,非常糟糕,希望不要见笑!
#include "string.h"
main()
{
char name[20],s[3];
int i,j,yushu,temp;
int eax,ebx,ecx,edx;
printf("input your name\n");
scanf("%s",name);
ebx=1;
ecx=strlen(name);
for(i=0;i<4;i++)
{eax=name[i];
 edx=eax;
 eax=eax/ebx;
 ebx++;
 eax=eax/ecx;
 eax=eax*(edx+3);            //计算姓名前4位。
 temp=eax;
  {for(j=0;j<3;j++)          //此循环把每个字符变ASSIC码。
     {
      yushu=temp%0x10;
      yushu=(0xf&yushu)+0x30;
      temp=temp/0x10;
      if(yushu<0x3a)
      s[2-j]=yushu;
      else
      {yushu=yushu+7;
       s[2-j]=yushu;}
     }
  printf("%s",s);}

 }
}
结论:
随便写出几个注册码:

 用户名        注册码
cracker   5943A8190132
wanggang  6AC2581C413E
注册成功后,在win.ini文件内写入注册码和用户名,明码形式。如果修改里面的注册码就可以重新注册了。

最后感谢您的支持和关注!!


qduwg

qduwg@163.com

2006年2月5日完稿