Directory Scanner v1.5 註冊演算法分析 (6千字)

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

標 題:Directory Scanner v1.5 註冊演算法分析 (6千字)

發信人:炎之川

時 間:2003-4-6 22:06:23

詳細資訊:



Directory Scanner v1.5 註冊演算法分析

破解目標:Directory Scanner v1.5
官方主頁:http://dekasoftware.mastak.com/
軟體簡介:透過設定過濾掩碼,讓你快速查詢電腦中的檔案
下載地址:http://dekasoftware.mastak.com/dirscan.zip

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

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

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


Delphi 寫的軟體,也沒有什麼干擾分析的東西,W32Dasm 反彙編後可以在串式參考中找到註冊成功及失敗的提示,演算法也比較簡單。

簡單分析後用 Ollydbg 載入程式,在 43D538 處下斷點,然後 Ctrl+F2 重新開始,F9 執行程式,在註冊對話方塊中填入註冊名和假註冊碼,我填入:
Name: lovefire
S/N: 78787878

按 Register,被 Ollydbg 斷下:
(; 後是 Ollydbg 所分析的內容,// 後是我加的註釋)

0043D538  /. 55            PUSH EBP  //停在這裡
0043D539  |. 8BEC          MOV EBP,ESP
0043D53B  |. 6A 00          PUSH 0
0043D53D  |. 6A 00          PUSH 0
0043D53F  |. 53            PUSH EBX
0043D540  |. 56            PUSH ESI
0043D541  |. 57            PUSH EDI
0043D542  |. 8BF8          MOV EDI,EAX
0043D544  |. 33C0          XOR EAX,EAX
0043D546  |. 55            PUSH EBP
0043D547  |. 68 3BD64300    PUSH DirScan.0043D63B
0043D54C  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0043D54F  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
0043D552  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
0043D555  |. 8B87 E0010000  MOV EAX,DWORD PTR DS:[EDI+1E0]
0043D55B  |. E8 20E4FDFF    CALL DirScan.0041B980  //取得註冊名
0043D560  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]  //註冊名放入 eax
0043D563  |. E8 2465FCFF    CALL DirScan.00403A8C  //比較是否已輸入註冊名
0043D568  |. 33DB          XOR EBX,EBX
0043D56A  |. 8BF0          MOV ESI,EAX  //eax 中是註冊名
0043D56C  |. 85F6          TEST ESI,ESI  //使用者名稱輸入了麼?
0043D56E  |. 7E 22          JLE SHORT DirScan.0043D592  //沒有輸入就886啦~~~
0043D570  |. B9 01000000    MOV ECX,1  //ecx 置1,作為記數器

//演算法開始
0043D575  |> 69C1 15CD5B07  /IMUL EAX,ECX,75BCD15  //eax = ecx*75BCD15,ecx 是記數器
0043D57B  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]  //註冊名送 edx
0043D57E  |. 0FB6540A FF    |MOVZX EDX,BYTE PTR DS:[EDX+ECX-1]  //逐位取註冊名的字元
0043D583  |. F7EA          |IMUL EDX  //eax*edx,得數放入eax,溢位值放入edx
0043D585  |. 03C3          |ADD EAX,EBX  //eax=eax+ebx,此處第一次迴圈時ebx=0
0043D587  |. 99            |CDQ  //edx 清零
0043D588  |. 33C2          |XOR EAX,EDX  //eax異或edx,得數放入eax
0043D58A  |. 2BC2          |SUB EAX,EDX  //eax=eax-edx,edx中是上面乘法運算的溢位值
0043D58C  |. 8BD8          |MOV EBX,EAX  //ebx=eax
0043D58E  |. 41            |INC ECX  //ecx+1,即記數器+1
0043D58F  |. 4E            |DEC ESI  //esi-1
0043D590  |.^75 E3          \JNZ SHORT DirScan.0043D575  //跳回去繼續迴圈
//演算法結束,eax 中儲存的就是註冊碼的16進位制值,轉換為10進位制即是註冊碼

