在做Windows平台軟件逆向時,Ollydbg是極其常用的逆向工具,動態調試功能非常強大。在調試過程中,斷點的使用有助於確定關鍵的破解位置,今天講解的內容是OD常用斷點中的CC斷點。
CC斷點有很多名稱,比如普通斷點、F2斷點或者int3斷點,每個名稱都有它的來源。下面我們以crackme_01.exe為例子講解一下如何設置CC斷點以及其原理。

打開VM虛擬機,虛擬機中運行的操作系統為XP,接着使用OD載入crackme_01.exe。如下所示。

匯編窗口中展示的是crackme_01.exe的反匯編代碼,選中一行匯編代碼,按下F2快捷鍵或者雙擊,就可以設置CC斷點,由於OD中設置斷點的快捷鍵是F2,也被稱為F2斷點。斷點設置成功后,匯編代碼的地址會變紅。

CC斷點是OD中比較常用,而且相對普通的斷點。這類斷點的好處是可以設置任意個,缺點是容易被會檢測出來。下面咱們從原理上解釋一下為什么會被檢測出來。
首先,我們雙擊下斷點位置的下一條指令,將匯編代碼修改為mov eax,[0x0040100c],這個語句的意思是將內存地址為0x0040100c處的dword大小的數據賦值給eax。大家仔細看0x0040100c地址即為下斷點出指令的地址,因此可以換一種說法,即將0x0040100c處匯編語句的機器碼賦值給eax。

接下來F9運行程序,程序會斷在剛才設置的斷點位置,然后F8單步運行程序,運行到剛才修改過的匯編指令的下一句指令。我們注意一下下圖中eax中的值是多少。

我們注意到下端點出的匯編指令機器碼為E8170300,按照mov eax,[0x0040100c]的邏輯,eax中的值應該為000317E8,可是我們發現匯編指令機器碼第一個字節的E8變成了CC,這就是CC斷點的由來。CC斷點的原理是將斷下的指令地址處的第一個字節設置為0xCC,當然這是OD幫我們做的,而0xCC對應的匯編指令為int3,是專門用來調試的中斷指令。當CPU執行到int3指令時,會觸發異常代碼為EXCEPTION_BREAKPOINT的異常,這樣OD就能夠接收到這個異常,然后進行相應的處理,這也是CC斷點也叫int3斷點的原因。
為什么說CC斷點容易檢測呢?從上面我們使用的方法,就可以輕易獲取到修改的指令,那么程序員就可以在一些特殊的函數位置設置檢測點,來檢測是否設置了CC斷點,以便進行反調試。這些檢測點也就是我們常說的“暗樁”。
除了使用雙擊和F2進行CC斷點設置外,我們還可以使用一些命令進行設置。比如bp 0x0040100c,也可以設置和剛才一樣的斷點。

我們點擊B位置,就可以切換到斷點窗口,右擊來對斷點進行刪除、禁止等操作。
斷點窗口:

