发新话题
打印

[转载]电影剪辑软件“VCDCutterV4.0”注册码分析

[转载]电影剪辑软件“VCDCutterV4.0”注册码分析

文章作者:菜鸟 不要误会,他名字就是叫菜鸟
信息来源:看雪论坛


题目:电影剪辑软件“VCDCutterV4.0”注册码分析
软件功能:此软件为国人开发的小软件,才400KB,非常小巧玲珑。不必安装直接运行。系MPEG,VCD媒体播放器。本版本的播放器可以播放MPEG,VCD和其它媒体文件(诸如MPG,DAT,AVI,MOV,WAV)。可以从MPG或VCD碟片截取媒体画面和MPG片段(你可以选择截取MPG系统流,视频流或音频流).未注册版只可以剪辑7秒钟的电影,而且最大片段是2段(2个7秒!!)。太那个了点吧!!

工具:SOFTICE,PEID

引子:今天到一台隔壁机房电脑上查找Microsot Encarta资料,非常有名的大百科全书。结果发现几个小软件,没有注册。顺便拷贝到U盘,带回宿舍研究了一下。首先就是这个国人开发的小工具,可能是印度老师安装上去的,因为界面全部是英语的,所以外国人也能够使用。分析了1个小时就得出结论了。赶紧把破解过程撰写出来,以便分享俺的快乐!!首先拿PEID查看,没有加壳,便于倒出代码写文章了。是VC写的。启动程序,打开help菜单,单击Register,弹出注册窗口,输入用户名wanggang,注册码654321,注意窗口上显示出了一个根据CMOS信息计算得到的ID号。调出SOFTICE,设断点bpx hmemcpy,(用getwindowtexta无效),F5退出,单击OK,被拦住。按一阵F12,来到主程序空间。代码分析如下:

