標 題: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 檔案中。
最後特別感謝小樓兄!