天天看點

斷點的種類

CC 斷點

又叫 int3/F2 斷點,軟體執行 int3 指令時程式就會暫停,int3 指令的機器碼就是CC。設定完 CC 斷點後,原本位置的機器碼會被調試器改成 0xCC(并對原來的資料備份),程式執行到 0xCC 時程式就會暫停(調試器所為)。

是以也就是說如果在沒有調試器的情況下如果我們程式裡有 0xCC,程式也不會暫停。

優點:可以設定無數個

缺點:容易被檢測到

記憶體斷點

分為:

(1)記憶體執行斷點

把機器碼當成程式執行時被斷下。

(2)記憶體寫入斷點

改寫這部分機器碼時被斷下。

(3)記憶體通路斷點

通路 = 執行 | 寫入。

設定記憶體斷點後,調試器會在你下斷點的記憶體頁增加一個 PAGE_NOACCESS 屬性,這個屬性會把目前記憶體頁設為禁止任何形式的通路,如果進行通路會觸發一個記憶體通路異常,之後調試器會捕獲這個異常,判斷這個異常觸發的位置和你下斷點的位置是否一樣,一樣則接管異常并暫停程式運作,不一樣則放行。

優點:相比 CC 斷點,不容易被檢測到。

缺點:隻能設定一個(新設定的記憶體斷點會覆寫原有的記憶體斷點),在調試器中沒有對應的記錄視窗,程式重新加載後消失。

硬體斷點

在寄存器中,有這麼一些寄存器,它們用于調試。人們把他們稱為調試寄存器,調試寄存器一共有8個名字分别從Dr0-Dr7。

Dr0-Dr3 存放中斷的位址,Dr4,Dr5一般不使用(保留),Dr6,Dr7 記錄在 Dr0-Dr3 中下斷的位址的屬性。

硬體斷點最不容易被斷下,分為三種:

(1)硬體執行斷點。

(2)硬體寫入斷點。

(3)硬體通路斷點。

硬體斷點生效時他會先執行符合條件的代碼,執行完後才停下,而記憶體斷點和CC斷點在即将執行符合條件的代碼處被斷下。

優點:更難被檢測,程式重新加載後不消失。

缺點:隻能設定有限的個數,

條件斷點

達到設定的條件時才觸發的斷點(某種自己設定的邏輯表達式)。

條件記錄斷點

條件記錄斷點除了具有條件斷點作用,還能記錄斷點處函數表達式或參數的值,也可以設定通過斷點的次數,每次符合暫停條件時,計數器減一。

你可以在一個被反複調用的函數段首下條件記錄斷點。篩選每一次調用傳入的參數,在合适的時機斷下。

消息斷點

消息斷點是對條件記錄斷點的應用,是針對一個特殊函數:winproc函數的 Message 參數設定的件記錄斷點 。

windows是基于消息的作業系統,每一個消息都按照相同的格式被寫入一個結構體,這個結構體叫MSG。消息發生後windows把該結構體傳給WinProc函數,用它來執行消息處理功能。