一個CrackMe的破解 *KeyFIle保護* (教你如何獲得 KeyFile) (5千字)

看雪資料發表於2001-02-06

最近一直在研究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日

相關文章