EZ MP3 Recorder 1.15 註冊演算法分析 (14千字)

看雪資料發表於2015-11-15

標 題:EZ MP3 Recorder 1.15 註冊演算法分析 (14千字)

發信人:炎之川

時 間:2003-4-6 22:07:16

詳細資訊:



EZ MP3 Recorder 1.15 註冊演算法分析

破解目標:EZ MP3 Recorder 1.15
官方主頁:http://www.topmp3soft.com
軟體簡介:錄音軟體,可以把電腦中透過音效卡播放的聲音錄製為 WAV 或 MP3 格式。
下載地址:http://www.topmp3soft.com/mp3recorder.exe

使用工具:PEiD 0.8、W32Dasm、Ollydbg、Windows 自帶的計算器、32bit Calculator 1.6 by cybult、UltraEdit

作者:炎之川
時間:2003.4.3
主頁:http://skipli.yeah.net/


宣告: 此文僅用於學習及交流,若要轉載請保持文章完整。


經 PEiD 0.8 檢查可知,EZ MP3 Recorder 的主程式為 VC++ 6.0 編寫且無殼,程式要求重啟驗證註冊碼。輸入的註冊碼儲存在登錄檔中。

在 XP 下用 OD 除錯,試了在 OD 中下 bpx regqueryvalueexa 斷點,雖然可以攔住,但是軟體似乎還要從登錄檔中讀取一些設定資訊,所以要按 F9 很多次才能攔到我們需要的地方,稍顯麻煩。

經過分析發現,軟體將輸入的註冊名和假註冊名寫入登錄檔中,鍵值名稱為 RegCode,嘗試試驗 W32Dasm 反彙編,在反彙編程式碼中果然找到了這個字串,所以在對應的地方下斷點,重新執行程式,被 OD 斷下(你需要先輸入註冊名和假註冊碼,我輸入Name: lovefire,S/N: 78787878)

