標籤:http os 使用 sp 檔案 on 代碼 bs ad
所謂暴力破解,就是通過修改彙編代碼進而控製程序的運行流程,達到不需註冊碼也能正常使用軟體的目的。相對於解出演算法進而編寫註冊機,暴破的技術含量是比較低的。但也正是因為一本05年的雜誌上介紹“暴力破解”的文章,讓我入了這個大坑。近來想重拾調試器,就先從最簡單的CrackMe入手,熟練一下各工具方法。
下載CrackMe3檔案(我用的是看雪《加密與解密》中的CFF CrackMe #3 程式 http://pan.baidu.com/s/1dD9v9x3 )。
1.查看此程式是否加殼。加殼的話還得進行脫殼處理。將CrackMe拖到PEID上,顯示用Delphi編寫。無殼,甚好。
3.開啟程式,看看註冊碼出現異常的時候有何提示。恩,輸入錯誤的註冊碼,確認。顯示了“Wrong Serial,try again!”。我們記下這一串字元,接下來用得到。
4.退出程式,開啟OllyDbg,並載入此程式。(當年用的是W32Dasm,屬於靜態反組譯碼軟體,支援WIN API,具有強大的串式參考功能。因此成為破解入門軟體的最佳選擇。這次用OllyDbg實施爆破,只是複習一下操作。爆破原理都是相同的)是OllyICE,是OllyDbg的漢化版。也一樣好用。
載入程式後,出現如下介面:
title上面的“模組 — crackme3”標明了程式領空,我們當前是在crackme的代碼內。
5.我們在反組譯碼視窗“右鍵——尋找——所有參考文本字串”:
然後會彈出一個文本字串的對話方塊,繼續“右鍵——尋找文本”:
然後會彈出對話方塊,輸入前面記下來的那串“Wrong Serial,try again!”。其實為了方便,可以只輸入“Wrong”這個字串,畢竟程式裡帶“Wrong”的字元不會太多,如:
點擊“確定”後,會高亮尋找結果,此時在對應字串處“右鍵——反組譯碼視窗中跟隨”,會在反組譯碼視窗中跳到對應此串字元的彙編指令:
看到的指令,分析一下程式流程:輸入ID和註冊碼後,call調用子函數來判斷註冊碼是否正確(00440F51處,call 00403B2C處的子函數),如果不正確,一個jnz跳到00440F72,彈出“Wrong Serial ,try again!”,提醒說你丫註冊碼是錯的。
為了驗證我們的想法,我們在call的前面按F2下個斷點,然後一步步跟進,看看call了個什麼函數過來:
然後F9讓程式跑起來,輸入假的ID “wwwwww” ,按下“註冊”。此時程式自然要去call子函數來驗證我們的註冊碼是否正確。可惜它還沒走到call的那一步,就停在了我們設的斷點上(可以看到資訊視窗中的堆棧內容“wwwww”,不知會不會存在緩衝區溢位?XD):
然後按下幾次F8單步步過,直到了00440F34 call指令,程式就要召喚子程式來檢驗註冊碼是否正確了!此時改為F7單步步入,跟蹤到所call的函數(,此函數地址在00403B2C處):
跟進去之後,這就是用來驗證註冊碼的程式(從 三個push壓入堆棧 開始,到 三個pop彈出堆棧+retn 結束):
從代碼中可以發現,程式將輸入的註冊碼與內建的註冊碼用cmp指令做了比較。(cmp指令執行後,將對標誌寄存器ZF產生影響。比如 CMP AX , BX ,當AX=BX時,ZF=1;AX!=BX時,ZF=0。)
也就是說,如果註冊碼與輸入的字串不相等,ZF=0。此時子程式返回,執行00440F39處的JNZ指令。因為輸入的註冊碼不對,ZF=0,開始執行JNZ,跳轉到00440F8C,彈出“Wrong Serial”對話方塊提示註冊碼錯誤。
這就是傳說中的“關鍵跳”,如果將JNZ(ZF=0時就跳轉)改為JE(ZF=1時就跳轉),得到的結果就會正好相反,即錯誤的註冊碼反而會提示註冊成功,對的註冊碼反而會提示錯誤。
6.那麼現在找出那兩個“關鍵跳”(輸入ID時call了一下,然後一個jnz。輸入註冊碼時又call了一下,再一個jnz。),如:
好,現在只剩下修改彙編代碼了。雙擊對應的JNZ指令,彈出“彙編於此處”的對話方塊。將只需將“jnz”改為“je”,點擊“彙編”即可。用同樣的方法修改另一處“jnz”:
修改完畢,“右鍵——複製到可執行檔——所有修改“:
在彈出的對話方塊中點擊“全部複製”:
然後在出現的新對話方塊中“右鍵——儲存檔案”,完畢。
此時開啟新儲存的檔案,隨意輸入一個ID和註冊碼,點擊“註冊”,即彈出“註冊成功”的對話方塊:
小結:本次主要是重溫了OllyDbg的操作。爆破無外乎就是改變程式的驗證流程,譬如將關鍵處的jne改為je,或者jmp,比較不優雅。更優雅的是揣摩出程式作者的驗證演算法,寫出記憶體補丁或者註冊機,這才是高大上的方法。無奈演算法一類的是我的軟肋,仍需努力啊。
軟體破解入門(暴力破解CrackMe)