5.OD-条件断点、条件记录断点
以下演示如何下條件斷點:
在調(diào)試過程中,經(jīng)常希望斷點滿足一定條件時才中斷,這類斷點稱為條件斷點,
在OD的幫助文檔有詳細的說明:
(1)按寄存器條件中斷:
用OD打開Conditional_bp.exe,在0040147c,按shift+F2設(shè)置條件斷點:
輸入表達式eax == 040000,這樣如果eax為0400000h,OD將中斷,
用OD幫助文檔解釋下:
040000- 所有整數(shù)常量都認為是十六進制的,除非后面跟了點
EAX - 寄存器EAX的內(nèi)容,解釋為無符號數(shù)
(2)按存儲器條件中斷
先看下CreateFileA函數(shù):
[cpp]?view plaincopy運行Conditional_bp.exe,對CreateFileA設(shè)斷,單擊OpenTest按鈕,斷下來,在堆棧窗口單擊右鍵,執(zhí)行Address/Relative to ESP(地址/相對于ESP)菜單:
則堆棧窗口最左邊標(biāo)識了各參數(shù)相對于當(dāng)前ESP的地址:
假設(shè)當(dāng)CreateFile打開"c:\\1212.txt"時實現(xiàn)中斷,則shift+F2
鍵入字符 [STRING[esp+4]] =="c:\\1212.txt"
用OD幫助文檔解釋下:
[esp+4] - 在地址esp+4處的無符號雙字內(nèi)容
STRING [123456] - 以地址123456作為開始,以零作為結(jié)尾的ASCII字符串。中括號是必須的,因為您要顯示內(nèi)存的內(nèi)容
[STRING 123456]=="Brown fox" - 如果從地址0x00123456開始的內(nèi)存為ASCII字符串"Brown fox"、"BROWN FOX JUMPS"、 "brown fox???",或類似的串,那么其值為1。比較不區(qū)分大小寫和文本長度
EAX=="Brown fox" - 同上,EAX按指針對待。
UNICODE [EAX]=="Brown fox" - OllyDbg認為EAX是一個指向UNICODE串的指針,并將其轉(zhuǎn)換為ASCII,然后與文本常量進行比較
運行,斷了下來
?也可直接在CMD框中輸入bp CreateFileA,[STRING[esp+4]]=="c:\\1212.txt"(注意CreateFileA大小寫別錯了,中間有無逗號沒有影響)
如果是UNICODE,就用[UNICODE[ESP+4]]=="c:\\1212.txt"
?
OD條件斷點BUG:
[cpp]?view plaincopy
?從上面我們可以看出第一個參數(shù)就是文件名指針,也就是說這個參數(shù)中存放的就是文件名稱的地址。在32位程序中調(diào)用這個函數(shù)時這個參數(shù)的堆棧地址就應(yīng)該是esp+4(4×8=32),同理,下一個參數(shù)就應(yīng)該是esp+8。其它類推,返回值是esp+0。我們現(xiàn)在要判斷文件名,這里的文件名就是esp+4地址所指向的地址中的內(nèi)容。取地址中的內(nèi)容在OD中用雙方括號來操作,如取esp+4中的內(nèi)容就該寫成這樣:[esp+4]?,F(xiàn)在我們?nèi)〉腫esp+4]中的內(nèi)容還是個地址,所以要得到文件名則還要再取這個地址中的內(nèi)容,就該這樣:[[esp+4]]。而那個STRING前綴在OD中的解釋是以零作為結(jié)尾的ASCII字符串。所以我們下條件斷點時這樣寫:
bp CreateFileA,[STRING [esp+4]]=="abcdefghigklmn"
但卻發(fā)現(xiàn)斷不下來,寫成這樣:
bp CreateFileA,[[STRING [esp+4]]]=="abcdefghigklmn"
才能斷下來,這里就應(yīng)該是三層的地址了。為什么這樣目前尚不清楚
?
以下演示條件記錄斷點
條件記錄斷點除了具有條件斷點作用,還能記錄斷點處函數(shù)表達式或參數(shù)的值,也可以設(shè)置通過斷點的次數(shù),每次符合暫停條件時,計數(shù)器減一
如要記錄Conditional_bp.exe調(diào)用CreateFileA函數(shù)的情況,在CreateFileA函數(shù)的第一行,按Shift+F4鍵,出現(xiàn)條件記錄窗口:
?在Condition(條件)域中輸入要設(shè)置的條件表達式,
Explanation(說明)域中由用戶自己設(shè)置一個名稱,Expression(表達式)域中是要記錄的內(nèi)容的條件,只能設(shè)置一個表達式,如填的是[ESP+4},則要選擇"Pointer to ASCII String",才能正確打印出字符串,
Pause program是指OD遇到斷點時是否中斷,Log value of expression是指遇到斷點時是否記錄表達式的值, Log function arguments是指遇到斷點時是澡記錄函數(shù)參數(shù),
Never(從不),On condition(按條件),Always(永遠)等條件
總結(jié)
以上是生活随笔為你收集整理的5.OD-条件断点、条件记录断点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.OD-调试示例1
- 下一篇: 6.OD-Run trace /Hit