OD软件断点原理
文章目錄
- int 3
- OD
- Hex_Editor
- 補充
軟件斷點即 int 3----l調試器利用 EXCEPTION_BREAKPOINT異常實現斷點功能。
int 3
設置斷點命令對應的匯編指令為INT3,對應的機器指令的也就是0xCC。CPU運行代碼的過程中若遇到匯編指令INT3,則會觸發EXCEPTION_BREAKPOINT異常。在OllyDbg調試器某個地址設置斷點后,確定該地址處的指令是否真會變為INT3(0xCC)?
OD
接下來我們查看以下數據窗口,
查看到設置斷點的地方,該地址處的指令并未變成INT3(匯編指令),也并未"6A“變成”CC"(機器指令),為什么跟我們想的不一樣呢?
解釋:
其實,這是Ollydbg耍的一個小花招,由于Ollydbg中按F2設置的斷點是用戶用來調試的臨時斷點(User Temporary Break Point),所以不需要在調試畫面中顯示。在代碼與內存中顯示出來的話,大大降低了代碼的可讀性,給代碼調試帶來不便。換言之,實際進程內存中0x1003E21的“6A”已經換成“CC”,但為了調試方便,所以呢,OD就沒有顯示出來。我們只需要把這個程序dump出來,然后放進Hex_Editor查看一下這個位置的數據即可。
偏移問題:
此程序的Imagebase為100000,所以VA1003E21對應的RVA 是3E21(RVA=VA-Imagebase)。由于dump程序是直接由這個程序進程內存轉儲而來的,所以RVA就是RAW(文件偏移量)
Hex_Editor
偏移為3E21處的“6A”已經換成“CC”
補充
問題一:,改成int 3,那不就破壞了原來的指令的完整性嗎?
后來,我又仔細想了想,改成int 3,那不就破壞了原來的指令的完整性嗎?而且不改回來,那后面指令解析那就全變了,指令對齊那些,直接影響一大片,也就是以后設置斷點還得找nop地方才能設置?可事實卻根本不是這樣。。
問了一下大佬,這個問題解釋是這樣的:它會先把下斷點的位置的前一句代碼改成int 3 然后 等到運行到這里時,再把它改回來
問題二:什么時機改回來?
然后我又想:啥時候改回來?而且改回來這個時機 既能 引發斷點異常,又能 不改變原來的指令解析?碰到int 3 ,引發異常了,說明把int 3執行完了,然后它有改回來?那它再改回來已經沒意義了吧????它已經執行完那個點了,然后再改回來那個地方的指令,確定沒影響????
這個問題解釋是這樣的:先,調試器把斷點處的第一個字節改成0XCC,當接收到繼續運行的消息時,調試器會先把這個int 3斷點修復成原來的字節,然后會執行eip-1這個操作,把int 3改掉的代碼繼續執行,好家伙,有eip-1的話,那么就很正常了
總結
- 上一篇: easy_Maze 梅津美治郎
- 下一篇: TLS回调函数(1)