最近一直在研究KeyFIle保護的軟體破解,就到CCG的主頁上下載了一個CrackMe,試著破了一下,請看:
由於筆者沒有時間複查,所以如有錯誤的地方請大家支出!
這個crackme在咖菲貓的家(CCG)的主頁有下載.
下載地址:http://go3.163.com/~gfcrack/crackme/Cruehead.3.zip
一個CrackMe的破解 *KeyFIle保護* (教你如何獲得 KeyFile)
1/2破解人:TAE! 另外1/2破解人:XXX!!!
用FileMon檢測出此CrackMe會讀取crackme3.key這個檔案,所以我們手動建立它,然後開啟
這個檔案,輸入 1234567890abcd 這些字元.執行trw設定斷點BPX CreateFilea.然後運
行程式,被中斷,按F5,F12各一次.便來到了這兒:
* Possible StringData Ref from Data Obj ->"CRACKME3.KEY"
|
:00401028 68D7204000 push
004020D7
* Reference To: KERNEL32.CreateFileA, Ord:0000h
|
:0040102D E876040000 Call
004014A8
:00401032 83F8FF
cmp eax, FFFFFFFF <---我們到了這裡,
:00401035 750C
jne 00401043 // 檢測crackme3.key這個檔案
是否存在.存在就跳走.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401035(C)
|
:00401043 A3F5204000 mov dword
ptr [004020F5], eax
:00401048 B812000000 mov eax,
00000012
:0040104D BB08204000 mov ebx,
00402008
:00401052 6A00
push 00000000
:00401054 68A0214000 push
004021A0
:00401059 50
push eax
:0040105A 53
push ebx
:0040105B FF35F5204000 push dword
ptr [004020F5]
* Reference To: KERNEL32.ReadFile, Ord:0000h
|
:00401061 E830040000 Call
00401496
//讀取檔案的位元組數
:00401066 833DA021400012 cmp dword ptr [004021A0],
00000012 //比較位元組數是不是12
:0040106D 75C8
jne 00401037
//小於12就跳走!完了
所以 Key 檔案的大小應該為18個位元組.
我們在Crackme3.key檔案中輸入18個字元,我是這樣輸的:1234567890abcdefgh
繼續來到這裡:
:0040106F 6808204000 push
00402008
:00401074 E898020000 call
00401311
*//對你輸入的字元編碼
:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678
註冊成功後,編碼後的
:00401083 83C404
add esp, 00000004
字元就是你的大名了!
:00401086 6808204000 push
00402008
:0040108B E8AC020000 call
0040133C
:00401090 83C404
add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword
ptr [004020F9] //
:00401099 0F94C0
sete al
:0040109C 50
push eax
:0040109D 84C0
test al, al
:0040109F 7496
je 00401037
進入*那個Call看看吧!在這裡,*****運算核心*****
:00401311 33C9
xor ecx, ecx
//清空暫存器ecx
:00401313 33C0
xor eax, eax
//清空暫存器eax
:00401315 8B742404
mov esi, dword ptr [esp+04] //Keyfile中的字串給esi
:00401319 B341
mov bl, 41
//將A這個字元傳給bl
:0040131B 8A06
mov al, byte ptr [esi] //KeyFile中第一個字元給al,就是我們輸入的1
:0040131D 32C3
xor al, bl
//異或al,bl傳給al
:0040131F 8806
mov byte ptr [esi], al //al給esi
:00401321 46
inc esi
//指向下一個esi中的字元
:00401322 FEC3
inc bl
//bl加1
:00401324 0105F9204000 add dword
ptr [004020F9], eax //異或後的每個ascii碼的值相加給004020F9*(這個值很重要設為X)
:0040132A 3C00
cmp al, 00
:0040132C 7407
je 00401335
:0040132E FEC1
inc cl
:00401330 80FB4F
cmp bl, 4F
:00401333 75E6
jne 0040131B
//迴圈
從這裡可以知道程式取keyfile中的字串進行編碼(第一個字元和A異或,第二個字元於B異或……,然後將結果儲存在Esi中)
但Keyfile中的最後四個字元不參加運算,而是作為判斷是否為真正keyfile的關鍵字元!)
(注意:若我們Keyfile檔案中第一個字元為A那麼破解後無法顯示你的大名)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040132C(C)
|
:00401335 890D49214000 mov dword
ptr [00402149], ecx
:0040133B C3
ret
運算完成後,我們便來到這裡:*************(這也是我有疑問的地方,請各位幫忙!!!)*************
:00401079 8135F920400078563412 xor dword ptr [004020F9], 12345678
//X和12345678異或的值(設為Y)
:00401083 83C404
add esp, 00000004
:00401086 6808204000 push
00402008
:0040108B E8AC020000 call
0040133C
//取出keyfile最後四位字元
:00401090 83C404
add esp, 00000004
:00401093 3B05F9204000 cmp eax, dword
ptr [004020F9] //最後四位字元十六進位制是否為X
:00401099 0F94C0
sete al
:0040109C 50
push eax
:0040109D 84C0
test al, al
:0040109F 7496
je 00401037
//不能跳!
所以要讓我們keyfile的最後四位字元的十六進位制的值=Y
異或後的結果的第1位開始到第14位就是你的姓名了!!!
這樣,應該不難寫出序號產生器了吧? 可惜我不懂程式設計;(
請教高手們:
如何在文字檔案中輸入那些很奇怪的字元?如:Keyfile檔案的最後四位一定要為十六進位制的:12345678
那麼這個12的ascii字元怎麼輸入呢?是否需要程式設計來獲得?請高人指點,小弟謝了!!!!!!!
TAE!
2001年2月5日