题目:注册“护花使者V2.0” FOR 菜鸟
软件简介:功能想必大家都知道了!为了孩子创造一个良好的上网环境,软件设置对各种垃圾的屏蔽,并记录最近浏览的内容供家长查阅。试用了一下还觉得不错。保护祖国的花朵,使孩子远离网上的各种垃圾信息,是每个人的责任!
破解目的:分析注册码算法
工具:Softice,OD,Casper,PEID
声明:由于本人目前没有条件获得比较新的软件来练手,所以,净搞了些以前的老软件来练手,希望大家谅解。不要取笑于俺!我也没有办法!:)
引子:今天抽空又安装实验了这个“护花使者”软件,这个软件短小精悍,脱壳后才800KB。PEID查看一下,这个软件用Aspack1.07b加壳,用Casper脱壳成功。下面的代码是用OD打开后拷贝下来的。运行这个软件,该软件帮助说没有注册的话监护人无法设置密码,岂不是开玩笑?我们现在就注册了它。启动程序,弹出注册界面,输入用户名wanggang,输入注册码654321。调出SOFTICE(怎么又是SOFTICE??我现在只对这个比较上手点。)设置断点bpx hmemcpy ,F5退出,然后点击“确定”按钮,被拦截。然后按7次F12来到主程序空间。然后按F10跟踪到如下代码处:
00492F2A  |. E8 B5BEF9FF    CALL IFLOWER1.0042EDE4
00492F2F  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]   //我们返回到这里。EAX保存假码的地址。
00492F32  |. 50             PUSH EAX                                 ;  IFLOWER1.<ModuleEntryPoint>
00492F33  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
00492F36  |. E8 8523FCFF    CALL IFLOWER1.004552C0         //这个函数是关键目标。--------(*)
00492F3B  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]             ;  KERNEL32.BFF79138
00492F3E  |. 58             POP EAX                                  ;  KERNEL32.BFF8B86C
00492F3F  |. E8 1810F7FF    CALL IFLOWER1.00403F5C         //比较真假码的函数。
00492F44  |. 75 05          JNZ SHORT IFLOWER1.00492F4B    //如果不相等则OVER。
==================================================================
下面我们跟入(*)处的函数看看到底有什么好玩的地方。
004552C0  /$ 55             PUSH EBP
004552C1  |. 8BEC           MOV EBP,ESP
004552C3  |. 81C4 F4FDFFFF  ADD ESP,-20C
004552C9  |. 53             PUSH EBX
004552CA  |. 56             PUSH ESI
004552CB  |. 57             PUSH EDI
004552CC  |. 8BF8           MOV EDI,EAX
004552CE  |. C745 FC D20400>MOV DWORD PTR SS:[EBP-4],4D2
004552D5  |. 68 FF000000    PUSH 0FF
004552DA  |. 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
004552E0  |. 50             PUSH EAX
004552E1  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004552E4  |. 50             PUSH EAX
004552E5  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
004552E8  |. 50             PUSH EAX
004552E9  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004552EC  |. 50             PUSH EAX
004552ED  |. 68 FF000000    PUSH 0FF
004552F2  |. 8D85 F4FEFFFF  LEA EAX,DWORD PTR SS:[EBP-10C]
004552F8  |. 50             PUSH EAX
004552F9  |. 68 4C534500    PUSH IFLOWER1.0045534C
004552FE  |. E8 F917FBFF    CALL <JMP.&kernel32.GetVolumeInformation>    //这个函数取硬盘系列号。
00455303  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]     //系列号保存到EAX内。我的硬盘号为844DBF96.
00455306  |. 05 E1100000    ADD EAX,10E1          //硬盘号加10E1h。
0045530B  |. 6BC0 0D        IMUL EAX,EAX,0D       //EAX乘以0Dh。
0045530E  |. B9 07000000    MOV ECX,7   
00455313  |. 33D2           XOR EDX,EDX
00455315  |. F7F1           DIV ECX               //EAX除以ECX内的7。
00455317  |. 8BD8           MOV EBX,EAX           //商送EBX保存。
00455319  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] //硬盘号送EAX。
0045531C  |. 2D D2040000    SUB EAX,4D2           //硬盘号减去4D2h。即10进制的1234。
00455321  |. 8BD0           MOV EDX,EAX           //结果送EDX保存。
00455323  |. C1E0 03        SHL EAX,3             //EAX值左移3次,相当于乘以8。
00455326  |. 2BC2           SUB EAX,EDX           //移位后的EAX减去EDX。
00455328  |. B9 0D000000    MOV ECX,0D            //ECX=Dh。
0045532D  |. 33D2           XOR EDX,EDX
0045532F  |. F7F1           DIV ECX               //EAX除以ECX。
00455331  |. 8BF0           MOV ESI,EAX           //EAX送ESI保存。
00455333  |. 8BCF           MOV ECX,EDI  
00455335  |. 8D141E         LEA EDX,DWORD PTR DS:[ESI+EBX]//EDX=ESI+EBX。ESI为前面除以D的商,EBX为前面除以7 的商。
00455338  |. B8 58534500    MOV EAX,IFLOWER1.00455358   
0045533D  |. E8 9E060000    CALL IFLOWER1.004559E0  //这个函数里面精彩太多。(**)
00455342  |. 5F             POP EDI
00455343  |. 5E             POP ESI
00455344  |. 5B             POP EBX
00455345  |. 8BE5           MOV ESP,EBP
00455347  |. 5D             POP EBP
00455348  \. C3             RETN
=================================================================
下面分析(**)函数,代码如下:
004559E0  /$ 55             PUSH EBP
004559E1  |. 8BEC           MOV EBP,ESP
004559E3  |. 83C4 C8        ADD ESP,-38
004559E6  |. 53             PUSH EBX
004559E7  |. 33DB           XOR EBX,EBX
004559E9  |. 895D C8        MOV DWORD PTR SS:[EBP-38],EBX
004559EC  |. 895D EC        MOV DWORD PTR SS:[EBP-14],EBX
004559EF  |. 894D F4        MOV DWORD PTR SS:[EBP-C],ECX
004559F2  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
004559F5  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
004559F8  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004559FB  |. E8 00E6FAFF    CALL IFLOWER1.00404000             //EDX清零。
00455A00  |. 33C0           XOR EAX,EAX    
00455A02  |. 55             PUSH EBP
00455A03  |. 68 F95A4500    PUSH IFLOWER1.00455AF9
00455A08  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00455A0B  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00455A0E  |. 33C0           XOR EAX,EAX
00455A10  |. 8945 F0        MOV DWORD PTR SS:[EBP-10],EAX
00455A13  |. 33DB           XOR EBX,EBX
00455A15  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00455A18  |. E8 2FE4FAFF    CALL IFLOWER1.00403E4C             //取字符串“hazz”的长度。
00455A1D  |. 85C0           TEST EAX,EAX
00455A1F  |. 7E 13          JLE SHORT IFLOWER1.00455A34
00455A21  |. BA 01000000    MOV EDX,1
00455A26  |> 8B4D FC        /MOV ECX,DWORD PTR SS:[EBP-4]
00455A29  |. 0FB64C11 FF    |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] //依次把字符串"hazz"每个字符送ECX。
00455A2E  |. 03D9           |ADD EBX,ECX                       //ECX值累加到EBX内。
00455A30  |. 42             |INC EDX    
00455A31  |. 48             |DEC EAX           
00455A32  |.^75 F2          \JNZ SHORT IFLOWER1.00455A26       //未完继续循环累加。得累加结果为1BDh。
00455A34  |> 035D F8        ADD EBX,DWORD PTR SS:[EBP-8]       //EBX=EBX+[EBP-8]=刚才的1BD+"004559F2"指令处的EDX。
00455A37  |. 6BC3 0D        IMUL EAX,EBX,0D                    //EAX=EBX*D。
00455A3A  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX       //EAX替换掉以前的旧值。
00455A3D  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]   
00455A40  |. BA 105B4500    MOV EDX,IFLOWER1.00455B10
00455A45  |. E8 1AE2FAFF    CALL IFLOWER1.00403C64
00455A4A  |. 33D2           XOR EDX,EDX
00455A4C  |. 8D45 CC        LEA EAX,DWORD PTR SS:[EBP-34]      //计算机名地址送EAX。
00455A4F  |> 8B4D EC        /MOV ECX,DWORD PTR SS:[EBP-14]     //取字符串"delphi"的地址送ECX。下面循环累加其ASSIC码值。
00455A52  |. 0FB60C11       |MOVZX ECX,BYTE PTR DS:[ECX+EDX]   //各字符零扩展后,依次送ECX。
00455A56  |. 8908           |MOV DWORD PTR DS:[EAX],ECX        //这个结果替换原来的计算机名内容。
00455A58  |. 42             |INC EDX
00455A59  |. 83C0 04        |ADD EAX,4
00455A5C  |. 83FA 06        |CMP EDX,6                         //总共6个字符,需要6次循环。
00455A5F  |.^75 EE          \JNZ SHORT IFLOWER1.00455A4F       //未完继续。
00455A61  |. C745 E8 080000>MOV DWORD PTR SS:[EBP-18],8   
下面是计算注册码的比较麻烦的循环体,我只列出第一次循环时的结果,第二次循环是用第一次循环的结果继续运算,叫迭代算法。
00455A68  |> 8B45 DC        /MOV EAX,DWORD PTR SS:[EBP-24]   //字符'h'的ASSIC值送EAX。
00455A6B  |. 2B45 E0        |SUB EAX,DWORD PTR SS:[EBP-20]   //减去字符'i'的ASSIC值,结果-1,送EAX。
00455A6E  |. 99             |CDQ                             //符号扩展。
00455A6F  |. 33C2           |XOR EAX,EDX   
00455A71  |. 2BC2           |SUB EAX,EDX                     //EAX结果为1。
00455A73  |. 8B4D CC        |MOV ECX,DWORD PTR SS:[EBP-34]   //字符'd'的ASSIC值送ECX。
00455A76  |. 034D D0        |ADD ECX,DWORD PTR SS:[EBP-30]   //与字符'e'ASSIC值累加,即C9。
00455A79  |. 8B55 D4        |MOV EDX,DWORD PTR SS:[EBP-2C]   //字符'l'的ASSIC值送EDX。
00455A7C  |. 3355 D8        |XOR EDX,DWORD PTR SS:[EBP-28]   //与字符'p'异或,即1C。
00455A7F  |. 03CA           |ADD ECX,EDX                     //ECX与EDX累加,即ECX=C9+1C=E5。
00455A81  |. 2BC8           |SUB ECX,EAX                     //ECX与EAX相减,即ECX=E5-1=E4。
00455A83  |. 894D E4        |MOV DWORD PTR SS:[EBP-1C],ECX   //ECX送:[EBP-1C]保存。
00455A86  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]    //计算得到的硬盘码F3BFFF68送EAX。
00455A89  |. 33C1           |XOR EAX,ECX                     //EAX与ECX异或,即F3BFFF68 XOR E4=F3BFFF8C。
00455A8B  |. 0145 F0        |ADD DWORD PTR SS:[EBP-10],EAX   //EAX累加到:[EBP-10]
00455A8E  |. 0FAF4D F0      |IMUL ECX,DWORD PTR SS:[EBP-10]  //ECX=ECX*EAX=E4*F3BFFF8C=16FF98B0
00455A92  |. 894D E4        |MOV DWORD PTR SS:[EBP-1C],ECX  
00455A95  |. BA 06000000    |MOV EDX,6
00455A9A  |. 8D45 D0        |LEA EAX,DWORD PTR SS:[EBP-30]  //EAX为字符串"delphi"中'e'的地址。
00455A9D  |> 8B08           |/MOV ECX,DWORD PTR DS:[EAX]    //字符'e' 送ECX。
00455A9F  |. 8948 FC        ||MOV DWORD PTR DS:[EAX-4],ECX  //ECX覆盖掉前面的字符'd'。
00455AA2  |. 83C0 04        ||ADD EAX,4             
00455AA5  |. 4A             ||DEC EDX         //计数器减一。
00455AA6  |.^75 F5          |\JNZ SHORT IFLOWER1.00455A9D   //未完继续循环移动。
00455AA8  |. FF4D E8        |DEC DWORD PTR SS:[EBP-18]      //大循环共8次,这里为计数器减一。
00455AAB  |.^75 BB          \JNZ SHORT IFLOWER1.00455A68    //不为0则继续循环上去。
00455AAD  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
00455AB0  |. 50             PUSH EAX
00455AB1  |. 8D4D C8        LEA ECX,DWORD PTR SS:[EBP-38]
00455AB4  |. BA 08000000    MOV EDX,8
00455AB9  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00455ABC  |. E8 972EFBFF    CALL IFLOWER1.00408958          //这个函数就是处理得到的注册码了。我们下面看看。
00455AC1  |. 8B45 C8        MOV EAX,DWORD PTR SS:[EBP-38]
00455AC4  |. B9 08000000    MOV ECX,8
00455AC9  |. BA 01000000    MOV EDX,1
00455ACE  |. E8 81E5FAFF    CALL IFLOWER1.00404054
00455AD3  |. 33C0           XOR EAX,EAX
00455AD5  |. 5A             POP EDX
00455AD6  |. 59             POP ECX
00455AD7  |. 59             POP ECX
00455AD8  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
00455ADB  |. 68 005B4500    PUSH IFLOWER1.00455B00
00455AE0  |> 8D45 C8        LEA EAX,DWORD PTR SS:[EBP-38]
00455AE3  |. E8 E4E0FAFF    CALL IFLOWER1.00403BCC
00455AE8  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
00455AEB  |. E8 DCE0FAFF    CALL IFLOWER1.00403BCC
00455AF0  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
00455AF3  |. E8 D4E0FAFF    CALL IFLOWER1.00403BCC
00455AF8  \. C3             RETN
00455AF9   .^E9 A6DAFAFF    JMP IFLOWER1.004035A4
00455AFE   .^EB E0          JMP SHORT IFLOWER1.00455AE0
00455B00   . 5B             POP EBX
00455B01   . 8BE5           MOV ESP,EBP
00455B03   . 5D             POP EBP
00455B04   . C3             RETN
=================================================================
下面是00455ABC 处的函数 CALL IFLOWER1.00408958  : 
00408958  /$ 83C4 F0        ADD ESP,-10
0040895B  |. 6A 01          PUSH 1
0040895D  |. 895424 04      MOV DWORD PTR SS:[ESP+4],EDX
00408961  |. C64424 08 00   MOV BYTE PTR SS:[ESP+8],0
00408966  |. 894424 0C      MOV DWORD PTR SS:[ESP+C],EAX
0040896A  |. C64424 10 00   MOV BYTE PTR SS:[ESP+10],0
0040896F  |. 8D4424 04      LEA EAX,DWORD PTR SS:[ESP+4]
00408973  |. BA 8C894000    MOV EDX,IFLOWER1.0040898C
00408978  |. 91             XCHG EAX,ECX
00408979  |. E8 560D0000    CALL IFLOWER1.004096D4      //顺着这个函数继续看。
0040897E  |. 83C4 10        ADD ESP,10
00408981  \. C3             RETN
=================================================================
004096D4  /$ 55             PUSH EBP
004096D5  |. 8BEC           MOV EBP,ESP
004096D7  |. 81C4 04F0FFFF  ADD ESP,-0FFC
004096DD  |. 50             PUSH EAX
004096DE  |. 83C4 F4        ADD ESP,-0C
004096E1  |. 53             PUSH EBX
004096E2  |. 56             PUSH ESI
004096E3  |. 894D F8        MOV DWORD PTR SS:[EBP-8],ECX
004096E6  |. 8955 FC        MOV DWORD PTR SS:[EBP-4],EDX
004096E9  |. 8BF0           MOV ESI,EAX
004096EB  |. BB 02100000    MOV EBX,1002
004096F0  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004096F3  |. E8 54A7FFFF    CALL IFLOWER1.00403E4C 
004096F8  |. 8BD3           MOV EDX,EBX
004096FA  |. 85D2           TEST EDX,EDX
004096FC  |. 79 03          JNS SHORT IFLOWER1.00409701
004096FE  |. 83C2 03        ADD EDX,3
00409701  |> C1FA 02        SAR EDX,2
00409704  |. 8BCB           MOV ECX,EBX
00409706  |. 2BCA           SUB ECX,EDX
00409708  |. 3BC1           CMP EAX,ECX
0040970A  |. 7D 24          JGE SHORT IFLOWER1.00409730
0040970C  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040970F  |. E8 38A7FFFF    CALL IFLOWER1.00403E4C
00409714  |. 50             PUSH EAX
00409715  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
00409718  |. 50             PUSH EAX
00409719  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0040971C  |. 50             PUSH EAX
0040971D  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00409720  |. 8BD3           MOV EDX,EBX
00409722  |. 4A             DEC EDX
00409723  |. 8D85 F6EFFFFF  LEA EAX,DWORD PTR SS:[EBP-100A]  //注册码地址送EAX。注册码已经现出面目。
00409729  |. E8 32FBFFFF    CALL IFLOWER1.00409260           //这个函数把16进制注册码变为ASSIC码形式。
0040972E  |. EB 0C          JMP SHORT IFLOWER1.0040973C
00409730  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00409733  |. E8 14A7FFFF    CALL IFLOWER1.00403E4C
00409738  |. 8BD8           MOV EBX,EAX
0040973A  |. 8BC3           MOV EAX,EBX
0040973C  |> 8BD3           MOV EDX,EBX
0040973E  |. 4A             DEC EDX
0040973F  |. 3BC2           CMP EAX,EDX
00409741  |. 7C 43          JL SHORT IFLOWER1.00409786
00409743  |. EB 30          JMP SHORT IFLOWER1.00409775
00409745  |> 03DB           /ADD EBX,EBX
00409747  |. 8BC6           |MOV EAX,ESI
00409749  |. E8 7EA4FFFF    |CALL IFLOWER1.00403BCC
0040974E  |. 8BC6           |MOV EAX,ESI
00409750  |. 8BD3           |MOV EDX,EBX
00409752  |. E8 29AAFFFF    |CALL IFLOWER1.00404180
00409757  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
0040975A  |. E8 EDA6FFFF    |CALL IFLOWER1.00403E4C
0040975F  |. 50             |PUSH EAX
00409760  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]
00409763  |. 50             |PUSH EAX
00409764  |. 8B45 08        |MOV EAX,DWORD PTR SS:[EBP+8]
00409767  |. 50             |PUSH EAX
00409768  |. 8B4D FC        |MOV ECX,DWORD PTR SS:[EBP-4]
0040976B  |. 8BD3           |MOV EDX,EBX
0040976D  |. 4A             |DEC EDX
0040976E  |. 8B06           |MOV EAX,DWORD PTR DS:[ESI]
00409770  |. E8 EBFAFFFF    |CALL IFLOWER1.00409260
00409775  |> 8BD3            MOV EDX,EBX
00409777  |. 4A             |DEC EDX
00409778  |. 3BC2           |CMP EAX,EDX
0040977A  |.^7D C9          \JGE SHORT IFLOWER1.00409745
0040977C  |. 8BD6           MOV EDX,ESI
0040977E  |. 92             XCHG EAX,EDX
0040977F  |. E8 FCA9FFFF    CALL IFLOWER1.00404180
00409784  |. EB 0E          JMP SHORT IFLOWER1.00409794
00409786  |> 8D95 F6EFFFFF  LEA EDX,DWORD PTR SS:[EBP-100A]  //注册码的地址送EDX。
0040978C  |. 8BCE           MOV ECX,ESI
0040978E  |. 91             XCHG EAX,ECX
0040978F  |. E8 20A5FFFF    CALL IFLOWER1.00403CB4           // 拷贝注册码到其他地址。
00409794  |> 5E             POP ESI
00409795  |. 5B             POP EBX
00409796  |. 8BE5           MOV ESP,EBP
00409798  |. 5D             POP EBP
00409799  \. C2 0400        RETN 4
=================================================================
最后我们返回到下面代码处:
00492F3B  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]  //真注册码地址送EDX。
00492F3E  |. 58             POP EAX                       //弹出假注册码地址到EAX。
00492F3F  |. E8 1810F7FF    CALL IFLOWER1.00403F5C        //此函数进行真假比较啦。
00492F44  |. 75 05          JNZ SHORT IFLOWER1.00492F4B   //不为0则OVER。
00492F46  |. 83CE FF        OR ESI,FFFFFFFF
00492F49  |. EB 02          JMP SHORT IFLOWER1.00492F4D
为了完整起见,让我们稍微看一下00492F3F处的比较函数部分内容吧:
00403F73  |. 8B46 FC        MOV EAX,DWORD PTR DS:[ESI-4]  //假码长度送EAX。比如前面输入654321为6位。
00403F76  |. 8B57 FC        MOV EDX,DWORD PTR DS:[EDI-4]  //真码长度送EDX。这里是8位的。
00403F79  |. 29D0           SUB EAX,EDX                   //两者相减。
00403F7B  |. 77 02          JA SHORT IFLOWER1.00403F7F    
00403F7D  |. 01C2           ADD EDX,EAX
00403F7F  |> 52             PUSH EDX
00403F80  |. C1EA 02        SHR EDX,2
00403F83  |. 74 26          JE SHORT IFLOWER1.00403FAB
00403F85  |> 8B0E           /MOV ECX,DWORD PTR DS:[ESI]   //假码送ECX。
00403F87  |. 8B1F           |MOV EBX,DWORD PTR DS:[EDI]   //真码送EBX。
00403F89  |. 39D9           |CMP ECX,EBX                  //进行比较。
00403F8B  |. 75 58          |JNZ SHORT IFLOWER1.00403FE5  //不等就OVER。
00403F8D  |. 4A             |DEC EDX                      //计数器递减。
00403F8E  |. 74 15          |JE SHORT IFLOWER1.00403FA5   //比较完毕则跳走。
00403F90  |. 8B4E 04        |MOV ECX,DWORD PTR DS:[ESI+4] //下一组假码送ECX。
00403F93  |. 8B5F 04        |MOV EBX,DWORD PTR DS:[EDI+4] //下一组真码送EBX。
00403F96  |. 39D9           |CMP ECX,EBX      
00403F98  |. 75 4B          |JNZ SHORT IFLOWER1.00403FE5  //不等就OVER。
00403F9A  |. 83C6 08        |ADD ESI,8
00403F9D  |. 83C7 08        |ADD EDI,8
00403FA0  |. 4A             |DEC EDX
00403FA1  |.^75 E2          \JNZ SHORT IFLOWER1.00403F85  //未完则继续循环。
00403FA3  |. EB 06          JMP SHORT IFLOWER1.00403FAB
=================================================================
后记:用了1个小时跟踪程序,分析其算法,用1小时写了这篇破文,希望对菜鸟有那么点启发。通过跟踪发现这个程序的注册码算法其实很清晰明了的,计算强度不是太大,才循环了8次而已。注册机也很容易写出来的。而且这个程序的注册码只与硬盘号有关,与用户名无关。
这几天遇到一个vbox加壳的软件,反跟踪,反调试,实在太可怕,怎么搞掉这个VOBX的壳是个问题。因为程序 监测到你驻留了调试器则弹出对话框提示你。非常麻烦。我还得继续研究看雪论坛精华的文章,需要大补才行!!也希望各位在这冬天好好补补,学业进步!
这几天身体欠佳,精神不在状态。希望各位坛友谅解。分析完了这个软件,才觉得心情好多了,快来分享我的愉快吧!! 特感谢您耽误宝贵时间阅读!请多多指教!!^_*

结论:
用户名:任意输入即可
注册码:126A7FA3

完稿:2006年1月22日晚10:30


qDuWg
qduwg@163.com