編號
製作者保護方式
002afkayas
name/serial
1.先用exeinfo pe檢視下程式(開啟工具,將程式拖拽進去即可檢視),得到資訊如下圖,可知該程式沒有加殼,而且是用vb寫的
2.接下來我們執行下程式,發現程式很簡單,就是對使用者名稱與序列號進行驗證,驗證錯誤會彈出提示對話方塊,同時使用者名稱不能為空,序列號可以為空。
3.我們先用字串試試看能能搜尋到,用od引導程式,右鍵->中文搜尋引擎->智慧型搜尋,可以發現搜尋到的字串比較少,很容易就發現了我們的錯誤提示字串,同時看到了正確提示字串,我們直接跟隨正確字串(選中右鍵->跟隨或者選中回車鍵)
4.在正確提示「you get it」 這一句上面有個je跳轉指令跳過了彈出註冊成功視窗的指令,直接跳到彈出註冊失敗視窗的指令處,顯然這是個關鍵跳轉,我們只要讓其不跳轉就行了,直接nop掉或者改成jnz(注意修改成jnz後輸入正確的使用者名稱與序列號反而不能驗證成功,因為jnz與je跳轉條件是反的),然後儲存修改後的檔案就完成了爆破。
5.我們繼續向上看是哪處指令影響了此跳轉,上面不遠處就能發現是si的值決定了此處跳轉,那麼繼續往上看,發現si的值由vbastrcmp函式的返回值決定,當vbastrcmp返回值為0,si=-1,返回值不為0時,si=0。上網查詢該函式可知,這是字串比較函式,當比較的兩個字串相同時,返回0,不相同是返回非0(具體返回1還是-1這裡不討論),所以這段**就是比較兩個字串,如果相同,就不跳轉到彈出錯誤框指令處,不相同,就會跳轉到彈出錯誤框指令處
6.那麼這麼一分析,比較的很有可能是序列號,我們在00402533 呼叫比較函式處下個斷點(f2),再次執行讓程式斷在此處,觀察棧區和暫存器的值,可以在棧區發現我們輸入的假碼(使用者隨意輸入的一般叫假碼)和疑似真碼的序列號aka-682837(使用者名稱不同,此值不同,以自己的為準)
7.執行將之前的序列號改成疑似真碼的序列號aka-682837重新驗證,驗證通過。也就是這就是我們要找的真碼,那麼我們繼續向上分析這個真碼是通過vbastrcat拼接而成,其中aka-是固定的。
8.繼續向上一堆不知所云的函式,比較難跟,我們直接向上找到這個函式頭部,然後在頭部下個斷點(f2),然後讓程式跑起來,再次驗證停在此處(使用者名稱還是之前的,不要變),然後一直f8,觀察暫存器與棧區的值,發現有682837(此值就是第六步中後面的數值,以自己的為準)就停下來。
9.一路單步到0x402445處出現了我們要的值,也就可以確定演算法在上面
10.這次很幸運,上面就是演算法,演算法是:
(使用者名稱長度 * 0x17cfb + 使用者名稱第乙個字元對應的ascii值)轉換為10進製
11.那麼演算法知道了,我們就可以自己寫個程式算出序列號了,還是用c++寫的:
#include #include #include int main()12.最後上效果圖
逆向破解之160個CrackMe 029
160 crackme 是比較適合新手學習逆向破解的crackme的乙個集合一共160個待逆向破解的程式 crackme 它們都是一些公開給別人嘗試破解的小程式,製作 crackme 的人可能是程式設計師,想測試一下自己的軟體保護技術,也可能是一位 cracker,想挑戰一下其它 cracker 的...
逆向破解之160個CrackMe 020
160 crackme 是比較適合新手學習逆向破解的crackme的乙個集合一共160個待逆向破解的程式 crackme 它們都是一些公開給別人嘗試破解的小程式,製作 crackme 的人可能是程式設計師,想測試一下自己的軟體保護技術,也可能是一位 cracker,想挑戰一下其它 cracker 的...
逆向破解之160個CrackMe 014
160 crackme 是比較適合新手學習逆向破解的crackme的乙個集合一共160個待逆向破解的程式 crackme 它們都是一些公開給別人嘗試破解的小程式,製作 crackme 的人可能是程式設計師,想測試一下自己的軟體保護技術,也可能是一位 cracker,想挑戰一下其它 cracker 的...