調試斷點原理之普通斷點

OD爲調試器分析不同斷點的區別:

普通斷點原理:直接改寫斷點內存地址的第一個字節,替換爲int3 (0xcc,軟中斷機制),並保存原始字節至OD維護的一張斷點表處。程序運行到此處時會中斷,拋出異常,OD通過捕獲該異常,暫停程序運行至斷點內存地址處(斷點處指令仍未執行),當執行斷點處指令時,並不是完全從內存中取指令,因爲該斷點內存中的第一個指令已經被改寫爲0xcc,因此,此時執行的指令是由斷點表中保存的原始字節與後續的二進制數據自合而成。執行完斷點處指令後,只要斷點沒有被刪除,其內存中的第一個字節仍然是0xcc。當刪除某個斷點時,od會根據刪除的斷點地址在斷點表中查找對應的原始字節,並恢復至對應的內存中。

如圖:

 

利用od加載一個程序,將斷點設置在0x40137d處。通過修改斷點前後的代碼,來查看斷點內存數據改變情況:

 

紅色的彙編爲修改的指令,0x401377:從0x40137d內存地址中讀取4個字節到寄存器eax0x40137e:從0x40137d內存地址中讀取4個字節到寄存器ecx,單步執行完0x401377處指令時,查看eax寄存器的值。如圖:

 

Eax=0x7d0d8bcc(小端對齊)。正常情況下,應該0x7d0d8b50.即添加斷點後,斷點處的第一個字節0x50被覆寫爲0xcc。雖然od上顯示的0x40137d處爲:0x50,但是實際上,其內存地址數據已經改變。繼續單步執行完斷點處指令,push eax,然後單步執行0x40137e處指令(我們改寫的測試指令),首先將eax值入棧,如圖:


然後從0x40137d內存地址中讀取4個字節到寄存器ecx,如圖:

 

即斷點執行前後,斷點內存中的數據使用是被覆蓋的0xcc

此時,我們將0x40137d處斷點刪除,並改寫即將執行的指令,從0x40137d內存地址中讀取4個字節到寄存器edx,如下圖,0x401385處,eip=0x401385

 

單步執行0x401385處指令,查看寄存器edx值,如圖:

 

Edx=0x7d0d8b50. 0x40137d處的原始指令已被恢復。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章