以下演示如何下條件斷點:
在除錯過程中,經常希望斷點滿足一定條件時才中斷,這類斷點稱為條件斷點,
在od的幫助文件有詳細的說明:
(1)按暫存器條件中斷:
用od開啟conditional_bp.exe,在0040147c,按shift+f2設定條件斷點:
輸入表示式eax == 040000,這樣如果eax為0400000h,od將中斷,
用od幫助文件解釋下:
040000- 所有整數常量都認為是十六進製制的,除非後面跟了點
eax - 暫存器eax的內容,解釋為無符號數
(2)按儲存器條件中斷
先看下createfilea函式:
[cpp]view plain
copy
handle winapi createfile(
__in lpctstr lpfilename,//指向檔名的指標
假設當createfile開啟"c:\\1212.txt"時實現中斷,則shift+f2
鍵入字元 [string[esp+4]] =="c:\\1212.txt"
用od幫助文件解釋下:
[esp+4] - 在位址esp+4處的無符號雙字內容
string [123456] - 以位址123456作為開始,以零作為結尾的ascii字串。中括號是必須的,因為您要顯示記憶體的內容
[string 123456]=="brown fox" - 如果從位址0x00123456開始的記憶體為ascii字串"brown fox"、"brown fox jumps"、 "brown fox???",或類似的串,那麼其值為1。比較不區分大小寫和文字長度
eax=="brown fox" - 同上,eax按指標對待。
unicode [eax]=="brown fox" - ollydbg認為eax是乙個指向unicode串的指標,並將其轉換為ascii,然後與文字常量進行比較
執行,斷了下來
也可直接在cmd框中輸入bp createfilea,[string[esp+4]]=="c:\\1212.txt"(注意createfilea大小寫別錯了,中間有無逗號沒有影響)
如果是unicode,就用[unicode[esp+4]]=="c:\\1212.txt"
od條件斷點bug:
[cpp]view plain
copy
首先我們看一下 createfilea 在 msdn 中的解釋:
handle createfile(
lpctstr lpfilename, // pointer to name of the file
dword dwdesiredaccess, // access (read-write) mode
dword dwsharemode, // share mode
lpsecurity_attributes lpsecurityattributes,
// pointer to security attributes
dword dwcreationdisposition, // how to create
dword dwflagsandattributes, // file attributes
handle htemplatefile // handle to file with attributes to
// copy
);
從上面我們可以看出第乙個引數就是檔名指標,也就是說這個引數中存放的就是檔名稱的位址。在32位程式中呼叫這個函式時這個引數的堆疊位址就應該是esp+4(4×8=32),同理,下乙個引數就應該是esp+8。其它類推,返回值是esp+0。我們現在要判斷檔名,這裡的檔名就是esp+4位址所指向的位址中的內容。取位址中的內容在od中用雙方括號來操作,如取esp+4中的內容就該寫成這樣:[esp+4]。現在我們取的[esp+4]中的內容還是個位址,所以要得到檔名則還要再取這個位址中的內容,就該這樣:[[esp+4]]。而那個string字首在od中的解釋是以零作為結尾的ascii字串。所以我們下條件斷點時這樣寫:
bp createfilea,[string [esp+4]]=="abcdefghigklmn"
但卻發現斷不下來,寫成這樣:
bp createfilea,[[string [esp+4]]]=="abcdefghigklmn"
才能斷下來,這裡就應該是三層的位址了。為什麼這樣目前尚不清楚
以下演示條件記錄斷點
條件記錄斷點除了具有條件斷點作用,還能記錄斷點處函式表示式或引數的值,也可以設定通過斷點的次數,每次符合暫停條件時,計數器減一
如要記錄conditional_bp.exe呼叫createfilea函式的情況,在createfilea函式的第一行,按shift+f4鍵,出現條件記錄視窗:
在condition(條件)域中輸入要設定的條件表示式,
explanation(說明)域中由使用者自己設定乙個名稱,expression(表示式)域中是要記錄的內容的條件,只能設定乙個表示式,如填的是[esp+4},則要選擇"pointer to ascii string",才能正確列印出字串,
pause program是指od遇到斷點時是否中斷,log value of expression是指遇到斷點時是否記錄表示式的值, log function arguments是指遇到斷點時是澡記錄函式引數,
never(從不),on condition(按條件),always(永遠)等條件
od 的條件斷點學習心的
我只說步驟 假如你想在createfilea處,當filename c aaa bbb 1.txt 斷下程式 0384fe7c 0061742d call to createfilea from qqhelper.00617427 0384fe80 02e6a278 filename c aaa b...
OD硬體斷點,OD記憶體斷點,API斷點
一.設定硬體寫入斷點 9 i0 b m a8 8 w8 u f q q r w0 s,k9 h s.2 l w1 d8 r8 j a 0 v4 o r q at r p a l y h 在指定位址進行反 彙編 g m d q e d b,a l x x 7 l h.r d t8 k1 4 follo...
gdb 條件斷點
gdb 條件斷點 1.有時候,我們需要斷點在迴圈的某個條件處時,比如以下 include int main int argc,char argv return 0 2.開始編譯 cc g main.c將生成a.out 3.開始斷點 gdb a.out l l命令用於檢視 4.通過以上命令可以看到 m...