Ollydbg中的內存斷點和硬件斷點的區別


轉載自: https://www.zhihu.com/question/52625624 旅人的回復

作者:旅人
鏈接:https://www.zhihu.com/question/52625624/answer/131557817
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

首先是關於內存斷點的一些前置知識:
1.在windows系統上,內存是一頁一頁的,也就是說並不是0x00000000~0x7FFFFFFF(0xFFFFFFFF)中任何一個地址都是可以訪問的,不然每個程序都有真正的2g內存太可怕了。實際情況是,你程序申請了一塊0x2000的內存,這時候windows內核經過一系列處理,告訴你,我在某個地址上(比如說0x00500000)給你設置了0x2000的內存,你可以拿去用了。這時候0x00500000~0x00502000這塊內存你才可以訪問,你要是嘗試訪問0x00502001依然會出錯,因為這個地址根本不存在。

2.每個內存頁都是有屬性的,比如你申請時可以要求當前頁面里的內容不可作為代碼執行,因為你只是拿來存數據的,如果不這樣設置的話可能會遭到惡意利用。(比如說緩沖區溢出攻擊)

3.調試器可以先於被調試程序拿到一些系統下發的消息,比如說被調試程序中出現了異常。

------------------------------------------------
現在可以說說內存斷點都做了些什么了。

內存斷點的實現方式是將你欲下斷地址所在的內存頁增加一個名為PAGE_NOACCESS的屬性,這個屬性會把當前內存頁設為禁止任何形式的訪問,如果進行訪問會觸發一個內存訪問異常。在這同時,od開始捕獲目標程序中出現的這個異常,並判斷觸發這個異常的位置是否跟你下斷的地址相同,如果相同則內存斷點觸發,暫停被調試程序的運行,否則放行。

這就是內存斷點的基本原理,補充一些相關的東西:
1.內存斷點很消耗資源,因為PAGE_NOACCESS屬性一設置就是一整個內存頁無法訪問,那么當程序訪問該內存頁中非斷點地址的內容同樣會觸發異常,這時od收到異常后需要進行特殊處理,臨時放行,非常消耗資源,甚至這使得內存斷點在調試很多大型程序時慢到近乎不可用。
2.雖然內存斷點的效率經常很不理想,但是因為僅僅是修改了一個內存屬性,所以內存斷點可以下數量非常多、單斷點范圍非常大。這是它的優勢。
3.只在寫入時斷下的內存斷點通常是將內存屬性設為PAGE_EXECUTE_READ,也就是不可寫來實現的。對這種屬性的內存進行寫操作將會觸發異常。
4.關於內存屬性相關的知識:
------------------------------------------------
------------------------------------------------
接下來是硬件斷點的前置知識。

1.現代cpu為程序調試提供了8個寄存器,名為DRx.

2.調試器可以輕易讀寫被調試程序的這8個寄存器,而被調試程序不容易讀寫也通常不需要讀寫。

3.DR0~DR3四個寄存器用來存放欲下斷的地址,DR4,DR5這兩個保留, DR6和DR7用來控制斷點的大小和觸發斷點的時機。(比如說大小一個byte,觸發時機為寫入時)
------------------------------------------------
硬件斷點就不需要od做太多事情了,它只需要把用戶的需求轉換一下格式,寫入被調試程序的DRx系列的寄存器中,並等待系統發來的消息就行了。(我不記得這個消息是不是也是一個異常消息了,年代久遠太久不碰)
當od收到了消息就暫停目標程序,你就知道程序斷下了。

關於硬件斷點:
1.寄存器數量的限制導致硬件斷點最多只能同時存在4個,並且od在特定設置或者插件的影響下可能內部還會占用一兩個用來輔助程序調試,導致可用數量十分有限。
2.不僅硬件斷點數量不多,在32位程序中,每個硬件斷點最大范圍是4個字節,這也經常不太夠用。
3.由於cpu的直接支持,硬件斷點的效率是非常高的,給一個程序設置了硬件斷點,在不觸發的情況下,不會有肉眼可見的效率影響,畢竟只是寫了個寄存器而已。


--------------------------------------------------------------------------
總結,內存斷點通過修改內存頁的屬性並捕獲異常來間接暫停被調試的程序運行,而硬件斷點是由cpu直接提供支持。因為這樣,所以內存斷點的效率大大低於硬件斷點,但內存斷點的自由性大於硬件斷點,可以下很多很大不用擔心硬件限制。通常在調試程序時,能用硬件斷點就別用內存斷點,太[bi--]卡了。而且內存斷點經常下了找不着,而硬件斷點od有單獨的窗口顯示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM