軟體斷點 (Software Breakpoint) 在 x86 架構下實際上是將目標指令的第一個位元組替換為 0xCC (INT 3 指令)。當執行流程命中該位置時,CPU 觸發中斷,調試器接管控制權。反調試邏輯即掃描目標函數入口處的機器碼,若發現 0xCC 則判定被下斷點。
[cpp]
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// 取得 GetDlgItemText 在當前模組的實際位址
typedef UINT (__stdcall * pGetDlgItemText)(HWND, INT, LPTSTR, INT);
PBYTE pByte = (PBYTE)(pGetDlgItemText)::GetDlgItemText;
// 掃描前 5 位元組 (典型熱補丁區域大小)
for (int i = 0; i < 5; i++) {
// 檢測是否為 0xCC:利用 XOR 性質,x ^ 0xCC == 0 當 x == 0xCC
if (0 == (*pByte++ ^ 0xCC)) {
MessageBox(NULL, "Find debugger!", NULL, MB_OK);
// 實際場景可改為:終止進程、回報伺服器、執行混淆流程等
}
}
return 0;
}
void CAntiCCFuncsDlg::OnOK()
{
// 建立獨立執行緒週期性檢測,避免阻塞主 UI 執行緒
CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
}
(PBYTE)(pGetDlgItemText)::GetDlgItemText 取得函數進入點位址。MOV EDI, EDI + PUSH EBP...) 供熱補丁使用,也是斷點最常被植入的位置。byte ^ 0xCC == 0 等價於 byte == 0xCC,可略過分支預測副作用 (雖然現代編譯器優化後差異極小)。0xCC。CreateThread 或直接 NOP 掉檢測邏輯。MessageBox),改為靜默記錄、延遲觸發保護邏輯 (如資料銷毀、功能降級),增加逆向分析成本。IsDebuggerPresent、CheckRemoteDebuggerPresent、NtGlobalFlag、Heap Flags 等多重反調試手段疊加。