题目:注册MP3制作大师“AltoMP3 Maker V3.1”(春节献礼)
软件功能:该软件可以从音乐CD内提取乐曲并编码为MP3格式,让你获得具有原音轨的声音质量,体积更加小巧的MP3。另外,支持WAV格式与MP3之间相互转换。未注册版本只可以提取前12个音轨。
工具:SOFTICE,PEID。
引子:现在是大年初二,国内都在欢天喜地过大年,我身处异国他乡,倍感孤单。恭祝各位坛友春节快乐!万事如意!大家都过年去了,好象看雪论坛这几天来得坛友也不多了。唉!“春节诚可贵,思乡价更高,若为破解故,二者皆可抛!”下面还是破解话题,写了这篇破文送给关心我的看雪斑竹和各位支持我的坛友们!算是春节贺礼吧!:)话说今天我安装了这个MP3制作工具,美国人写的东西,拿PEID查看没有加壳。安装后启动程序,在HELP菜单内点击Register,在对话框内输入用户名和注册码。比如:wanggang /654321。调出SICE,下断点bpx getwindowtexta,F5退出,点击Register按钮,被拦住。按F10键跟踪,我们来到如下代码处:

0042B281   > 8B86 E0000000  MOV EAX,DWORD PTR DS:[ESI+E0] //用户名地址送EAX。
0042B287   . 8DBE E0000000  LEA EDI,DWORD PTR DS:[ESI+E0] 
0042B28D   . 8B40 F8        MOV EAX,DWORD PTR DS:[EAX-8]
0042B290   . 85C0           TEST EAX,EAX
0042B292   . 75 28          JNZ SHORT ALTOMP3M.0042B2BC
*省去多行*
0042B2BC   > 8B8E E4000000  MOV ECX,DWORD PTR DS:[ESI+E4] //注册码地址送ECX。
0042B2C2   . 8DAE E4000000  LEA EBP,DWORD PTR DS:[ESI+E4]
0042B2C8   . 8B41 F8        MOV EAX,DWORD PTR DS:[ECX-8]
0042B2CB   . 85C0           TEST EAX,EAX
0042B2CD   . 75 52          JNZ SHORT ALTOMP3M.0042B321
*省去多行*
0042B321   > 8D4C24 14      LEA ECX,DWORD PTR SS:[ESP+14] 
0042B325   . E8 D6980200    CALL <JMP.&MFC42.#540>
0042B32A   . 8D4C24 10      LEA ECX,DWORD PTR SS:[ESP+10]
0042B32E   . C74424 28 0000>MOV DWORD PTR SS:[ESP+28],0
0042B336   . E8 C5980200    CALL <JMP.&MFC42.#540>   
0042B33B   . 51             PUSH ECX
0042B33C   . 885C24 2C      MOV BYTE PTR SS:[ESP+2C],BL
0042B340   . 8BCC           MOV ECX,ESP
0042B342   . 896424 20      MOV DWORD PTR SS:[ESP+20],ESP
0042B346   . 57             PUSH EDI
0042B347   . E8 A2980200    CALL <JMP.&MFC42.#535>
0042B34C   . 8D4C24 20      LEA ECX,DWORD PTR SS:[ESP+20]
0042B350   . 51             PUSH ECX
0042B351   . E8 DA92FEFF    CALL ALTOMP3M.00414630     //复制密码表及用户名。后面分析。(*)
0042B356   . 83C4 08        ADD ESP,8
0042B359   . 50             PUSH EAX
0042B35A   . 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
0042B35E   . C64424 2C 02   MOV BYTE PTR SS:[ESP+2C],2
0042B363   . E8 3A990200    CALL <JMP.&MFC42.#858>     //生成一个16字节的新串。
0042B368   . 8D4C24 1C      LEA ECX,DWORD PTR SS:[ESP+1C]
*省去多行*
0042B3B2   . 8BF5           MOV ESI,EBP
0042B3B4   > 8A10           MOV DL,BYTE PTR DS:[EAX]    //从这里开始到0042B3D6处,循环比较假码与真码了。
0042B3B6   . 8A1E           MOV BL,BYTE PTR DS:[ESI]    //真码送DL,假码送BL 。
0042B3B8   . 8ACA           MOV CL,DL
0042B3BA   . 3AD3           CMP DL,BL                   //真假比较。
0042B3BC   . 75 1E          JNZ SHORT ALTOMP3M.0042B3DC //如果不相同则OVER。 
0042B3BE   . 84C9           TEST CL,CL
0042B3C0   . 74 16          JE SHORT ALTOMP3M.0042B3D8
0042B3C2   . 8A50 01        MOV DL,BYTE PTR DS:[EAX+1]
0042B3C5   . 8A5E 01        MOV BL,BYTE PTR DS:[ESI+1]
0042B3C8   . 8ACA           MOV CL,DL
0042B3CA   . 3AD3           CMP DL,BL
0042B3CC   . 75 0E          JNZ SHORT ALTOMP3M.0042B3DC
0042B3CE   . 83C0 02        ADD EAX,2
0042B3D1   . 83C6 02        ADD ESI,2
0042B3D4   . 84C9           TEST CL,CL
0042B3D6   .^75 DC          JNZ SHORT ALTOMP3M.0042B3B4  // 未完则继续循环。一道循环比较2个字节。
*省去多行*
0042B481   . 8B07           MOV EAX,DWORD PTR DS:[EDI]   //用户名地址送EAX。
0042B483   . 8B35 D8B04500  MOV ESI,DWORD PTR DS:[<&KERNEL32.WritePr>  //写入文件。
0042B489   . 68 DCA74600    PUSH ALTOMP3M.0046A7DC
0042B48E   . 50             PUSH EAX
*略去多行*
0042B4E5   . 5B             POP EBX
0042B4E6   . 83C4 1C        ADD ESP,1C
0042B4E9   . C3             RETN     //这里返回到下面代码处。
*******返回到这里*********
00439E35   . E8 88AC0100    CALL <JMP.&MFC42.#2514>
00439E3A   . 83F8 01        CMP EAX,1                    //EAX为成功标志,如果为0则OVER。
00439E3D   . 75 0E          JNZ SHORT ALTOMP3M.00439E4D  //这里不跳才行。
00439E3F   . 6A FF          PUSH -1
00439E41   . 6A 00          PUSH 0
00439E43   . 68 66E10000    PUSH 0E166
00439E48   . E8 C1B10100    CALL <JMP.&MFC42.#1199>       //显示成功注册信息框。
00439E4D   > 8D8C24 E400000>LEA ECX,DWORD PTR SS:[ESP+E4]
==================================================================
下面分析0042B351处的函数 CALL ALTOMP3M.00414630:
00414630  /$ 6A FF          PUSH -1
00414632  |. 68 92624500    PUSH ALTOMP3M.00456292
00414637  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0041463D  |. 50             PUSH EAX
0041463E  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
00414645  |. 81EC DC010000  SUB ESP,1DC
0041464B  |. 53             PUSH EBX
0041464C  |. 55             PUSH EBP
0041464D  |. 33DB           XOR EBX,EBX
0041464F  |. 56             PUSH ESI
00414650  |. 57             PUSH EDI
00414651  |. 895C24 10      MOV DWORD PTR SS:[ESP+10],EBX
00414655  |. B9 0D000000    MOV ECX,0D
0041465A  |. BE 448C4600    MOV ESI,ALTOMP3M.00468C44
0041465F  |. 8DBC24 AC00000>LEA EDI,DWORD PTR SS:[ESP+AC]
00414666  |. 8B8424 0002000>MOV EAX,DWORD PTR SS:[ESP+200]
0041466D  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0041466F  |. A4             MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00414670  |. B9 0D000000    MOV ECX,0D
00414675  |. BE 108C4600    MOV ESI,ALTOMP3M.00468C10
0041467A  |. 8D7C24 78      LEA EDI,DWORD PTR SS:[ESP+78]
0041467E  |. 6A 64          PUSH 64
00414680  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00414682  |. B9 0F000000    MOV ECX,0F
00414687  |. BE D08B4600    MOV ESI,ALTOMP3M.00468BD0
0041468C  |. 8DBC24 E800000>LEA EDI,DWORD PTR SS:[ESP+E8]
00414693  |. 8B68 F8        MOV EBP,DWORD PTR DS:[EAX-8]
00414696  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00414698  |. 66:A5          MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
0041469A  |. A4             MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0041469B  |. B9 19000000    MOV ECX,19
004146A0  |. 33C0           XOR EAX,EAX
004146A2  |. 8DBC24 2801000>LEA EDI,DWORD PTR SS:[ESP+128]
004146A9  |. C78424 F801000>MOV DWORD PTR SS:[ESP+1F8],1
004146B4  |. F3:AB          REP STOS DWORD PTR ES:[EDI]           //在此行之前的代码复制密码表。
004146B6  |. 8D8C24 0402000>LEA ECX,DWORD PTR SS:[ESP+204]        //用户名地址。
004146BD  |. E8 DC060400    CALL <JMP.&MFC42.#2915>       
004146C2  |. 8BCD           MOV ECX,EBP
004146C4  |. 8BF0           MOV ESI,EAX
004146C6  |. 8BD1           MOV EDX,ECX
004146C8  |. 8D7C24 78      LEA EDI,DWORD PTR SS:[ESP+78]
004146CC  |. C1E9 02        SHR ECX,2
004146CF  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]  //复制用户名到密码表前面。
004146D1  |. 8BCA           MOV ECX,EDX
004146D3  |. 83E1 03        AND ECX,3
004146D6  |. 83FD 08        CMP EBP,8
004146D9  |. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
004146DB  |. 7F 27          JG SHORT ALTOMP3M.00414704
004146DD  |. 6A 64          PUSH 64
004146DF  |. 8D8C24 0402000>LEA ECX,DWORD PTR SS:[ESP+204]
004146E6  |. E8 B3060400    CALL <JMP.&MFC42.#2915>
004146EB  |. 8BCD           MOV ECX,EBP
004146ED  |. 8BF0           MOV ESI,EAX
004146EF  |. 8BC1           MOV EAX,ECX
004146F1  |. 8DBC24 8100000>LEA EDI,DWORD PTR SS:[ESP+81]
004146F8  |. C1E9 02        SHR ECX,2
004146FB  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] //再次复制用户名到密码表前面。
004146FD  |. 8BC8           MOV ECX,EAX
004146FF  |. 83E1 03        AND ECX,3
00414702  |. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00414704  |> 8BC5           MOV EAX,EBP
00414706  |. 99             CDQ
00414707  |. 83E2 07        AND EDX,7
0041470A  |. 03C2           ADD EAX,EDX
0041470C  |. 8BF0           MOV ESI,EAX
0041470E  |. C1FE 03        SAR ESI,3
00414711  |. 46             INC ESI
00414712  |. 83FE 01        CMP ESI,1
00414715  |. 75 05          JNZ SHORT ALTOMP3M.0041471C
00414717  |. BE 02000000    MOV ESI,2                               //循环次数送ESI。
0041471C  |> 33FF           XOR EDI,EDI
0041471E  |. 3BF3           CMP ESI,EBX
00414720  |. 7E 22          JLE SHORT ALTOMP3M.00414744
00414722  |> 8D8CFC 2401000>/LEA ECX,DWORD PTR SS:[ESP+EDI*8+124]   //循环开始。
00414729  |. 8D94FC AC00000>|LEA EDX,DWORD PTR SS:[ESP+EDI*8+AC]
00414730  |. 51             |PUSH ECX
00414731  |. 8D44FC 7C      |LEA EAX,DWORD PTR SS:[ESP+EDI*8+7C]
00414735  |. 52             |PUSH EDX
00414736  |. 50             |PUSH EAX
00414737  |. E8 44E2FFFF    |CALL ALTOMP3M.00412980                 //这个函数关键地方。(**)
0041473C  |. 83C4 0C        |ADD ESP,0C
0041473F  |. 47             |INC EDI
00414740  |. 3BFE           |CMP EDI,ESI                            //比较是否到2。
00414742  |.^7C DE          \JL SHORT ALTOMP3M.00414722  //未完继续,总共2遍。循环结束得到16个字节的数。下面用到他们。
00414744  |> C1E6 03        SHL ESI,3                                //循环变量初始化为16。下面循环用到。
00414747  |. 33C9           XOR ECX,ECX
00414749  |. 3BF3           CMP ESI,EBX
0041474B  |. 7E 24          JLE SHORT ALTOMP3M.00414771
0041474D  |> 33C0           /XOR EAX,EAX                            //循环开始。
0041474F  |. BF 3E000000    |MOV EDI,3E                             //除数为3E。
00414754  |. 8A840C 2401000>|MOV AL,BYTE PTR SS:[ESP+ECX+124]       //依次取上述16个字节的数值送AL。
0041475B  |. 99             |CDQ     
0041475C  |. F7FF           |IDIV EDI                               //除以EDI。
0041475E  |. 41             |INC ECX
0041475F  |. 3BCE           |CMP ECX,ESI                            //比较是否到16次。
00414761  |. 8A9414 E400000>|MOV DL,BYTE PTR SS:[ESP+EDX+E4]        //查密码表得到一个数送DL。
00414768  |. 88940C 8701000>|MOV BYTE PTR SS:[ESP+ECX+187],DL       //DL结果保存。
0041476F  |.^7C DC          \JL SHORT ALTOMP3M.0041474D             //未完继续。循环结束后得到16个字符组成的串。
00414771  |> 889C0C 8801000>MOV BYTE PTR SS:[ESP+ECX+188],BL  
00414778  |. B9 19000000    MOV ECX,19
0041477D  |. B8 38383838    MOV EAX,38383838
00414782  |. 8D7C24 14      LEA EDI,DWORD PTR SS:[ESP+14]
00414786  |. 3BF3           CMP ESI,EBX
00414788  |. F3:AB          REP STOS DWORD PTR ES:[EDI]
0041478A  |. 7E 1B          JLE SHORT ALTOMP3M.004147A7
*略去几行*
004147A7  |> 885C24 1E      MOV BYTE PTR SS:[ESP+1E],BL             //把第11位字符换成0,余下的11位以后的字符放弃不用。
004147AB  |. 33C0           XOR EAX,EAX
004147AD  |> 8A5404 14      /MOV DL,BYTE PTR SS:[ESP+EAX+14]        //下面这个循环把得到的10位字符串前5位与后5位交换位置。
004147B1  |. 8A4C04 19      |MOV CL,BYTE PTR SS:[ESP+EAX+19]
004147B5  |. 885404 19      |MOV BYTE PTR SS:[ESP+EAX+19],DL
004147B9  |. 884C04 14      |MOV BYTE PTR SS:[ESP+EAX+14],CL
004147BD  |. 40             |INC EAX
004147BE  |. 83F8 05        |CMP EAX,5
004147C1  |.^7C EA          \JL SHORT ALTOMP3M.004147AD             //循环5次。
004147C3  |. E8 2C070400    CALL <JMP.&MFC42.#1158>
004147C8  |. 8BB424 FC01000>MOV ESI,DWORD PTR SS:[ESP+1FC]
004147CF  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
004147D1  |. 8D4C24 14      LEA ECX,DWORD PTR SS:[ESP+14]
004147D5  |. 51             PUSH ECX
004147D6  |. 8BCE           MOV ECX,ESI
004147D8  |. 8906           MOV DWORD PTR DS:[ESI],EAX
004147DA  |. E8 15040400    CALL <JMP.&MFC42.#860>                //求新串串长,并复制到另外一个地方。
004147DF  |. C74424 10 0100>MOV DWORD PTR SS:[ESP+10],1
004147E7  |. 8D8C24 0002000>LEA ECX,DWORD PTR SS:[ESP+200]
004147EE  |. 889C24 F401000>MOV BYTE PTR SS:[ESP+1F4],BL
004147F5  |. E8 EE030400    CALL <JMP.&MFC42.#800>
004147FA  |. 8B8C24 EC01000>MOV ECX,DWORD PTR SS:[ESP+1EC]
00414801  |. 8BC6           MOV EAX,ESI
00414803  |. 5F             POP EDI
00414804  |. 5E             POP ESI
00414805  |. 5D             POP EBP
00414806  |. 5B             POP EBX
00414807  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
0041480E  |. 81C4 E8010000  ADD ESP,1E8
00414814  \. C3             RETN
======================================================================
下面分析00414737 CALL ALTOMP3M.00412980  :--------(**)
00412980  /$ 81EC D8050000  SUB ESP,5D8
00412986  |. 53             PUSH EBX
00412987  |. 55             PUSH EBP
00412988  |. 56             PUSH ESI
00412989  |. 57             PUSH EDI
0041298A  |. BD 19000000    MOV EBP,19
0041298F  |. BB 11000000    MOV EBX,11
00412994  |. BF 09000000    MOV EDI,9
00412999  |. BE 01000000    MOV ESI,1
0041299E  |. BA 1D000000    MOV EDX,1D
004129A3  |. B9 15000000    MOV ECX,15
004129A8  |. B8 0D000000    MOV EAX,0D
*省去1900多行*
00413122  |. E8 49F2FFFF    CALL ALTOMP3M.00412370
00413127  |. 8B8424 F405000>MOV EAX,DWORD PTR SS:[ESP+5F4]
0041312E  |. 8D9424 A803000>LEA EDX,DWORD PTR SS:[ESP+3A8]
00413135  |. 52             PUSH EDX
00413136  |. 50             PUSH EAX
00413137  |. E8 94F1FFFF    CALL ALTOMP3M.004122D0            //根据用户名ASSIC码进行拆解为'0','1'串。
0041313C  |. 83C4 10        ADD ESP,10
0041313F  |. 33C0           XOR EAX,EAX
00413141  |. 8DB424 D801000>LEA ESI,DWORD PTR SS:[ESP+1D8]
00413148  |> 8B0E           /MOV ECX,DWORD PTR DS:[ESI]
0041314A  |. 40             |INC EAX
0041314B  |. 83C6 04        |ADD ESI,4
0041314E  |. 83F8 3F        |CMP EAX,3F
00413151  |. 8A940C 9F03000>|MOV DL,BYTE PTR SS:[ESP+ECX+39F]
00413158  |. 889404 5F04000>|MOV BYTE PTR SS:[ESP+EAX+45F],DL
0041315F  |.^7E E7          \JLE SHORT ALTOMP3M.00413148
00413161  |. 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
00413165  |. 8D8C24 6004000>LEA ECX,DWORD PTR SS:[ESP+460]
0041316C  |. 50             PUSH EAX
0041316D  |. 51             PUSH ECX
0041316E  |. E8 5DEDFFFF    CALL ALTOMP3M.00411ED0           //根据前面拆解得到的'0','1'串进行一系列“或”运算,得到8字节数。
00413173  |. 8B4424 1C      MOV EAX,DWORD PTR SS:[ESP+1C]    //高4字节送EAX。
00413177  |. 8B5424 18      MOV EDX,DWORD PTR SS:[ESP+18]    //低4字节送EDX。
0041317B  |. 83C4 08        ADD ESP,8
0041317E  |. 898424 D802000>MOV DWORD PTR SS:[ESP+2D8],EAX
00413185  |. 899424 E004000>MOV DWORD PTR SS:[ESP+4E0],EDX
0041318C  |. 33C0           XOR EAX,EAX
0041318E  |> 40             /INC EAX
0041318F  |. 8D48 04        |LEA ECX,DWORD PTR DS:[EAX+4]
00413192  |. 83F9 07        |CMP ECX,7
00413195  |.^7E F7          \JLE SHORT ALTOMP3M.0041318E
00413197  |. 33ED           XOR EBP,EBP
00413199  |> 8B842C D802000>/MOV EAX,DWORD PTR SS:[ESP+EBP+2D8]  //高4字节送EAX。这里是循环开始,总共15次。
004131A0  |. 8DB42C D802000>|LEA ESI,DWORD PTR SS:[ESP+EBP+2D8]
004131A7  |. 8D8C24 2004000>|LEA ECX,DWORD PTR SS:[ESP+420]
004131AE  |. 8D942C E804000>|LEA EDX,DWORD PTR SS:[ESP+EBP+4E8]
004131B5  |. 51             |PUSH ECX
004131B6  |. 56             |PUSH ESI
004131B7  |. 8902           |MOV DWORD PTR DS:[EDX],EAX
004131B9  |. E8 12F1FFFF    |CALL ALTOMP3M.004122D0             //对高4字节进行拆解,获得一串'0','1'。
004131BE  |. 83C4 08        |ADD ESP,8
004131C1  |. 33C0           |XOR EAX,EAX
004131C3  |. 8D7C24 18      |LEA EDI,DWORD PTR SS:[ESP+18]
004131C7  |> 8B17           |/MOV EDX,DWORD PTR DS:[EDI]        //下面这个循环复制得到的'0','1'串。
004131C9  |. 40             ||INC EAX
004131CA  |. 83C7 04        ||ADD EDI,4
004131CD  |. 83F8 2F        ||CMP EAX,2F
004131D0  |. 8A8C14 1F04000>||MOV CL,BYTE PTR SS:[ESP+EDX+41F]
004131D7  |. 888C04 9F04000>||MOV BYTE PTR SS:[ESP+EAX+49F],CL
004131DE  |.^7E E7          |\JLE SHORT ALTOMP3M.004131C7
004131E0  |. 8D9424 A004000>|LEA EDX,DWORD PTR SS:[ESP+4A0]
004131E7  |. 56             |PUSH ESI
004131E8  |. 52             |PUSH EDX
004131E9  |. E8 E2ECFFFF    |CALL ALTOMP3M.00411ED0     //根据前面拆解得到的'0','1'串进行一系列“或”运算,得到8字节数。
004131EE  |. 83C4 08        |ADD ESP,8
004131F1  |. 33C0           |XOR EAX,EAX
004131F3  |> 8D0C28         |/LEA ECX,DWORD PTR DS:[EAX+EBP]
004131F6  |. 8D1428         ||LEA EDX,DWORD PTR DS:[EAX+EBP]
004131F9  |. 8DBC0C D802000>||LEA EDI,DWORD PTR SS:[ESP+ECX+2D8]  //第二次运算所得结果地址送EDI。
00413200  |. 8A8C14 6805000>||MOV CL,BYTE PTR SS:[ESP+EDX+568]    //一个6字节常数逐位送CL。
00413207  |. 8A17           ||MOV DL,BYTE PTR DS:[EDI]            //得到的6字节结果逐位送DL。
00413209  |. 32D1           ||XOR DL,CL                           //异或运算结果送DL。
0041320B  |. 40             ||INC EAX
0041320C  |. 83F8 05        ||CMP EAX,5
0041320F  |. 8817           ||MOV BYTE PTR DS:[EDI],DL           //DL保存。
00413211  |.^7E E0          |\JLE SHORT ALTOMP3M.004131F3        //未完继续。
00413213  |. 56             |PUSH ESI
00413214  |. E8 A7000000    |CALL ALTOMP3M.004132C0               //该函数得到4字节结果。
00413219  |. 8D9424 DC02000>|LEA EDX,DWORD PTR SS:[ESP+2DC]
00413220  |. 83C4 04        |ADD ESP,4
00413223  |. 33C0           |XOR EAX,EAX
00413225  |. 2BF2           |SUB ESI,EDX
00413227  |> 8D0C06         |/LEA ECX,DWORD PTR DS:[ESI+EAX]
0041322A  |. 8D1406         ||LEA EDX,DWORD PTR DS:[ESI+EAX]
0041322D  |. 8A8C0C D802000>||MOV CL,BYTE PTR SS:[ESP+ECX+2D8]
00413234  |. 328C14 E004000>||XOR CL,BYTE PTR SS:[ESP+EDX+4E0]
0041323B  |. 8D1406         ||LEA EDX,DWORD PTR DS:[ESI+EAX]
0041323E  |. 40             ||INC EAX
0041323F  |. 83F8 03        ||CMP EAX,3
00413242  |. 888C14 E002000>||MOV BYTE PTR SS:[ESP+EDX+2E0],CL
00413249  |.^7E DC          |\JLE SHORT ALTOMP3M.00413227
0041324B  |. 83C5 08        |ADD EBP,8                            //循环步长为8。
0041324E  |. 83FD 78        |CMP EBP,78                           //与78比较。
00413251  |.^0F8E 42FFFFFF  \JLE ALTOMP3M.00413199                //总共循环15次。
00413257  |. 8BB424 F405000>MOV ESI,DWORD PTR SS:[ESP+5F4]
0041325E  |. 8B8424 5803000>MOV EAX,DWORD PTR SS:[ESP+358]
00413265  |. 8B8C24 6005000>MOV ECX,DWORD PTR SS:[ESP+560]
0041326C  |. 8D9424 E003000>LEA EDX,DWORD PTR SS:[ESP+3E0]
00413273  |. 52             PUSH EDX
00413274  |. 8906           MOV DWORD PTR DS:[ESI],EAX
00413276  |. 56             PUSH ESI
00413277  |. 894E 04        MOV DWORD PTR DS:[ESI+4],ECX
0041327A  |. E8 51F0FFFF    CALL ALTOMP3M.004122D0               //对高4字节进行拆解,获得一串'0','1'。
0041327F  |. 83C4 08        ADD ESP,8
00413282  |. 8D8424 D800000>LEA EAX,DWORD PTR SS:[ESP+D8]
00413289  |> 8B08           /MOV ECX,DWORD PTR DS:[EAX]
0041328B  |. 43             |INC EBX
0041328C  |. 83C0 04        |ADD EAX,4
0041328F  |. 83FB 3F        |CMP EBX,3F       //循环次数3F。
00413292  |. 8A940C DF03000>|MOV DL,BYTE PTR SS:[ESP+ECX+3DF]    //挑选指定数值送DL。
00413299  |. 88941C 5F03000>|MOV BYTE PTR SS:[ESP+EBX+35F],DL    //DL值送指定内存。
004132A0  |.^7E E7          \JLE SHORT ALTOMP3M.00413289   
004132A2  |. 8D8424 6003000>LEA EAX,DWORD PTR SS:[ESP+360]
004132A9  |. 56             PUSH ESI
004132AA  |. 50             PUSH EAX
004132AB  |. E8 20ECFFFF    CALL ALTOMP3M.00411ED0               //把得到的'0','1'串,重新构造一个8字节数。
004132B0  |. 83C4 08        ADD ESP,8
004132B3  |. 5F             POP EDI
004132B4  |. 5E             POP ESI
004132B5  |. 5D             POP EBP
004132B6  |. 5B             POP EBX
004132B7  |. 81C4 D8050000  ADD ESP,5D8
004132BD  \. C3             RETN
==================================================================================
后记:
这个软件的注册码计算过程跟我以前跟踪的一个MP3制作工具非常相似,也是用大量的指令构造密码表,不过这个软件更复杂些。因为对用户名的计算强度非常大,而且都是根据字符ASSCI码进行大量“或”运算,从而获取一个'0','1'串,然后再把这个串加工为8字节的数。翻来覆去循环了15次。计算强度还是比较大的。但是最后这个软件还是用明码比较,所以我认为其保护“功亏一篑”,形同于无。跟踪了1个小时,然后用1个小时写出此破文,注册机就不写了,相信比较麻烦。感兴趣的坛友可以找这个软件试试。:)再次向各位支持的坛友和大侠表示衷心的感谢!祝看雪论坛越来越热!!祝各位技术进步!

结论:
Name: wanggang
Code: 8282994716  (这个CODE的中间形式是9471682829796741,舍掉了后6位,然后前5位与后5位交换位置)

另外,此软件在Windows目录下生成文件Regkeycr.ini,里面放着你的注册信息,明码形式。如果修改了里面的信息,则变为未注册的。


感谢您的阅读!

Qduwg
qduwg@163.com

2006年1月29日完稿