關於普通斷點/內存斷點/硬件斷點

  • 2020 年 4 月 24 日
  • 筆記

斷點都是通過觸發程序異常,來達到使程序斷下的目的

1.普通斷點:常規的有使用int 3,還有調試器平時的斷點,這2種都為該類型斷點,通過執行int 3達到觸發異常,讓程序斷下的目的。但該斷點修改了代碼段,在反調試中容易被察覺。

2.條件斷點:在普通斷點的基礎上,增加限定條件。適用於某一下斷處會被多地方調用,則加上限定條件(例:[esp-4]!=某一地址),以達到真正需要斷下時觸發。

3.內存斷點:通過修改內存的屬性來達到觸發異常。可設置觸發條件為讀、寫、執行。但該斷點會消耗較大資源,因為內存斷點會將目標地址所在的一整個內存頁中下斷點,當同內存頁非下斷位置被讀、寫、訪問也會觸發,此時調試器會對比數據,看觸發的斷點位置是否為當初下斷處。雖然內存斷點的效率經常很不理想,但是因為僅僅是修改了一個內存屬性,所以內存斷點可以下數量非常多、單斷點範圍非常大。這是它的優勢。

4.硬件斷點:硬件斷點為CPU提供給我們的斷點,由4個寄存器(DR0-DR3)存放斷點地址,斷點屬性可設置為讀、寫、執行,由於寄存器數量有限,只能存在4個硬件斷點,這4個斷點是否執行由DR70246位決定,當置為1時,斷點生效。

讀:當被下斷位置執行讀取操作後,在執行這個操作的位置斷下。 例:a的地址為0x123;在123下讀的斷點後,0x456 if(a==1),則程序會在0x456處斷下。

寫:當被下斷位置執行寫操作後,在執行這個操作的位置斷下。例:a的地址為0x123;在123下寫的斷點後,0x456 a=1,則程序會在0x456處斷下。

執行:當運行到下斷位置時,在該位置斷下。 例:例如0x123456處的代碼為c=a+b;在執行到這句時,會在0x123456處斷下。

以上斷點的地址都在內存中,不能為寄存器。