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