(; 後是 Ollydbg 所分析的內容,// 後是我加的註釋,文中數值均為16進位制值)

00407C06  . 68 94674500    PUSH Mp3Recor.00456794
00407C0B  . 68 40324500    PUSH Mp3Recor.00453240                  ;  ASCII "RegCode"  //斷點下在這裡
00407C10  . 8D5424 20      LEA EDX,DWORD PTR SS:[ESP+20]
00407C14  . 68 48324500    PUSH Mp3Recor.00453248                  ;  ASCII "RegInfo"
00407C19  . 52            PUSH EDX
00407C1A  . 8BCE          MOV ECX,ESI
00407C1C  . E8 D54D0300    CALL Mp3Recor.0043C9F6
00407C21  . 50            PUSH EAX
00407C22  . 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
00407C26  . C68424 7403000>MOV BYTE PTR SS:[ESP+374],4
00407C2E  . E8 EB600200    CALL Mp3Recor.0042DD1E
00407C33  . 889C24 7003000>MOV BYTE PTR SS:[ESP+370],BL
00407C3A  . 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
00407C3E  . E8 A25F0200    CALL Mp3Recor.0042DBE5
00407C43  . 51            PUSH ECX
00407C44  . 8D4424 18      LEA EAX,DWORD PTR SS:[ESP+18]
00407C48  . 8BCC          MOV ECX,ESP
00407C4A  . 896424 10      MOV DWORD PTR SS:[ESP+10],ESP
00407C4E  . 50            PUSH EAX
00407C4F  . E8 065D0200    CALL Mp3Recor.0042D95A
00407C54  . 51            PUSH ECX
00407C55  . 8D5424 18      LEA EDX,DWORD PTR SS:[ESP+18]
00407C59  . 8BCC          MOV ECX,ESP
00407C5B  . 896424 24      MOV DWORD PTR SS:[ESP+24],ESP
00407C5F  . 52            PUSH EDX
00407C60  . C68424 7C03000>MOV BYTE PTR SS:[ESP+37C],5
00407C68  . E8 ED5C0200    CALL Mp3Recor.0042D95A  //關鍵call㈠,檢查是否已存在註冊名,如果已存在,則繼續驗證
00407C6D  . 8BCE          MOV ECX,ESI                              ; |
00407C6F  . 889C24 7803000>MOV BYTE PTR SS:[ESP+378],BL            ; |
00407C76  . E8 75040000    CALL Mp3Recor.004080F0                  ; \Mp3Recor.004080F0  //關鍵call㈡,註冊碼計算
00407C7B  . 68 34324500    PUSH Mp3Recor.00453234                  ;  ASCII "help.chm"
00407C80  . 8986 E0000000  MOV DWORD PTR DS:[ESI+E0],EAX
00407C86  . E8 79160100    CALL Mp3Recor.00419304
00407C8B  . 83C4 04        ADD ESP,4
00407C8E  . 8D4C24 20      LEA ECX,DWORD PTR SS:[ESP+20]
00407C92  . 8986 8C000000  MOV DWORD PTR DS:[ESI+8C],EAX
00407C98  . 6A 00          PUSH 0
00407C9A  . E8 91080000    CALL Mp3Recor.00408530
00407C9F  . 8D4424 20      LEA EAX,DWORD PTR SS:[ESP+20]
00407CA3  . 8D4C24 20      LEA ECX,DWORD PTR SS:[ESP+20]
00407CA7  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],6
00407CAF  . 8946 1C        MOV DWORD PTR DS:[ESI+1C],EAX
00407CB2  . E8 94AB0200    CALL Mp3Recor.0043284B
00407CB7  . 8D8C24 1402000>LEA ECX,DWORD PTR SS:[ESP+214]
00407CBE  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],0B
00407CC6  . E8 15F3FFFF    CALL Mp3Recor.00406FE0
00407CCB  . 8D8C24 C801000>LEA ECX,DWORD PTR SS:[ESP+1C8]
00407CD2  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],0A
00407CDA  . E8 01F3FFFF    CALL Mp3Recor.00406FE0
00407CDF  . 8D8C24 2801000>LEA ECX,DWORD PTR SS:[ESP+128]
00407CE6  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],9
00407CEE  . E8 D43D0300    CALL Mp3Recor.0043BAC7
00407CF3  . 8D8C24 CC00000>LEA ECX,DWORD PTR SS:[ESP+CC]
00407CFA  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],8
00407D02  . E8 D999FFFF    CALL Mp3Recor.004016E0
00407D07  . 8D8C24 9000000>LEA ECX,DWORD PTR SS:[ESP+90]
00407D0E  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],7
00407D16  . E8 2F450200    CALL Mp3Recor.0042C24A
00407D1B  . 8D4C24 20      LEA ECX,DWORD PTR SS:[ESP+20]
00407D1F  . 889C24 7003000>MOV BYTE PTR SS:[ESP+370],BL
00407D26  . E8 F3A70200    CALL Mp3Recor.0043251E
00407D2B  . 8D4C24 14      LEA ECX,DWORD PTR SS:[ESP+14]
00407D2F  . C68424 7003000>MOV BYTE PTR SS:[ESP+370],1
00407D37  . E8 A95E0200    CALL Mp3Recor.0042DBE5
00407D3C  . 8D4C24 10      LEA ECX,DWORD PTR SS:[ESP+10]
00407D40  . 89BC24 7003000>MOV DWORD PTR SS:[ESP+370],EDI
00407D47  . E8 995E0200    CALL Mp3Recor.0042DBE5
00407D4C  . 8B8C24 6803000>MOV ECX,DWORD PTR SS:[ESP+368]
00407D53  . 5F            POP EDI
00407D54  . 5E            POP ESI
00407D55  . 33C0          XOR EAX,EAX
00407D57  . 64:890D 000000>MOV DWORD PTR FS:[0],ECX
00407D5E  . 5B            POP EBX
00407D5F  . 81C4 68030000  ADD ESP,368
00407D65  . C3            RETN


------------------------------------------------------------------
進入 407C68 的關鍵call㈠

