第2章:動態除錯技術--OllyDbg
OllyDbg 是有 Oleh Yuschuk 編寫的一款具有視覺化介面的使用者模式偵錯程式.可以在各種版本的 Windows 上執行,但在 NT 架構上是最好的.
plugin 目錄中存放外掛,直接將外掛放裡面,OD即可檢測到.
Debug -> Select Import Librariers ,可以將符號庫( Lib )匯入,讓OD以函式名的形式顯示 DLL 中的函式.這個功能類似於 IDA 的 FLIRT.
EIP 的值不能直接修改,在 CPU 介面對選中的程式碼 右鍵 -> New Origin Here.
call xxxxxxx 進入子程式後,棧中會將 call 指令的下一條指令最為返回地址壓入棧中.
Crtl + F9 執行到第一個返回命令處( ret , retf , iret ) . Crtl + F7/8 會一直執行 , 直到按 ESC 或者遇到斷點.
領空是指程式在某一時刻 CPU 執行的程式碼的擁有者.
API 函式大多采用 __stdcall 呼叫,按照逆序將資料入棧.
爆破是指 : 修改程式碼,改變其功能,使程式保護的方式失效.
Int 3 斷點(軟體斷點)可以有無數個,但是容易被檢測到.
BOOL IsCC() { FARPROC Uaddr ; BYTE Mark = 0; (FARPROC&) Uaddr =GetProcAddress ( LoadLibrary("user32.dll"),"MessageBoxA"); Mark = *((BYTE*)Uaddr); // 取MessageBoxA函式第一位元組 if(Mark ==0xCC) // 如該位元組為CC,則認為MessageBoxA函式被下斷 return TRUE; else return FALSE; }
硬體斷點與 DRx 除錯暫存器有關( DR6 :除錯暫存器組狀態暫存器 , DR7: 除錯暫存器組控制暫存器 ):
硬體斷點的除錯原理是:使用DR0~DR3 設定地址,並使用DR7設定狀態.因此硬體斷點最多隻能存在4個.
記憶體斷點: 對所設的地址賦予 不可訪問/不可寫屬性 ,這樣當 訪問/寫入 時會產生異常,並由偵錯程式接管這個異常.
每次異常都需要比較來確定是否應該中斷,因此過多的記憶體斷點會讓偵錯程式的執行速度變慢.
記憶體一次性斷點: 斷住後就刪除斷點.這類斷點僅僅在 NT 架構下可用.
訊息斷點: 只有視窗被建立之後才能被設定. 所有傳送的訊息包含四個引數 : 控制代碼( hwnd ),訊息編號( msg )和兩個32位長( long )的引數.
控制代碼用來表示它所代表的物件,比如單擊了哪個按鈕,傳送訊息給對用的程式.
在 View -> 視窗 處,選擇 按鈕,然後選擇 訊息斷點和型別.執行後即斷在系統底層程式碼領空,在使用者程式碼領空( 一般為 .text )設定記憶體訪問斷點,繼續執行即可到程式碼處.
條件斷點:
①按儲存器條件中斷
以 CreateFile 為例:
如果要找到多個檔案中的一個檔案,在棧中選擇 "Relative to ESP" :
[ STRING [esp+4 ] ] == "c:\\1212.txt" 或者是 [ UNICODE [ esp+4 ] ] =="c:\\1212.txt"
②按暫存器條件中斷
條件記錄斷點:
以 CreateFile 為例,
假如要記錄 這個函式被呼叫的情況,在該 API 的開頭選中,然後按 Shift+F4 ,
開啟條件記錄視窗表示式表示要記錄的值,填 EAX,則表示要記錄 EAX 的值.如果填的是 [ esp+4 ] ,則可以選擇解碼錶達式.
下面用於設定遇到斷點時是否進行相應的操作.
最下面的表示暫停時執行的命令:如果輸入" .d esp ",條件斷點斷下時會執行" d esp ".
外掛: Run Trace 在除錯設定中設定一個大的緩衝區,在工具欄 除錯 -> 開啟或清除跟蹤. 開啟後將自動記錄資料變化,也可以檢查每個可識別函式的被呼叫次數
Hit trace : 能夠讓除錯者辨別哪一部分的程式碼被執行了.
但是不能在資料區使用,因為它會在每個指令前設 Int 3 斷點,命中就刪除,會改變資料使程式發生錯誤.
除錯符號 :
符號格式: ① SYM 早期用於 MS-DOS 和16位 Win ,現在只作為 Win 9x (16位) 的除錯符使用.
② COFF 是 UNIX 供應商所遵循規範的一部分,由 Windows NT 2.1 首次引進使用.微軟以拋棄.
③ CodeView 格式現在已經支援 Win32 系統,支援的除錯符號是 C7 格式,其在執行模組中是自我包含的,符號資訊和二進位制程式碼混合(除錯檔案很大).
④ PDB( Program Database ) 是微軟自己定義的未公開的格式,PDB 符號可以根據應用程式不同的連結方式儲存在單獨的或者多個檔案中.
⑤ DBG 是系統除錯符,用於顯示系統函式名,連結器不建立 DBG 檔案,微軟將作業系統除錯符分配在 DBG 檔案 ( 包含其它除錯符的檔案例如, COFF 和 C7 )中.
⑥ MAP 檔案是程式的全域性符號,原始檔,行號程式碼資訊的唯一文字表示方式.此檔案不需要程式支援,通用性極好.
建立除錯檔案 :
OD 以兩種方式載入目標程式:
①使用 CreateProcess API,即在 OD 中開啟一個檔案( F3 ),可以附帶引數.
②使用 DebugActiveProcess API. 將偵錯程式捆綁到一個正在執行的程序上,即 Attach .
如果是隱藏程序,在命令列介面輸入 :" C:\OllyDbg.exe -p pid 值 "
一些問題 :