题目:注册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日完稿
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)