0043D592  |> 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
0043D595  |. 8B87 E8010000  MOV EAX,DWORD PTR DS:[EDI+1E8]
0043D59B  |. E8 E0E3FDFF    CALL DirScan.0041B980
0043D5A0  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]  //取假碼
0043D5A3  |. 33D2          XOR EDX,EDX
0043D5A5  |. E8 3294FCFF    CALL DirScan.004069DC
0043D5AA  |. 3BD8          CMP EBX,EAX  //比較真假註冊碼
0043D5AC  |. 75 4D          JNZ SHORT DirScan.0043D5FB  //不同則註冊失敗,若此處改為 jne 0043D5AE,不管註冊碼是否正確都寫入 dirscan.ini 檔案,即可爆破(軟體沒有在啟動的時候再次驗證註冊碼有效性)
0043D5AE  |. A1 E8FA4300    MOV EAX,DWORD PTR DS:[43FAE8]
0043D5B3  |. 8918          MOV DWORD PTR DS:[EAX],EBX
0043D5B5  |. B9 54D64300    MOV ECX,DirScan.0043D654                ;  ASCII "dirscan.ini"
0043D5BA  |. B2 01          MOV DL,1
0043D5BC  |. A1 644F4300    MOV EAX,DWORD PTR DS:[434F64]
0043D5C1  |. E8 FA79FFFF    CALL DirScan.00434FC0
0043D5C6  |. 8BF0          MOV ESI,EAX
0043D5C8  |. 53            PUSH EBX
0043D5C9  |. B9 68D64300    MOV ECX,DirScan.0043D668                ;  ASCII "Serial"
0043D5CE  |. BA 78D64300    MOV EDX,DirScan.0043D678                ;  ASCII "Register"  //註冊成功就將資訊寫入 dirscan.ini
0043D5D3  |. 8BC6          MOV EAX,ESI
0043D5D5  |. E8 DE7BFFFF    CALL DirScan.004351B8
0043D5DA  |. 8BC6          MOV EAX,ESI
0043D5DC  |. E8 5B57FCFF    CALL DirScan.00402D3C
0043D5E1  |. 6A 40          PUSH 40
0043D5E3  |. B9 84D64300    MOV ECX,DirScan.0043D684                ;  ASCII "Directory scanner"
0043D5E8  |. BA 98D64300    MOV EDX,DirScan.0043D698                ;  ASCII "Thank you for registering Directory Scanner!"  //註冊成功
0043D5ED  |. A1 A4FB4300    MOV EAX,DWORD PTR DS:[43FBA4]
0043D5F2  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
0043D5F4  |. E8 53DFFEFF    CALL DirScan.0042B54C
0043D5F9  |. EB 18          JMP SHORT DirScan.0043D613
0043D5FB  |> 6A 10          PUSH 10
0043D5FD  |. B9 84D64300    MOV ECX,DirScan.0043D684                ;  ASCII "Directory scanner"
0043D602  |. BA C8D64300    MOV EDX,DirScan.0043D6C8                ;  ASCII "Wrong Serial Number. Register aborted!"  //註冊失敗
0043D607  |. A1 A4FB4300    MOV EAX,DWORD PTR DS:[43FBA4]
0043D60C  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
0043D60E  |. E8 39DFFEFF    CALL DirScan.0042B54C
0043D613  |> A1 68074400    MOV EAX,DWORD PTR DS:[440768]
0043D618  |. E8 5BBDFEFF    CALL DirScan.00429378
0043D61D  |. 33C0          XOR EAX,EAX
0043D61F  |. 5A            POP EDX
0043D620  |. 59            POP ECX
0043D621  |. 59            POP ECX
0043D622  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
0043D625  |. 68 42D64300    PUSH DirScan.0043D642
0043D62A  |> 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
0043D62D  |. E8 DE61FCFF    CALL DirScan.00403810
0043D632  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
0043D635  |. E8 D661FCFF    CALL DirScan.00403810
0043D63A  \. C3            RETN


具體演算法:
1、具體迴圈次數乘預設的數75BCD15,再乘逐位取得的註冊名的ASCII值,值放入eax,溢位值放入edx,最後加上ebx的值,ebx初始值為0,第二次迴圈的值由第一次迴圈所得值決定,之後累加;
2、edx雙字擴充套件(清零)之後,(eax*edx)-edx,得出的值放入 ebx,供下次迴圈使用;
3、迴圈完成之後,eax中存放的值即註冊碼的16進位制數,轉換為10進位制即為註冊碼。

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

註冊成功後,註冊資訊寫入 windows 安裝目錄下的 dirscan.ini 檔案中。

最後特別感謝小樓兄!

相關文章