前置知識介紹:
-
160 CrackMe 是比較適合新手學習逆向破解的CrackMe的一個集合,一共160個待逆向破解的程序
-
CrackMe:一些公開給別人嘗試破解的小程序,制作crackme的人可能是程序員,想測試一下自己的軟件保護技術,也可能是一位cracker,想挑戰一下其它cracker的破解實力,也可能是一些正在學習破解的人,自己編一些小程序給自己破。
-
CrackMe簡稱CM,cracker是以破解各種加密或有限制的商業軟件為樂趣的人。
程序信息:
編號 | 作者 | 保護方式 |
---|---|---|
001 | Acid burn | Name/Serial,Serial |
工具:
-
ollyDbg(簡稱OD)
-
Exeinfo PE
開始破解:
2.Delphi所編寫的代碼與VC++所編寫的代碼有所不同,最明顯的兩點區別如下:
-
函數調用時傳參的方式主要用寄存器,一般將參數1放入eax寄存器,參數2放入edx寄存器,參數3放入ecx寄存器,多余的也是通過壓棧的方式傳入
-
字符串的處理,Delphi字符串處理函數與VC++是不同的,其字符串的首地址減去4后,所取出的4個字節就是此字符串的長度。分析的時候要注意。
3.接下來我們運行程序,首先會彈出一個提示窗口,大概意思是歡迎你破解他,這個軟件由ACiD BuRN制作
4.現在我們知道這個軟件制作者是誰呢,不想每次運行都彈出這個對話框來提醒我制作者是誰,那么我們有了第一個目標,讓提示窗口不顯示。點擊《確定》按鈕,發現有兩種驗證機制,一種是用戶名與序列號驗證,另一種只需要序列號。所以我們又獲得兩個新任務,由易到難,我們第二個目標是只需要序列號驗證的,最后攻克用戶名與序列號驗證
5.目標一:去掉煩人的提示對話框(一般軟件設計者用來提醒用戶購買正式版本的窗口),要完全去除提示窗口,只需要找到創建該窗口的代碼並將其跳過。顯示窗口的常用函數有:
-
MessageBoxA(W)
-
MessageBoxExA(W)
-
DialogBoxParamA(W)
-
ShowWindow
-
CreateWindowExA(W)
6.我們用OD打開,然后用Ctrl+G跳轉到上面常用函數處,然后按F2鍵下斷點
7.或者用命令bp MessageBoxA在指定函數處下斷,bp表示下斷點,后面跟着要下斷點的函數名,(bp與函數名之間有個空格)
8.下完斷點后,按F9讓程序運行起來,發現程序會在函數MessageBoxA處斷下,觀察棧區,會發現就是我們要去除的窗口信息,即此時MessageBoxA函數執行完,就會彈出提示窗口,我們轉到調用這個函數的位置(方法見下圖2)
9.本來我們只要nop掉調用MessageBoxA的代碼就可以實現目標一,不過后面驗證后的結果提示窗口也會調用此處,所以我們還要繼續向上找
10.終於來到最終的關鍵處,此時我們采用第二種,直接將push 0x0改為retn(有興趣的兩種都可以試試)
11.直接選擇要修改的那行,按空格鍵,輸入改后的指令,然后保存修改好后的程序,選擇覆蓋原程序,會在原程序目錄下生成個.bak文件,其實就是修改前的文件改了后綴。
提取碼:v34f