如果程式設定了硬體斷點,則 dr0 - dr7 暫存器的值就會改變,其中 dr0 - dr3
存放硬體斷點的位址,dr4 - dr5 保留,dr6 存放除錯事件的詳細資訊,dr7 存放斷點觸發的條件。
可以使用 getthreadcontext 獲取執行緒上下文環境,然後讀取當前的 dr0 - dr3 有沒有值,有的話就說明偵錯程式設定了硬體斷點,說明有偵錯程式。
但是缺點就是如果偵錯程式沒有設定硬體斷點的話就無法檢測偵錯程式,所以這種方法一般都和其他反除錯計數配合使用。?
/*
檢索執行緒上下文
返回值:失敗返回 0
*/bool getthreadcontext
( handle hthread,
// 執行緒控制代碼
lpcontext lpcontext // context 結構體指標
);
x64 下的 context 結構:
typedef
struct
declspec_align(16
) declspec_noinitall _context dummystructname;
} dummyunionname;
// vector(向量)暫存器
m128a vectorregister[26]
; dword64 vectorcontrol;
// 除錯控制暫存器
dword64 debugcontrol;
dword64 lastbranchtorip;
dword64 lastbranchfromrip;
dword64 lastexceptiontorip;
dword64 lastexceptionfromrip;
} context,
*pcontext;
// test_console_1.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include
#include
using
namespace std;
intmain()
rtlsecurezeromemory
(ctx,
sizeof
(context));
// 指定檢索執行緒上下文的哪些部分
ctx-
>contextflags = context_debug_registers;
// 獲取 dr0 - dr3 的值if(
getthreadcontext
(getcurrentthread()
, ctx)
)else
}else
main_end:
getchar()
;return0;
}
x64dbg 設定硬體斷點後:
正常執行時:
反除錯 時間
include include include using namespace std void isdebuger tbefore tafter return intmain rdtsc時鐘檢測反除錯 使用時鐘檢測方法是利用rdtsc這個彙編指令,它返回至系統重新啟動以來的時鐘數,並且將其作為乙個...
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...