0042D95A  /$ 56            PUSH ESI
0042D95B  |. 8BF1          MOV ESI,ECX
0042D95D  |. 8B4C24 08      MOV ECX,DWORD PTR SS:[ESP+8]
0042D961  |. 8B01          MOV EAX,DWORD PTR DS:[ECX//註冊名放入eax
0042D963  |. 8378 F4 00    CMP DWORD PTR DS:[EAX-C],0  //比較註冊名長度是否為0,即是否已有註冊名
0042D967  |. 7C 0E          JL SHORT Mp3Recor.0042D977  //登錄檔中沒有註冊名則跳
0042D969  |. 8906          MOV DWORD PTR DS:[ESI],EAX
0042D96B  |. 83C0 F4        ADD EAX,-0C
0042D96E  |. 50            PUSH EAX                                ; /pVar
0042D96F  |. FF15 8C334400  CALL DWORD PTR DS:[<&KERNEL32.Interlocke>; \InterlockedIncrement
0042D975  |. EB 10          JMP SHORT Mp3Recor.0042D987
0042D977  |> A1 803A4500    MOV EAX,DWORD PTR DS:[453A80]
0042D97C  |. 8906          MOV DWORD PTR DS:[ESI],EAX
0042D97E  |. FF31          PUSH DWORD PTR DS:[ECX]
0042D980  |. 8BCE          MOV ECX,ESI
0042D982  |. E8 E7030000    CALL Mp3Recor.0042DD6E
0042D987  |> 8BC6          MOV EAX,ESI
0042D989  |. 5E            POP ESI
0042D98A  \. C2 0400        RETN 4


------------------------------------------------------------------
進入 407C76 的關鍵call㈡

004080F0  /$ 6A FF          PUSH -1
004080F2  |. 68 E0004400    PUSH Mp3Recor.004400E0                  ;  SE handler installation
004080F7  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004080FD  |. 50            PUSH EAX
004080FE  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
00408105  |. 81EC D4000000  SUB ESP,0D4
0040810B  |. 53            PUSH EBX
0040810C  |. 33DB          XOR EBX,EBX
0040810E  |. 899C24 E000000>MOV DWORD PTR SS:[ESP+E0],EBX
00408115  |. 8B8424 E800000>MOV EAX,DWORD PTR SS:[ESP+E8]  //註冊名放入eax
0040811C  |. 68 94674500    PUSH Mp3Recor.00456794                  ; /Arg2 = 00456794
00408121  |. 50            PUSH EAX                                ; |Arg1
00408122  |. C781 E4000000 >MOV DWORD PTR DS:[ECX+E4],1              ; |
0040812C  |. E8 24110100    CALL Mp3Recor.00419255                  ; \Mp3Recor.00419255
00408131  |. 83C4 08        ADD ESP,8
00408134  |. 85C0          TEST EAX,EAX
00408136  |. 0F84 19010000  JE Mp3Recor.00408255
0040813C  |. 8B8C24 EC00000>MOV ECX,DWORD PTR SS:[ESP+EC]  //假碼放入ecx
00408143  |. 68 94674500    PUSH Mp3Recor.00456794                  ; /Arg2 = 00456794
00408148  |. 51            PUSH ECX                                ; |Arg1  //假碼入棧
00408149  |. E8 07110100    CALL Mp3Recor.00419255                  ; \Mp3Recor.00419255
0040814E  |. 83C4 08        ADD ESP,8
00408151  |. 85C0          TEST EAX,EAX
00408153  |. 0F84 FC000000  JE Mp3Recor.00408255
00408159  |. 55            PUSH EBP
0040815A  |. 8BAC24 EC00000>MOV EBP,DWORD PTR SS:[ESP+EC]
00408161  |. 56            PUSH ESI
00408162  |. B0 72          MOV AL,72  //al=72
00408164  |. 8B75 F8        MOV ESI,DWORD PTR SS:[EBP-8]  //註冊名長度送 esi
00408167  |. 33C9          XOR ECX,ECX  //ecx清零,做記數器
00408169  |. 3BF3          CMP ESI,EBX

0040816B  |. C64424 0C 6D  MOV BYTE PTR SS:[ESP+C],6D  //6D = m
00408170  |. C64424 0D 70  MOV BYTE PTR SS:[ESP+D],70  //70 = p
00408175  |. C64424 0E 33  MOV BYTE PTR SS:[ESP+E],33  //33 = 3
0040817A  |. 884424 0F      MOV BYTE PTR SS:[ESP+F],AL  //AL = 72 = r
0040817E  |. C64424 10 65  MOV BYTE PTR SS:[ESP+10],65  //65 = e
00408183  |. C64424 11 63  MOV BYTE PTR SS:[ESP+11],63  //63 = c
00408188  |. C64424 12 6F  MOV BYTE PTR SS:[ESP+12],6F  //6F = o
0040818D  |. 884424 13      MOV BYTE PTR SS:[ESP+13],AL  //AL = 72 = r
00408191  |. 885C24 14      MOV BYTE PTR SS:[ESP+14],BL  //BL = 0,這句無用途?
//以上程式碼是在 [ESP+C] 開始,依次放入 mp3recor 這個字串

00408195  |. 7E 3D          JLE SHORT Mp3Recor.004081D4
00408197  |. 57            PUSH EDI
00408198  |. 8D7C34 1B      LEA EDI,DWORD PTR SS:[ESP+ESI+1B]

//迴圈運算開始
0040819C  |> 8A0429        /MOV AL,BYTE PTR DS:[ECX+EBP//逐位取註冊名的ASCII值,並放入 al
0040819F  |. 8BD1          |MOV EDX,ECX  //edx=ecx
004081A1  |. 81E2 07000080  |AND EDX,80000007  //edx∧80000007,此時edx為迴圈的次數
004081A7  |. 79 05          |JNS SHORT Mp3Recor.004081AE  //非負數則跳到 4081AE 繼續
004081A9  |. 4A            |DEC EDX
004081AA  |. 83CA F8        |OR EDX,FFFFFFF8
004081AD  |. 42            |INC EDX
004081AE  |> 0FBE5414 10    |MOVSX EDX,BYTE PTR SS:[ESP+EDX+10]  //從預設字串 mp3recor 中逐位取字元,放入 edx
004081B3  |. 0FBEC0        |MOVSX EAX,AL  //取使用者名稱ASCII
004081B6  |. 8BD9          |MOV EBX,ECX  //ebx=ecx,ecx 為迴圈次數,從0開始算
004081B8  |. 03DA          |ADD EBX,EDX  //ebx=ebx+edx,edx 中是取得的預設字串的ASCII值(第N次迴圈就取第N個,預設字串長度為8,所以8次後從頭開始取)
004081BA  |. 03C3          |ADD EAX,EBX  //eax=eax+ebx
004081BC  |. BB 09000000    |MOV EBX,9  //ebx=9
004081C1  |. 03C6          |ADD EAX,ESI  //eax=eax+esi,esi中是註冊名長度
004081C3  |. 99            |CDQ  //edx雙字擴充套件(清零)
004081C4  |. F7FB          |IDIV EBX  //eax=eax/9,餘數放入 edx
004081C6  |. 80C2 30        |ADD DL,30  //dl=dl+30,即餘數+30
004081C9  |. 41            |INC ECX  //記數器+1
004081CA  |. 8817          |MOV BYTE PTR DS:[EDI],DL  //dl->[EDI],dl中是對應註冊名計算出來的註冊碼
004081CC  |. 4F            |DEC EDI  //edi-1,地址往前推,所以求出的註冊碼是逆著放的,即註冊名第一個字元計算出來的數,應該是此部分註冊碼的最後一個數
004081CD  |. 3BCE          |CMP ECX,ESI  //比較註冊名是否已取完
004081CF  |.^7C CB          \JL SHORT Mp3Recor.0040819C  //沒有取完則跳回去繼續
//迴圈結束
//透過以上迴圈,可以得到對應註冊名的註冊碼的第一部分“55181870”

//以上迴圈演算法可總結如下:
//註冊名長度為L,N(I)為註冊名第I位字元,M(I)為預設字串“mp3recor”第I位字元,迴圈次數為X,則
//註冊碼(X-I+1)位為:(N(I)+M(I)+X1)/9 的餘數+30

//以我填入的註冊名第7位“r”為例,註冊碼第(8-7+1)為:
//(72+6F+81)/9=EF/9=1A,r=5
//所以第2位註冊碼為5

004081D1  |. 33DB          XOR EBX,EBX
004081D3  |. 5F            POP EDI
004081D4  |> 8D46 72        LEA EAX,DWORD PTR DS:[ESI+72]  //esi中是註冊名長度,所以這裡是取註冊名長度+72
004081D7  |. B9 09000000    MOV ECX,9  //ecx=9
004081DC  |. 99            CDQ  //edx雙字擴充套件(清零)
004081DD  |. F7F9          IDIV ECX  //eax=eax/9,餘數放入 edx
004081DF  |. 8B8424 F400000>MOV EAX,DWORD PTR SS:[ESP+F4]  //假碼放入eax
004081E6  |. 80C2 30        ADD DL,30  //dl+30,這是註冊碼的最後一位
004081E9  |. 885434 18      MOV BYTE PTR SS:[ESP+ESI+18],DL  //dl 放入[ESP+ESI+18],ESP+18 是第一部分註冊碼的起始地址,所以這裡就是放到之前算出的第一部分註冊碼之後
//這是註冊碼第二部分的計算,其值為 ((L+72)/9 的餘數)+30
//我輸入的註冊名為8個字元,則(8+72)/9=D,r=5,所以這一位註冊碼為5

004081ED  |. 885C34 19      MOV BYTE PTR SS:[ESP+ESI+19],BL
004081F1  |. 8D7424 18      LEA ESI,DWORD PTR SS:[ESP+18]  //真碼放入esi

004081F5  |> 8A10          /MOV DL,BYTE PTR DS:[EAX]
004081F7  |. 8ACA          |MOV CL,DL
004081F9  |. 3A16          |CMP DL,BYTE PTR DS:[ESI]
004081FB  |. 75 1C          |JNZ SHORT Mp3Recor.00408219
004081FD  |. 3ACB          |CMP CL,BL
004081FF  |. 74 14          |JE SHORT Mp3Recor.00408215
00408201  |. 8A50 01        |MOV DL,BYTE PTR DS:[EAX+1]
00408204  |. 8ACA          |MOV CL,DL
00408206  |. 3A56 01        |CMP DL,BYTE PTR DS:[ESI+1]
00408209  |. 75 0E          |JNZ SHORT Mp3Recor.00408219
0040820B  |. 83C0 02        |ADD EAX,2
0040820E  |. 83C6 02        |ADD ESI,2
00408211  |. 3ACB          |CMP CL,BL
00408213  |.^75 E0          \JNZ SHORT Mp3Recor.004081F5
//以上是逐位對比輸入的註冊碼和真碼是否相同

00408215  |> 33C0          XOR EAX,EAX
00408217  |. EB 05          JMP SHORT Mp3Recor.0040821E
00408219  |> 1BC0          SBB EAX,EAX
0040821B  |. 83D8 FF        SBB EAX,-1
0040821E  |> 5E            POP ESI
0040821F  |. 3BC3          CMP EAX,EBX
00408221  |. 5D            POP EBP
00408222  |. 889C24 E000000>MOV BYTE PTR SS:[ESP+E0],BL
00408229  |. 8D8C24 E800000>LEA ECX,DWORD PTR SS:[ESP+E8]
00408230  |. 75 31          JNZ SHORT Mp3Recor.00408263
00408232  |. E8 AE590200    CALL Mp3Recor.0042DBE5
00408237  |. 8D8C24 EC00000>LEA ECX,DWORD PTR SS:[ESP+EC]
0040823E  |. C78424 E000000>MOV DWORD PTR SS:[ESP+E0],-1
00408249  |. E8 97590200    CALL Mp3Recor.0042DBE5
0040824E  |. B8 01000000    MOV EAX,1
00408253  |. EB 2C          JMP SHORT Mp3Recor.00408281
00408255  |> 889C24 E000000>MOV BYTE PTR SS:[ESP+E0],BL
0040825C  |. 8D8C24 E800000>LEA ECX,DWORD PTR SS:[ESP+E8]
00408263  |> E8 7D590200    CALL Mp3Recor.0042DBE5
00408268  |. 8D8C24 EC00000>LEA ECX,DWORD PTR SS:[ESP+EC]
0040826F  |. C78424 E000000>MOV DWORD PTR SS:[ESP+E0],-1
0040827A  |. E8 66590200    CALL Mp3Recor.0042DBE5
0040827F  |. 33C0          XOR EAX,EAX
00408281  |> 8B8C24 D800000>MOV ECX,DWORD PTR SS:[ESP+D8]
00408288  |. 5B            POP EBX
00408289  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
00408290  |. 81C4 E0000000  ADD ESP,0E0
00408296  \. C2 0800        RETN 8

所以註冊碼由兩部分組成,長度為註冊名長度+1。至此,EZ MP3 Recorder 1.15 註冊演算法分析完成。

一組可用的註冊碼:Name: lovefire S/N: 551818705

相關文章