1. 程式人生 > >OllyDbg操作——TraceMe.exe除錯

OllyDbg操作——TraceMe.exe除錯

1.分析TraceMe.exe

介面
這裡寫圖片描述

功能:驗證序列號是否正確

驗證流程:
輸入使用者名稱和序列號–>呼叫GetDlgItemTextA函式(獲取對話方塊文字)–>計算序列號–>呼叫lstrcmp函式(將計算結果與使用者輸入作比較)–>正確/錯誤

2.載入前設定
選單Options/Debugging options/Event
設定暫停點:主模組(檔案)的入口點。

3.載入.exe到OD
方法一:直接載入
選單File/Open,或快捷鍵F3 (支援帶引數開啟:開啟對話方塊中Arguments欄中輸入引數行)
實際是呼叫CreateProcess建立一個用來除錯的程序

方法二:附加,即除錯正在執行的程式
選單File/Attach,選中程序即可
若是隱藏程序,獲得隱藏程序的pid,在控制檯 C:\OllyDbg.exe -p pid值

4.快捷鍵
F8單步執行,跳過CALL和LOOP
F7單步執行,跟進CALL和LOOP
Ctrl+F9,跳出CALL呼叫的函式
Alt+F9,跳出系統API函式
F9,程式執行
F12,暫停程式(進入死迴圈時)
F4,執行到游標所在的行

F2設定斷點(雙擊Hex dump也可)
Alt+B開啟斷點視窗,管理斷點

反彙編面板:Ctrl+G查詢.test區塊中expression–>雙擊修改指令
資料面板:Ctrl+G查詢.data區塊中expression–>選中資料,Binary–>Edit修改十六進位制數或字串(字串要以00h結尾)

5.除錯
1、載入後,目標程式會暫停在Ntdll.dll的DbgBreakPoint處,按一下F9讓程式繼續執行。
(Ntdll.dll:Windows系統從ring3到ring0的入口,win32 API 最終都是呼叫ntdll.dll中的函式實現的)

2、找到GetDlgItemTextA(在Address欄),設定斷點
注:滑鼠點選選中反彙編面板
方法一:直接查詢:Ctrl + G –>輸入函式名
(因為事先不知道程式具體呼叫了什麼函式,所以要多試幾次,找到相應的函式)

方法二:輸入表查詢:Ctrl+N –>在name欄找到函式名

3、輸入使用者名稱和序列號,點選check,程式中斷。
這裡寫圖片描述

4.分析
Comment欄,即註釋,很詳細

GetDlgItemTextA的四個引數:對話方塊控制代碼,控制元件標識(ID號),緩衝區指標,緩衝區最大字元數
(參考Win32.API手冊,搞清定義中引數)
(標準呼叫約定:從右到左順序入棧(push),被呼叫者清理棧中引數,返回值放在eax中)
(C呼叫約定:從右到左順序入棧,由呼叫者清理棧中引數)

按F8單步執行,GetDlgItemTextA執行之後,資料視窗顯示讀入了輸入的使用者名稱和序列號

找到序列號判斷的關鍵程式碼,發現只要4011F5一句不跳轉就可註冊成功。

5.爆破(或補丁patch)
即遮蔽程式的某些功能,或改變程式流程,使程式的保護方式失效。

修改方法一:改變標誌暫存器的值
執行到4011F5行,在暫存器面板中找到暫存器ZF,雙擊一次取反,由1變0或由0變1

修改方法二:改變彙編程式碼
選中4011F5行,雙擊,輸入指令“NOP”

目前修改是記憶體中資料,選中修改過的程式碼–>右鍵–>Copy to executable–>Selection–>Save File,把修改複製到.exe 檔案中

6.找到正確序列號
載入TraceMe之後執行,輸入pediy和假序列號“121212”,跳出錯誤提示框。
M(記憶體視窗)–>最上一行Ctrl+B搜尋框–>Ascll輸入121212定位–>在其前後位置找到正確序列號2470
這裡寫圖片描述
(根據資料約束性,即密碼相鄰性)

6.製作註冊機
方法一:用Keymake軟體(針對序列號在記憶體中是明碼的)
在指定位置攔截程式指令,將記憶體或暫存器的值讀出來,得到正確序列號
第一次攔截處:
.text:004011E5 E8 56 01 00 00 call sub_401340
第二次攔截處:
.text:0040138D 55 push ebp ; lpString2

Keymate設定如下:其他–>記憶體註冊機–>生成註冊機和原程式放在一個目錄下
這裡寫圖片描述

方法二:記憶體註冊機

常用斷點
1. INT 3斷點,即用CC指令(機器碼是CCh),替換原來的指令。偵錯程式捕捉到CC指令就停在斷點處。
快捷鍵F2,或雙擊Hex dump
好處:可同時設多個斷點;
缺點:易被檢測(因為修改了原指令),檢測API地址的第一個位元組,若是CCh,則認為被下斷。
若要躲過檢測,只要將斷點下在函式內部(例如,函式入口的下一行)即可。

2.硬體斷點
利用DRx除錯暫存器。DR0~DR3放斷點的地址,DR7設定相應的控制位。當執行到相應地址時中斷。
右鍵–>Breakpoint–>Hardware設定斷點;選單Debug–>Hardware breakpoints–>Delete刪除斷點
優點:速度快,不易被檢測
缺點:最多隻能4個斷點

3.記憶體斷點
對所設的地址設為不可訪問/不可寫,當訪問/寫入時中斷。
右鍵–>Breakpoint–>Memory設定斷點;右鍵–>Breakpoint–>Remove memory breakpoint刪除斷點
優點:不易被檢測,當硬體斷點失靈時,用它來替代
缺點:降低OD速度。

4.記憶體訪問一次性斷點
一次性,即中斷髮生後,斷點就被刪除。
M(memory map)–>找到相應的記憶體段–>Set break-on-access
優點:脫殼時特別有用

5.訊息斷點
當用戶點選一個按鈕。移動滑鼠或向文字框輸入文字時,會發送訊息到當前窗體。當窗體接收到特定訊息時程式中斷。
W(Windows)–>找相關引數:控制代碼(Handle)、ID等–>右鍵–>Message breakpoint on ClassProc–>Messages設定訊息種類,即設定中斷;Alt+B斷點視窗,刪除中斷。

6.條件中斷
斷點滿足一定條件時才中斷,是一個帶有條件表示式的 INT 3 斷點。
右鍵–>Breakpoint–>Conditional

7.條件記錄斷點
有條件斷點的作用,還能記錄斷點處 函式表示式的值、引數的值、斷點的次數等。
右鍵–>Breakpoint–>Conditional log–>輸入條件和表示式,設定斷點