0042A244  > 8D4424 10       LEA EAX,DWORD PTR SS:[ESP+10]
0042A248  . 6A 40          PUSH 40
0042A24A  . 50            PUSH EAX
0042A24B  . 68 01040000      PUSH 401
0042A250  . 56            PUSH ESI
0042A251  . FFD5          CALL EBP                        //取用户名。
0042A253  . 8D4C24 50       LEA ECX,DWORD PTR SS:[ESP+50]          //我们返回到这里。
0042A257  . 6A 40          PUSH 40
0042A259  . 51            PUSH ECX
0042A25A  . 68 02040000      PUSH 402
0042A25F  . 56            PUSH ESI
0042A260  . FFD5          CALL EBP                        //取注册码。
0042A262  . 8D5424 50       LEA EDX,DWORD PTR SS:[ESP+50]          //注册码地址送EDX。
0042A266  . 8D4424 10       LEA EAX,DWORD PTR SS:[ESP+10]          //用户名地址送EDX。
0042A26A  . 52            PUSH EDX
0042A26B  . 50            PUSH EAX
0042A26C  . E8 0F3CFFFF      CALL VCDCUT.0041DE80                //注册码产生与比较的函数。  (1)
0042A271  . 83C4 08        ADD ESP,8
0042A274  . 85C0          TEST EAX,EAX                      //EAX返回0则错,返回1则成功。
0042A276  . 0F84 83000000    JE VCDCUT.0042A2FF
0042A27C  . 8B0D 280D4900    MOV ECX,DWORD PTR DS:[490D28]
0042A282  . 51            PUSH ECX
0042A283  . FF15 DC744900    CALL DWORD PTR DS:[<&GDI32.DeleteObject>]
0042A289  . 8B15 840C4900    MOV EDX,DWORD PTR DS:[490C84]
0042A28F  . 6A 7B          PUSH 7B
0042A291  . 52            PUSH EDX
0042A292  . FF15 64764900    CALL DWORD PTR DS:[<&USER32.LoadBitmapA>]
0042A298  . A3 280D4900      MOV DWORD PTR DS:[490D28],EAX
0042A29D  . 8D4424 50       LEA EAX,DWORD PTR SS:[ESP+50]
0042A2A1  . 6A 01          PUSH 1
0042A2A3  . 8D4C24 14       LEA ECX,DWORD PTR SS:[ESP+14]
0042A2A7  . 50            PUSH EAX
0042A2A8  . 51            PUSH ECX
0042A2A9  . E8 4236FFFF      CALL VCDCUT.0041D8F0
0042A2AE  . 83C4 0C        ADD ESP,0C
0042A2B1  . 6A 01          PUSH 1
0042A2B3  . 56            PUSH ESI
0042A2B4  . FF15 E8764900    CALL DWORD PTR DS:[<&USER32.EndDialog>]
0042A2BA  . 8B15 58CA4700    MOV EDX,DWORD PTR DS:[47CA58]
0042A2C0  . 52            PUSH EDX
0042A2C1  . FF15 EC764900    CALL DWORD PTR DS:[<&USER32.SetActiveWindow>]
0042A2C7  . 8B0D 58CA4700    MOV ECX,DWORD PTR DS:[47CA58]
0042A2CD  . 8D4424 10       LEA EAX,DWORD PTR SS:[ESP+10]
0042A2D1  . 6A 00          PUSH 0
0042A2D3  . 50            PUSH EAX
0042A2D4  . 68 C4294400      PUSH VCDCUT.004429C4 ;  ASCII "Thanks for your support !!!Registeration is succeed !!!"
0042A2D9  . 51            PUSH ECX
0042A2DA  . FFD3          CALL EBX                          //显示成功对话框。
0042A2DC  . 8B15 58CA4700    MOV EDX,DWORD PTR DS:[47CA58]
0042A2E2  . 6A 00          PUSH 0
0042A2E4  . 6A 00          PUSH 0
0042A2E6  . 52            PUSH EDX
0042A2E7  . FF15 68764900    CALL DWORD PTR DS:[<&USER32.InvalidateRect>]
0042A2ED  . B8 01000000      MOV EAX,1
0042A2F2  . 5F            POP EDI
0042A2F3  . 5E            POP ESI
0042A2F4  . 5D            POP EBP
0042A2F5  . 5B            POP EBX
0042A2F6  . 81C4 80030000    ADD ESP,380
0042A2FC  . C2 1000        RETN 10
==========================================================================================
下面分析(1)处的函数代码:
0041DE80  /$ 81EC 08020000    SUB ESP,208
0041DE86  |. 83C9 FF        OR ECX,FFFFFFFF
0041DE89  |. 33C0          XOR EAX,EAX
0041DE8B  |. 8D5424 08       LEA EDX,DWORD PTR SS:[ESP+8]
0041DE8F  |. 53            PUSH EBX
0041DE90  |. 56            PUSH ESI
0041DE91  |. 57            PUSH EDI
0041DE92  |. BF 10144400      MOV EDI,VCDCUT.00441410      ;  ASCII "abmz0129"
0041DE97  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]            //把 "abmz0129"串拷贝到另外地方。记为S1。
0041DE99  |. F7D1          NOT ECX
0041DE9B  |. 2BF9          SUB EDI,ECX
0041DE9D  |. 8BC1          MOV EAX,ECX
0041DE9F  |. 8BF7          MOV ESI,EDI
0041DEA1  |. 8BFA          MOV EDI,EDX
0041DEA3  |. 33D2          XOR EDX,EDX
0041DEA5  |. C1E9 02        SHR ECX,2
0041DEA8  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0041DEAA  |. 8BC8          MOV ECX,EAX
0041DEAC  |. 83E1 03        AND ECX,3
0041DEAF  |. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0041DEB1  |. 8BB424 18020000   MOV ESI,DWORD PTR SS:[ESP+218]
0041DEB8  |. 8D4C24 14       LEA ECX,DWORD PTR SS:[ESP+14]
0041DEBC  |. 8BDE          MOV EBX,ESI
0041DEBE  |. 2BD9          SUB EBX,ECX
0041DEC0  |> 8BFE          /MOV EDI,ESI
0041DEC2  |. 83C9 FF        |OR ECX,FFFFFFFF
0041DEC5  |. 33C0          |XOR EAX,EAX
0041DEC7  |. F2:AE          |REPNE SCAS BYTE PTR ES:[EDI]           //扫描用户名,计算长度。
0041DEC9  |. F7D1          |NOT ECX
0041DECB  |. 49            |DEC ECX
0041DECC  |. 83F9 08        |CMP ECX,8
0041DECF  |. 76 07          |JBE SHORT VCDCUT.0041DED8             //小于等于8位跳走。
0041DED1  |. B9 08000000      |MOV ECX,8
0041DED6  |. EB 0C          |JMP SHORT VCDCUT.0041DEE4
0041DED8  |> 8BFE          |MOV EDI,ESI
0041DEDA  |. 83C9 FF        |OR ECX,FFFFFFFF
0041DEDD  |. 33C0          |XOR EAX,EAX
0041DEDF  |. F2:AE          |REPNE SCAS BYTE PTR ES:[EDI]
0041DEE1  |. F7D1          |NOT ECX
0041DEE3  |. 49            |DEC ECX
0041DEE4  |> 3BD1          |CMP EDX,ECX
0041DEE6  |. 73 0E          |JNB SHORT VCDCUT.0041DEF6
0041DEE8  |. 8D4414 14       |LEA EAX,DWORD PTR SS:[ESP+EDX+14]        //S1串地址送EAX。
0041DEEC  |. 42            |INC EDX
0041DEED  |. 8A0C18         |MOV CL,BYTE PTR DS:[EAX+EBX]           //用户名字符送CL。
0041DEF0  |. 884C14 13       |MOV BYTE PTR SS:[ESP+EDX+13],CL         //用户名覆盖掉串S1。
0041DEF4  |.^EB CA          \JMP SHORT VCDCUT.0041DEC0
0041DEF6  |> C64414 14 00     MOV BYTE PTR SS:[ESP+EDX+14],0
0041DEFB  |. 6A 01          PUSH 1
0041DEFD  |. 68 B8FC4400      PUSH VCDCUT.0044FCB8
0041DF02  |. 8D5424 1C       LEA EDX,DWORD PTR SS:[ESP+1C]           //用户名地址送EDX。
0041DF06  |. 6A 08          PUSH 8
0041DF08  |. 52            PUSH EDX
0041DF09  |. 68 98134400      PUSH VCDCUT.00441398
0041DF0E  |. E8 AD8AFFFF      CALL VCDCUT.004169C0                 //注册码计算就在这个函数内了。(2)
0041DF13  |. 83C4 14        ADD ESP,14
0041DF16  |. 8D4424 14       LEA EAX,DWORD PTR SS:[ESP+14]
0041DF1A  |. 8D4C24 0C       LEA ECX,DWORD PTR SS:[ESP+C]
0041DF1E  |. 6A 04          PUSH 4
0041DF20  |. 50            PUSH EAX
0041DF21  |. 51            PUSH ECX
0041DF22  |. E8 49680100      CALL <JMP.&MSVCRT.memmove>            
0041DF27  |. 83C4 0C        ADD ESP,0C
0041DF2A  |. 8D5424 18       LEA EDX,DWORD PTR SS:[ESP+18]
0041DF2E  |. 8D4424 10       LEA EAX,DWORD PTR SS:[ESP+10]
0041DF32  |. 6A 04          PUSH 4
0041DF34  |. 52            PUSH EDX
0041DF35  |. 50            PUSH EAX
0041DF36  |. E8 35680100      CALL <JMP.&MSVCRT.memmove>
0041DF3B  |. 83C4 0C        ADD ESP,0C
0041DF3E  |. 8D4C24 14       LEA ECX,DWORD PTR SS:[ESP+14]
0041DF42  |. 6A 00          PUSH 0
0041DF44  |. 68 B8FC4400      PUSH VCDCUT.0044FCB8
0041DF49  |. 6A 08          PUSH 8
0041DF4B  |. 51            PUSH ECX
0041DF4C  |. 68 98134400      PUSH VCDCUT.00441398
0041DF51  |. E8 6A8AFFFF      CALL VCDCUT.004169C0              
0041DF56  |. 8B5424 24       MOV EDX,DWORD PTR SS:[ESP+24]          //4字节的16进制数送EDX,逐位转换为ASSIC码作为注册码的第二部分。
0041DF5A  |. 8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]          //4字节的16进制数送EAX,逐位转换为ASSIC码作为注册码的第一部分。
0041DF5E  |. 83C4 14        ADD ESP,14
0041DF61  |. 8D8C24 14010000   LEA ECX,DWORD PTR SS:[ESP+114]
0041DF68  |. 52            PUSH EDX
0041DF69  |. 50            PUSH EAX
0041DF6A  |. 68 EC134400      PUSH VCDCUT.004413EC
0041DF6F  |. 51            PUSH ECX
0041DF70  |. FF15 24774900    CALL DWORD PTR DS:[<&USER32.wsprintfA>]    //把上述得到的16个ASSIC码按8字符一组,分2组,用&#39;-&#39;连接起来。这就是真正的注册码了。
0041DF76  |. 8BB424 2C020000   MOV ESI,DWORD PTR SS:[ESP+22C]         
0041DF7D  |. 83C4 10        ADD ESP,10
0041DF80  |. 8D8424 14010000   LEA EAX,DWORD PTR SS:[ESP+114]
0041DF87  |> 8A10          /MOV DL,BYTE PTR DS:[EAX]             //真码逐位送DL,循环比较。
0041DF89  |. 8A1E          |MOV BL,BYTE PTR DS:[ESI]             //假码逐位送BL,循环比较。
0041DF8B  |. 8ACA          |MOV CL,DL
0041DF8D  |. 3AD3          |CMP DL,BL                       //真假码比较。
0041DF8F  |. 75 2F          |JNZ SHORT VCDCUT.0041DFC0
0041DF91  |. 84C9          |TEST CL,CL
0041DF93  |. 74 16          |JE SHORT VCDCUT.0041DFAB
0041DF95  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1]            //下位真码。
0041DF98  |. 8A5E 01        |MOV BL,BYTE PTR DS:[ESI+1]            //下位假码。
0041DF9B  |. 8ACA          |MOV CL,DL
0041DF9D  |. 3AD3          |CMP DL,BL
0041DF9F  |. 75 1F          |JNZ SHORT VCDCUT.0041DFC0
0041DFA1  |. 83C0 02        |ADD EAX,2
0041DFA4  |. 83C6 02        |ADD ESI,2
0041DFA7  |. 84C9          |TEST CL,CL
0041DFA9  |.^75 DC          \JNZ SHORT VCDCUT.0041DF87             //未完继续循环。
0041DFAB  |> 33C0          XOR EAX,EAX                       //EAX清0。
0041DFAD  |. 33C9          XOR ECX,ECX                       //ECX清0。
0041DFAF  |. 85C0          TEST EAX,EAX                      //测试EAX是否0。
0041DFB1  |. 0F94C1         SETE CL                          //如果EAX为0,则置ECX为1,成功标志位。
0041DFB4  |. 8BC1          MOV EAX,ECX                       //ECX的值送EAX。
0041DFB6  |. 5F            POP EDI
0041DFB7  |. 5E            POP ESI
0041DFB8  |. 5B            POP EBX
0041DFB9  |. 81C4 08020000    ADD ESP,208
0041DFBF  |. C3            RETN
0041DFC0  |> 1BC0          SBB EAX,EAX
0041DFC2  |. 5F            POP EDI
0041DFC3  |. 83D8 FF        SBB EAX,-1
0041DFC6  |. 33C9          XOR ECX,ECX
0041DFC8  |. 85C0          TEST EAX,EAX
0041DFCA  |. 0F94C1         SETE CL
0041DFCD  |. 5E            POP ESI
0041DFCE  |. 8BC1          MOV EAX,ECX
0041DFD0  |. 5B            POP EBX
0041DFD1  |. 81C4 08020000    ADD ESP,208
0041DFD7  \. C3            RETN
==========================================================================================
下面分析(2)处的函数:
004169C0  /$ 8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
004169C4  |. 53            PUSH EBX
004169C5  |. 99            CDQ
004169C6  |. 83E2 07        AND EDX,7
004169C9  |. 55            PUSH EBP
004169CA  |. 03C2          ADD EAX,EDX
004169CC  |. 8B6C24 10       MOV EBP,DWORD PTR SS:[ESP+10]
004169D0  |. 56            PUSH ESI
004169D1  |. 8BF0          MOV ESI,EAX
004169D3  |. 8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]
004169D7  |. 57            PUSH EDI
004169D8  |. C1FE 03        SAR ESI,3                          //用户名长度右移3次。
004169DB  |. C1E6 03        SHL ESI,3                          //用户名长度左移3次。
004169DE  |. 85C0          TEST EAX,EAX
004169E0  |. C705 A89A4400 FFFF>MOV DWORD PTR DS:[449AA8],-1             //把FFFFFFFFh常量送此地址保存。
004169EA  |. 74 18          JE SHORT VCDCUT.00416A04
004169EC  |. 33FF          XOR EDI,EDI
004169EE  |. 85F6          TEST ESI,ESI
004169F0  |. 7E 12          JLE SHORT VCDCUT.00416A04               //此处未跳。
004169F2  |> 0FBE042F        /MOVSX EAX,BYTE PTR DS:[EDI+EBP]          //用户名字符依次送EAX。
004169F6  |. 50            |PUSH EAX
004169F7  |. E8 94FFFFFF      |CALL VCDCUT.00416990                  //对用户名查表计算。          (3)
004169FC  |. 83C4 04        |ADD ESP,4
004169FF  |. 47            |INC EDI                          //计数器增1。
00416A00  |. 3BFE          |CMP EDI,ESI
00416A02  |.^7C EE          \JL SHORT VCDCUT.004169F2               //未到用户名长度,则继续。
00416A04  |> 8B5424 14       MOV EDX,DWORD PTR SS:[ESP+14]            //根据CMOS信息得到的ID串的地址送EDX。比如247fcfab。
00416A08  |. 83C9 FF        OR ECX,FFFFFFFF
00416A0B  |. 8BFA          MOV EDI,EDX
00416A0D  |. 33C0          XOR EAX,EAX
00416A0F  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI]             //扫描上述ID串,得长度。
00416A11  |. F7D1          NOT ECX
00416A13  |. 49            DEC ECX
00416A14  |. 83F9 09        CMP ECX,9
00416A17  |. 76 03          JBE SHORT VCDCUT.00416A1C                //小于9则跳走。
00416A19  |. 8842 08        MOV BYTE PTR DS:[EDX+8],AL
00416A1C  |> 52            PUSH EDX
00416A1D  |. E8 5EF9FFFF      CALL VCDCUT.00416380                   //查表计算。              (4)
00416A22  |. 83C4 04        ADD ESP,4
00416A25  |. 85F6          TEST ESI,ESI
00416A27  |. 7D 08          JGE SHORT VCDCUT.00416A31                //此处跳走。
00416A29  |. 83C8 FF        OR EAX,FFFFFFFF
00416A2C  |. 5F            POP EDI
00416A2D  |. 5E            POP ESI
00416A2E  |. 5D            POP EBP
00416A2F  |. 5B            POP EBX
00416A30  |. C3            RETN
00416A31  |> 85F6          TEST ESI,ESI                     
00416A33  |. 8BFD          MOV EDI,EBP
00416A35  |. 7E 25          JLE SHORT VCDCUT.00416A5C                //此处未跳。
00416A37  |. 8D5E 07        LEA EBX,DWORD PTR DS:[ESI+7]
00416A3A  |. C1EB 03        SHR EBX,3
00416A3D  |> 8B4424 24       /MOV EAX,DWORD PTR SS:[ESP+24]
00416A41  |. 57            |PUSH EDI
00416A42  |. 85C0          |TEST EAX,EAX
00416A44  |. 57            |PUSH EDI
00416A45  |. 74 07          |JE SHORT VCDCUT.00416A4E
00416A47  |. E8 54F7FFFF      |CALL VCDCUT.004161A0                  //EAX为0,则用此函数进行用户名计算。  (5)
00416A4C  |. EB 05          |JMP SHORT VCDCUT.00416A53
00416A4E  |> E8 FDF7FFFF      |CALL VCDCUT.00416250                  //EAX为非0,则用此函数进行用户名计算。
00416A53  |> 83C4 08        |ADD ESP,8
00416A56  |. 83C7 08        |ADD EDI,8
00416A59  |. 4B            |DEC EBX
00416A5A  |.^75 E1          \JNZ SHORT VCDCUT.00416A3D
00416A5C  |> 8B4424 24       MOV EAX,DWORD PTR SS:[ESP+24]
00416A60  |. 85C0          TEST EAX,EAX
00416A62  |. 75 18          JNZ SHORT VCDCUT.00416A7C
00416A64  |. 33FF          XOR EDI,EDI
00416A66  |. 85F6          TEST ESI,ESI
00416A68  |. 7E 12          JLE SHORT VCDCUT.00416A7C
00416A6A  |> 0FBE0C2F        /MOVSX ECX,BYTE PTR DS:[EDI+EBP]
00416A6E  |. 51            |PUSH ECX
00416A6F  |. E8 1CFFFFFF      |CALL VCDCUT.00416990                  //再次查表计算。参考(3)。
00416A74  |. 83C4 04        |ADD ESP,4
00416A77  |. 47            |INC EDI
00416A78  |. 3BFE          |CMP EDI,ESI
00416A7A  |.^7C EE          \JL SHORT VCDCUT.00416A6A
00416A7C  |> A1 A89A4400      MOV EAX,DWORD PTR DS:[449AA8]             //用户名计算后得到的结果送EAX。
00416A81  |. 8B5424 20       MOV EDX,DWORD PTR SS:[ESP+20]
00416A85  |. A3 A8FB4400      MOV DWORD PTR DS:[44FBA8],EAX             //EAX送[44FBA8]处。
00416A8A  |. 5F            POP EDI
00416A8B  |. F7D0          NOT EAX                            //EAX取反。
00416A8D  |. A3 A89A4400      MOV DWORD PTR DS:[449AA8],EAX             //覆盖原来的数值。
00416A92  |. A3 AC9A4400      MOV DWORD PTR DS:[449AAC],EAX             //EAX送[449AAC]。
00416A97  |. 5E            POP ESI
00416A98  |. 8902          MOV DWORD PTR DS:[EDX],EAX
00416A9A  |. 5D            POP EBP
00416A9B  |. 33C0          XOR EAX,EAX
00416A9D  |. 5B            POP EBX
00416A9E  \. C3            RETN
==========================================================================================
下面简单看看(3)处的函数:
00416990  /$ 8B4C24 04       MOV ECX,DWORD PTR SS:[ESP+4]              //用户名字符逐位送ECX。
00416994  |. A1 A89A4400      MOV EAX,DWORD PTR DS:[449AA8]             //[449AA8]内存内的值送EAX。初始值为FFFFFFFFh.
00416999  |. 33C8          XOR ECX,EAX                         //ECX与EAX异或。
0041699B  |. 81E1 FF000000    AND ECX,0FF                         //取最低字节。
004169A1  |. C1E8 08        SHR EAX,8                          //EAX右移8次。
004169A4  |. 8B148D F8EF4300   MOV EDX,DWORD PTR DS:[ECX*4+43EFF8]         //根据得到的ECX查表得一个数,送EDX。
004169AB  |. 33D0          XOR EDX,EAX                         //EDX与EAX异或。
004169AD  |. B8 01000000      MOV EAX,1                          //EAX置1。
004169B2  |. 8915 A89A4400    MOV DWORD PTR DS:[449AA8],EDX             //EDX送[449AA8]内存。
004169B8  \. C3            RETN
==========================================================================================
下面简单分析(4)处的函数:
00416380  /$ 68 B0EC4300      PUSH VCDCUT.0043ECB0
00416385  |. 68 40EB4400      PUSH VCDCUT.0044EB40
0041638A  |. E8 31020000      CALL VCDCUT.004165C0                   //强度非常大的计算。          (6)
0041638F  |. 83C4 08        ADD ESP,8
00416392  |. 68 F0EC4300      PUSH VCDCUT.0043ECF0
00416397  |. 68 A8F34400      PUSH VCDCUT.0044F3A8
0041639C  |. E8 1F020000      CALL VCDCUT.004165C0
004163A1  |. 8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
004163A5  |. 83C4 08        ADD ESP,8
004163A8  |. 50            PUSH EAX
004163A9  |. E8 B2000000      CALL VCDCUT.00416460                   //强度非常大的计算。          (7)
004163AE  |. 83C4 04        ADD ESP,4
004163B1  |. E8 1A000000      CALL VCDCUT.004163D0                   //强度非常大的计算。          (8)
004163B6  |. E8 75010000      CALL VCDCUT.00416530                   //强度非常大的计算。          (9)
004163BB  |. B8 01000000      MOV EAX,1
004163C0  \. C3            RETN
==========================================================================================
下面简单分析(5)处的函数:
004161A0  /$ 8B4C24 04       MOV ECX,DWORD PTR SS:[ESP+4]
004161A4  |. 81EC 90000000    SUB ESP,90
004161AA  |. 8D4424 08       LEA EAX,DWORD PTR SS:[ESP+8]
004161AE  |. 56            PUSH ESI
004161AF  |. 57            PUSH EDI
004161B0  |. 50            PUSH EAX
004161B1  |. 68 40EB4400      PUSH VCDCUT.0044EB40
004161B6  |. 51            PUSH ECX
004161B7  |. E8 54010000      CALL VCDCUT.00416310                   //根据用户名计算得到8字节数。    (10)     
004161BC  |. 83C4 0C        ADD ESP,0C
004161BF  |. 33F6          XOR ESI,ESI
004161C1  |. 8D7C24 10       LEA EDI,DWORD PTR SS:[ESP+10]
004161C5  |> 8D57 08        /LEA EDX,DWORD PTR DS:[EDI+8]
004161C8  |. 52            |PUSH EDX
004161C9  |. 57            |PUSH EDI
004161CA  |. 56            |PUSH ESI
004161CB  |. E8 80040000      |CALL VCDCUT.00416650
004161D0  |. 83C4 0C        |ADD ESP,0C
004161D3  |. 46            |INC ESI
004161D4  |. 83C7 08        |ADD EDI,8
004161D7  |. 83FE 10        |CMP ESI,10
004161DA  |.^7C E9          \JL SHORT VCDCUT.004161C5
004161DC  |. 8B8424 94000000   MOV EAX,DWORD PTR SS:[ESP+94]
004161E3  |. 8A8C24 91000000   MOV CL,BYTE PTR SS:[ESP+91]
004161EA  |. 8A9424 92000000   MOV DL,BYTE PTR SS:[ESP+92]
004161F1  |. 884424 08       MOV BYTE PTR SS:[ESP+8],AL
004161F5  |. 886424 09       MOV BYTE PTR SS:[ESP+9],AH
004161F9  |. 66:8B8424 96000000 MOV AX,WORD PTR SS:[ESP+96]
00416201  |. 884424 0A       MOV BYTE PTR SS:[ESP+A],AL
00416205  |. 8A8424 90000000   MOV AL,BYTE PTR SS:[ESP+90]
0041620C  |. 884C24 0D       MOV BYTE PTR SS:[ESP+D],CL
00416210  |. 8B8C24 A0000000   MOV ECX,DWORD PTR SS:[ESP+A0]
00416217  |. 885424 0E       MOV BYTE PTR SS:[ESP+E],DL
0041621B  |. 884424 0C       MOV BYTE PTR SS:[ESP+C],AL
0041621F  |. 8A8424 93000000   MOV AL,BYTE PTR SS:[ESP+93]
00416226  |. 51            PUSH ECX
00416227  |. 8D5424 0C       LEA EDX,DWORD PTR SS:[ESP+C]
0041622B  |. 68 A8F34400      PUSH VCDCUT.0044F3A8
00416230  |. 52            PUSH EDX
00416231  |. 886424 17       MOV BYTE PTR SS:[ESP+17],AH
00416235  |. 884424 1B       MOV BYTE PTR SS:[ESP+1B],AL
00416239  |. E8 D2000000      CALL VCDCUT.00416310
0041623E  |. 83C4 0C        ADD ESP,0C
00416241  |. B8 01000000      MOV EAX,1
00416246  |. 5F            POP EDI
00416247  |. 5E            POP ESI
00416248  |. 81C4 90000000    ADD ESP,90
0041624E  \. C3            RETN
==========================================================================================
下面简单分析(6)处的函数:
004165C0  /$ 53            PUSH EBX
004165C1  |. 55            PUSH EBP
004165C2  |. 8B6C24 0C       MOV EBP,DWORD PTR SS:[ESP+C]
004165C6  |. 56            PUSH ESI
004165C7  |. 57            PUSH EDI
004165C8  |. B9 00020000      MOV ECX,200
004165CD  |. 33C0          XOR EAX,EAX
004165CF  |. 8BFD          MOV EDI,EBP
004165D1  |. F3:AB          REP STOS DWORD PTR ES:[EDI]
004165D3  |. 33FF          XOR EDI,EDI
004165D5  |. 897C24 14       MOV DWORD PTR SS:[ESP+14],EDI            //EDI=0,送ESP+14地址。作为计数器。
004165D9  |> 33F6          /XOR ESI,ESI                        //下面这个三重循环次数达到40h*10h*10h次=16384次。
004165DB  |> 33C9          |/XOR ECX,ECX                       //功能就是查表
004165DD  |> 8B4424 18       ||/MOV EAX,DWORD PTR SS:[ESP+18]
004165E1  |. 8B5C24 14       |||MOV EBX,DWORD PTR SS:[ESP+14]          //计数器值送EBX。
004165E5  |. 0FBE0401        |||MOVSX EAX,BYTE PTR DS:[ECX+EAX]         //根据EAX查表,结果送EAX。
004165E9  |. 48            |||DEC EAX                         //EAX减1。
004165EA  |. 8BD0          |||MOV EDX,EAX                      //EAX送EDX。
004165EC  |. C1FA 02        |||SAR EDX,2                        //EDX右移2次。
004165EF  |. 3BD3          |||CMP EDX,EBX                      //比较EDX和EBX。
004165F1  |. 75 2D          |||JNZ SHORT VCDCUT.00416620             //比较结果不为0,则跳走。
004165F3  |. 83E0 03        |||AND EAX,3
004165F6  |. 853485 E8EF4300   |||TEST DWORD PTR DS:[EAX*4+43EFE8],ESI      //根据EAX查表得结果跟ESI相与。
004165FD  |. 74 21          |||JE SHORT VCDCUT.00416620              //测试结果为0,则跳走。
004165FF  |. 8BD1          |||MOV EDX,ECX
00416601  |. 8BDD          |||MOV EBX,EBP
00416603  |. C1FA 03        |||SAR EDX,3
00416606  |. 8D043E         |||LEA EAX,DWORD PTR DS:[ESI+EDI]          //EAX=ESI+EDI。ESI和EDI分别都是计数器。
00416609  |. 03DA          |||ADD EBX,EDX
0041660B  |. 8BD1          |||MOV EDX,ECX
0041660D  |. 8D04C3         |||LEA EAX,DWORD PTR DS:[EBX+EAX*8]         //EAX=EBX+8*EAX。形成一个地址。
00416610  |. 83E2 07        |||AND EDX,7
00416613  |. 8A1495 C8EF4300   |||MOV DL,BYTE PTR DS:[EDX*4+43EFC8]        //根据EDX查表,结果送DL。
0041661A  |. 8A18          |||MOV BL,BYTE PTR DS:[EAX]              //根据EAX查表,结果送BL。
0041661C  |. 0ADA          |||OR BL,DL                         //BL跟DL或运算。
0041661E  |. 8818          |||MOV BYTE PTR DS:[EAX],BL              //结果送[EAX]处。
00416620  |> 41            |||INC ECX
00416621  |. 83F9 40        |||CMP ECX,40
00416624  |.^7C B7          ||\JL SHORT VCDCUT.004165DD
00416626  |. 46            ||INC ESI
00416627  |. 83FE 10        ||CMP ESI,10
0041662A  |.^7C AF          |\JL SHORT VCDCUT.004165DB
0041662C  |. 8B5424 14       |MOV EDX,DWORD PTR SS:[ESP+14]
00416630  |. 83C7 10        |ADD EDI,10
00416633  |. 42            |INC EDX
00416634  |. 81FF 00010000    |CMP EDI,100
0041663A  |. 895424 14       |MOV DWORD PTR SS:[ESP+14],EDX
0041663E  |.^7C 99          \JL SHORT VCDCUT.004165D9
00416640  |. 5F            POP EDI
00416641  |. 5E            POP ESI
00416642  |. 5D            POP EBP
00416643  |. B8 01000000      MOV EAX,1
00416648  |. 5B            POP EBX
00416649  \. C3            RETN
==========================================================================================
下面简单分析(7)处的函数:
00416460  /$ 8B5424 04       MOV EDX,DWORD PTR SS:[ESP+4]
00416464  |. 53            PUSH EBX
00416465  |. 55            PUSH EBP
00416466  |. 56            PUSH ESI
00416467  |. 57            PUSH EDI
00416468  |. 33C9          XOR ECX,ECX
0041646A  |> 0FBE81 30ED4300   /MOVSX EAX,BYTE PTR DS:[ECX+43ED30]           //下面这个循环也是查表。
00416471  |. 48            |DEC EAX
00416472  |. 8BF0          |MOV ESI,EAX                          //EAX送ESI。
00416474  |. C1F8 03        |SAR EAX,3                            //EAX右移3次。
00416477  |. 83E6 07        |AND ESI,7                            //ESI跟7相与。
0041647A  |. 0FBE0410        |MOVSX EAX,BYTE PTR DS:[EAX+EDX]             //根据EAX查表,结果送EAX。
0041647E  |. 8B1CB5 C8EF4300   |MOV EBX,DWORD PTR DS:[ESI*4+43EFC8]          //根据ESI查表,结果送EBX。
00416485  |. 23D8          |AND EBX,EAX                          //EAX跟EBX相与。
00416487  |. F7DB          |NEG EBX                             //EBX求补。
00416489  |. 1BDB          |SBB EBX,EBX                          //EBX自减。
0041648B  |. F7DB          |NEG EBX
0041648D  |. 8899 D0EA4400    |MOV BYTE PTR DS:[ECX+44EAD0],BL             //BL结果送内存。
00416493  |. 41            |INC ECX
00416494  |. 83F9 38        |CMP ECX,38
00416497  |.^7C D1          \JL SHORT VCDCUT.0041646A                  //循环38h次。
00416499  |. B9 18000000      MOV ECX,18
0041649E  |. 33C0          XOR EAX,EAX
004164A0  |. BF 48F34400      MOV EDI,VCDCUT.0044F348
004164A5  |. 33ED          XOR EBP,EBP
004164A7  |. F3:AB          REP STOS DWORD PTR ES:[EDI]                //指定内存区域清0。
004164A9  |. 33FF          XOR EDI,EDI
004164AB  |> 0FBE8D 68ED4300   /MOVSX ECX,BYTE PTR SS:[EBP+43ED68]           //查表结果送ECX。
004164B2  |. 33C0          |XOR EAX,EAX
004164B4  |> 33D2          |/XOR EDX,EDX                          //EDX清0。
004164B6  |. 83F8 1C        ||CMP EAX,1C                          //EAX与1C比较。
004164B9  |. 0F9DC2         ||SETGE DL                            //EAX大于等于1C则DL置1。
004164BC  |. 4A            ||DEC EDX                            //DL减1。
004164BD  |. 8BF1          ||MOV ESI,ECX                          //ECX送ESI。
004164BF  |. 83E2 E4        ||AND EDX,FFFFFFE4                      //EDX与这个常数相与。
004164C2  |. 83C2 38        ||ADD EDX,38                          //EDX加38h。
004164C5  |. 3BCA          ||CMP ECX,EDX                          //ECX跟EDX比较。
004164C7  |. 7C 03          ||JL SHORT VCDCUT.004164CC                 //ECX小于EDX则跳。
004164C9  |. 8D71 E4        ||LEA ESI,DWORD PTR DS:[ECX-1C]              //否则ESI=ECX-1Ch。
004164CC  |> 8A96 D0EA4400    ||MOV DL,BYTE PTR DS:[ESI+44EAD0]            //根据ESI查表,结果送DL。
004164D2  |. 8890 08EB4400    ||MOV BYTE PTR DS:[EAX+44EB08],DL            //DL送内存。
004164D8  |. 40            ||INC EAX
004164D9  |. 41            ||INC ECX
004164DA  |. 83F8 38        ||CMP EAX,38                          //循环38h次。
004164DD  |.^7C D5          |\JL SHORT VCDCUT.004164B4
004164DF  |. 33C0          |XOR EAX,EAX
004164E1  |> 0FBE88 78ED4300   |/MOVSX ECX,BYTE PTR DS:[EAX+43ED78]          //查表结果送ECX。
004164E8  |. 8A91 07EB4400    ||MOV DL,BYTE PTR DS:[ECX+44EB07]            //查表结果送DL。
004164EE  |. 84D2          ||TEST DL,DL
004164F0  |. 74 23          ||JE SHORT VCDCUT.00416515                 //DL为0则跳。
004164F2  |. 8BD0          ||MOV EDX,EAX                          //EAX送EDX。
004164F4  |. C1FA 03        ||SAR EDX,3                           //EDX右移3次。
004164F7  |. 8A9C3A 48F34400   ||MOV BL,BYTE PTR DS:[EDX+EDI+44F348]          //根据EDX和EDI查表,结果送BL。
004164FE  |. 8D8C3A 48F34400   ||LEA ECX,DWORD PTR DS:[EDX+EDI+44F348]        //构造的地址送ECX。
00416505  |. 8BD0          ||MOV EDX,EAX                          //EAX送EDX。
00416507  |. 83E2 07        ||AND EDX,7                           //EDX跟7相与。
0041650A  |. 8A1495 C8EF4300   ||MOV DL,BYTE PTR DS:[EDX*4+43EFC8]           //根据EDX查表,结果送DL。
00416511  |. 0ADA          ||OR BL,DL                            //BL跟DL或运算。
00416513  |. 8819          ||MOV BYTE PTR DS:[ECX],BL                 //结果送[ECX]处。
00416515  |> 40            ||INC EAX
00416516  |. 83F8 30        ||CMP EAX,30
00416519  |.^7C C6          |\JL SHORT VCDCUT.004164E1                 //循环30h次。
0041651B  |. 83C7 06        |ADD EDI,6
0041651E  |. 45            |INC EBP
0041651F  |. 83FF 60        |CMP EDI,60
00416522  |.^7C 87          \JL SHORT VCDCUT.004164AB                  //EDI为循环变量,步长为6,共10次循环。
00416524  |. 5F            POP EDI
00416525  |. 5E            POP ESI
00416526  |. 5D            POP EBP
00416527  |. B8 01000000      MOV EAX,1
0041652C  |. 5B            POP EBX
0041652D  \. C3            RETN
==========================================================================================
下面简单分析(8)处的函数:
004163D0  /$ 53            PUSH EBX
004163D1  |. 55            PUSH EBP
004163D2  |. 56            PUSH ESI
004163D3  |. 57            PUSH EDI
004163D4  |. 33FF          XOR EDI,EDI                            //EDI清0。
004163D6  |. BD B0AA4400      MOV EBP,VCDCUT.0044AAB0
004163DB  |> 33F6          /XOR ESI,ESI                           //ESI清0。循环开始。
004163DD  |> 8BC6          |/MOV EAX,ESI                          //ESI送EAX。内层循环开始。
004163DF  |. 83E0 3F        ||AND EAX,3F                           //EAX与3Fh相与。
004163E2  |. 50            ||PUSH EAX                            //参数进栈。
004163E3  |. 8D47 01        ||LEA EAX,DWORD PTR DS:[EDI+1]               //EAX=EDI+1。
004163E6  |. 50            ||PUSH EAX                            //参数进栈。
004163E7  |. E8 44000000      ||CALL VCDCUT.00416430                    //根据参数形成新数。     (11)
004163EC  |. 8BCE          ||MOV ECX,ESI
004163EE  |. 83C4 08        ||ADD ESP,8
004163F1  |. C1F9 06        ||SAR ECX,6
004163F4  |. 8BD8          ||MOV EBX,EAX                          //前面函数返回结果送EBX。
004163F6  |. 51            ||PUSH ECX                            //参数进栈。
004163F7  |. 57            ||PUSH EDI                            //参数进栈。
004163F8  |. 80E3 0F        ||AND BL,0F
004163FB  |. E8 30000000      ||CALL VCDCUT.00416430                    //根据参数形成新数。     
00416400  |. C0E0 04        ||SHL AL,4                            //得到AL左移4次。
00416403  |. 0AD8          ||OR BL,AL                            //两个函数的返回结果合并为一个字节。
00416405  |. 83C4 08        ||ADD ESP,8
00416408  |. 881C2E         ||MOV BYTE PTR DS:[ESI+EBP],BL               //保存结果。
0041640B  |. 46            ||INC ESI
0041640C  |. 81FE 00100000    ||CMP ESI,1000
00416412  |.^7C C9          |\JL SHORT VCDCUT.004163DD                  //内循环是1000h次。
00416414  |. 81C5 00100000    |ADD EBP,1000
0041641A  |. 83C7 02        |ADD EDI,2
0041641D  |. 81FD B0EA4400    |CMP EBP,VCDCUT.0044EAB0                   //外循环4次。
00416423  |.^7C B6          \JL SHORT VCDCUT.004163DB
00416425  |. 5F            POP EDI
00416426  |. 5E            POP ESI
00416427  |. 5D            POP EBP
00416428  |. B8 01000000      MOV EAX,1
0041642D  |. 5B            POP EBX
0041642E  \. C3            RETN
==========================================================================================
下面简单分析(9)处的函数:
00416530  /$ 53            PUSH EBX
00416531  |. 55            PUSH EBP
00416532  |. 56            PUSH ESI
00416533  |. 57            PUSH EDI
00416534  |. B9 00040000      MOV ECX,400
00416539  |. 33C0          XOR EAX,EAX
0041653B  |. BF B09A4400      MOV EDI,VCDCUT.00449AB0
00416540  |. 33ED          XOR EBP,EBP
00416542  |. F3:AB          REP STOS DWORD PTR ES:[EDI]                 //指定内存区域清0。
00416544  |. 33FF          XOR EDI,EDI
00416546  |> 33F6          /XOR ESI,ESI
00416548  |> 33C9          |/XOR ECX,ECX
0041654A  |> 0FBE81 A8EF4300   ||/MOVSX EAX,BYTE PTR DS:[ECX+43EFA8]          //查表结果送EAX。
00416551  |. 48            |||DEC EAX                            //EAX减1。
00416552  |. 8BD0          |||MOV EDX,EAX                          //EAX送EDX。
00416554  |. C1FA 03        |||SAR EDX,3                           //EDX右移3次。
00416557  |. 3BD5          |||CMP EDX,EBP
00416559  |. 75 32          |||JNZ SHORT VCDCUT.0041658D                //不为0则跳。
0041655B  |. 83E0 07        |||AND EAX,7                           //否则EAX跟7相与。
0041655E  |. 853485 C8EF4300   |||TEST DWORD PTR DS:[EAX*4+43EFC8],ESI         //根据EAX取数与ESI相与。
00416565  |. 74 26          |||JE SHORT VCDCUT.0041658D                 //为0则跳。
00416567  |. 8BD1          |||MOV EDX,ECX                          //否则ECX送EDX。
00416569  |. 8D043E         |||LEA EAX,DWORD PTR DS:[ESI+EDI]             //EAX=ESI+EDI,ESI和EDI分别为计数器。
0041656C  |. C1FA 03        |||SAR EDX,3                           //EDX右移3次。
0041656F  |. 8A9C82 B09A4400   |||MOV BL,BYTE PTR DS:[EDX+EAX*4+449AB0]        //根据EDX和EAX,查表取结果送BL。
00416576  |. 8D8482 B09A4400   |||LEA EAX,DWORD PTR DS:[EDX+EAX*4+449AB0]       //EAX=EDX+EAX*4+449AB0,是一个地址。
0041657D  |. 8BD1          |||MOV EDX,ECX
0041657F  |. 83E2 07        |||AND EDX,7
00416582  |. 8A1495 C8EF4300   |||MOV DL,BYTE PTR DS:[EDX*4+43EFC8]            //根据EDX取结果送DL。
00416589  |. 0ADA          |||OR BL,DL                            //BL与DL相或。
0041658B  |. 8818          |||MOV BYTE PTR DS:[EAX],BL                  //结果保存到EAX所指地址。
0041658D  |> 41            |||INC ECX
0041658E  |. 83F9 20        |||CMP ECX,20
00416591  |.^7C B7          ||\JL SHORT VCDCUT.0041654A                  //循环20h次。
00416593  |. 46            ||INC ESI
00416594  |. 81FE 00010000    ||CMP ESI,100
0041659A  |.^7C AC          |\JL SHORT VCDCUT.00416548                  //循环100h次。
0041659C  |. 81C7 00010000    |ADD EDI,100
004165A2  |. 45            |INC EBP
004165A3  |. 81FF 00040000    |CMP EDI,400
004165A9  |.^7C 9B          \JL SHORT VCDCUT.00416546                    //循环4次。
004165AB  |. 5F            POP EDI
004165AC  |. 5E            POP ESI
004165AD  |. 5D            POP EBP
004165AE  |. B8 01000000      MOV EAX,1
004165B3  |. 5B            POP EBX
004165B4  \. C3            RETN
==========================================================================================
下面简单分析(10)处的函数:
00416310  /$ 8B4C24 0C       MOV ECX,DWORD PTR SS:[ESP+C]
00416314  |. 8B5424 04       MOV EDX,DWORD PTR SS:[ESP+4]
00416318  |. 33C0          XOR EAX,EAX
0041631A  |. 53            PUSH EBX
0041631B  |. 55            PUSH EBP
0041631C  |. 8901          MOV DWORD PTR DS:[ECX],EAX
0041631E  |. 56            PUSH ESI
0041631F  |. 57            PUSH EDI
00416320  |. 895424 14       MOV DWORD PTR SS:[ESP+14],EDX
00416324  |. 8B5424 18       MOV EDX,DWORD PTR SS:[ESP+18]
00416328  |. 8941 04        MOV DWORD PTR DS:[ECX+4],EAX
0041632B  |. 33FF          XOR EDI,EDI
0041632D  |> 8B4424 14       /MOV EAX,DWORD PTR SS:[ESP+14]                //取一地址送EAX。
00416331  |. 8B4C24 1C       |MOV ECX,DWORD PTR SS:[ESP+1C]                //取一地址送ECX。
00416335  |. BD 08000000      |MOV EBP,8                              //EBP为循环计数器。
0041633A  |. 0FBE00         |MOVSX EAX,BYTE PTR DS:[EAX]                  //取一数送EAX。
0041633D  |. 8BF0          |MOV ESI,EAX
0041633F  |. 83E0 0F        |AND EAX,0F                             //EAX跟F相与。
00416342  |. C1FE 04        |SAR ESI,4                              //ESI右移4次。
00416345  |. 83E6 0F        |AND ESI,0F                             //ESI跟F相与。
00416348  |. 03F7          |ADD ESI,EDI                            //ESI=ESI+EDI。
0041634A  |. 03C7          |ADD EAX,EDI                            //EAX=EAX+EDI
0041634C  |. 8D34F2         |LEA ESI,DWORD PTR DS:[EDX+ESI*8]              //ESI=EDX+8*ESI。形成地址。
0041634F  |. 8D84C2 80000000   |LEA EAX,DWORD PTR DS:[EDX+EAX*8+80]            //EAX=EDX+EAX*8+80。形成地址。
00416356  |> 8A1E          |/MOV BL,BYTE PTR DS:[ESI]                   //ESI处的值送BL。
00416358  |. 0A18          ||OR BL,BYTE PTR DS:[EAX]                    //BL跟[EAX]处的值相或。
0041635A  |. 0819          ||OR BYTE PTR DS:[ECX],BL                    //[ECX]处值跟BL相或。
0041635C  |. 40            ||INC EAX
0041635D  |. 46            ||INC ESI
0041635E  |. 41            ||INC ECX
0041635F  |. 4D            ||DEC EBP
00416360  |.^75 F4          |\JNZ SHORT VCDCUT.00416356                  //循环8次。
00416362  |. 8B4C24 14       |MOV ECX,DWORD PTR SS:[ESP+14]
00416366  |. 83C7 20        |ADD EDI,20
00416369  |. 41            |INC ECX
0041636A  |. 81FF 00010000    |CMP EDI,100
00416370  |. 894C24 14       |MOV DWORD PTR SS:[ESP+14],ECX
00416374  |.^7C B7          \JL SHORT VCDCUT.0041632D                    //外循环为8次。
00416376  |. 5F            POP EDI
00416377  |. 5E            POP ESI
00416378  |. 5D            POP EBP
00416379  |. B8 01000000      MOV EAX,1
0041637E  |. 5B            POP EBX
0041637F  \. C3            RETN
==========================================================================================
下面简单分析(11)处的函数:
00416430  /$ 8B4424 08       MOV EAX,DWORD PTR SS:[ESP+8]               //取内存里的数到EAX。
00416434  |. 8BD0          MOV EDX,EAX                          //送EDX。
00416436  |. 8BC8          MOV ECX,EAX                          //送ECX。
00416438  |. C1FA 04        SAR EDX,4                            //EDX右移4次。
0041643B  |. 83E1 01        AND ECX,1                            //ECX与1相与。
0041643E  |. 83E2 02        AND EDX,2                            //EDX与2相与。
00416441  |. 0BCA          OR ECX,EDX                           //ECX与EDX相或。
00416443  |. 8B5424 04       MOV EDX,DWORD PTR SS:[ESP+4]               //取一数到EDX。
00416447  |. D1F8          SAR EAX,1                            //EAX右移1次。
00416449  |. 8D0C91         LEA ECX,DWORD PTR DS:[ECX+EDX*4]            //ECX=ECX+EDX*4,形成偏移量。
0041644C  |. 83E0 0F        AND EAX,0F                           //EAX与F相与。
0041644F  |. C1E1 04        SHL ECX,4                            //ECX左移4次。
00416452  |. 0FBE8401 A8ED4300  MOVSX EAX,BYTE PTR DS:[ECX+EAX+43EDA8]        //根据ECX,EAX取数到EAX。
0041645A  \. C3            RETN
==========================================================================================
后记:终于花费了2个小时才把这篇文章写定,感到这个软件的保护跟我以前碰到的一个软件类似,我一时记不起来了。中间产生好多&#39;0&#39;,&#39;1&#39;串,根据这些串形成注册码。对这个软件的评价不敢恭维。我不厌其烦的把主要代码贴出来,目的就是想说一个问题,不要看软件保护看起来很强大,有时跟纸老虎一样,虽然用了如此繁杂的步骤来产生一个注册码,最终没有逃脱被跟踪的厄运。我建议开发者多研究软件本身的功能,而不是用这些花架子来保护所谓的成果。该软件作者收取的注册费是人民币50元,收取外国人是$20。我觉得不值。

注册成功后,单击HELP内的ABOUT可以看到“This copy is licensed to: wanggang”,同时也显示在程序主窗口内。但是一旦注册成功,REGISTER命令不好用了,无法进行二次注册。另外,我用REGMON监视它,发现这个软件没有在注册表内或者文件内写入东西,真是纳闷!想修改为未注册也不可能了!!


随便给出我机器上的注册码:69844664-81238d99。


感谢您的支持和阅读!!浪费您宝贵时间!非常抱歉!!



qduwg

qduwg@163.com


2006年2月11日早ETHIOPIA
http://iittss.com/ kijs与牛人在一起不是有理由的让自己变懒,那是为了让视野更开阔

TOP

发新话题