|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-21, 12:17 AM | #1 |
榮譽會員
|
EZ MP3 Recorder 1.15 註冊算法分析
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)+X+I-1)/9 的餘數+30 //以我填入的註冊名第7位「r」為例,註冊碼第(8-7+1)為: //(72+6F+8+7-1)/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 -------------------------------------------------------------------------------- |
送花文章: 3,
|