五、使用ntqueryinformationprocess函式
ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是-1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibrary和getproceaddress的方法獲取呼叫位址,示例**如下:
// 宣告乙個函式指標。
typedef
ntstatus (winapi *ntqueryinformationprocessptr)(
handle processhandle,
processinfoclass processinformationclass,
pvoid processinformation,
ulong processinformationlength,
pulong returnlength);
bool
六、ntsetinformationthread方法
這個也是使用windows的乙個未公開函式的方法,你可以在當前執行緒裡呼叫ntsetinformationthread,呼叫這個函式時,如果在第二個引數裡指定0x11這個值(意思是threadhidefromdebugger),等於告訴作業系統,將所有附加的偵錯程式統統取消掉。示例**:
// 宣告乙個函式指標。
typedef
ntstatus (*ntsetinformationthreadptr)(handle threadhandle,
threadinfoclass threadinformationclass,
pvoid threadinformation,
ulong threadinformationlength);
void
七、觸發異常的方法
這個技術的原理是,首先,程序使用setunhandledexceptionfilter函式註冊乙個未處理異常處理函式a,如果程序沒有被除錯的話,那麼觸發乙個未處理異常,會導致作業系統將控制權交給先前註冊的函式a;而如果程序被除錯的話,那麼這個未處理異常會被偵錯程式捕捉,這樣我們的函式a就沒有機會執行了。
這裡有乙個技巧,就是觸發未處理異常的時候,如果跳轉回原來**繼續執行,而不是讓作業系統關閉程序。方案是在函式a裡修改eip的值,因為在函式a的引數_exception_pointers裡,會儲存當時觸發異常的指令位址,所以在函式a裡根據這個指令位址修改暫存器eip的值就可以了,示例**如下:
// 程序要註冊的未處理異常處理程式a
long winapi myunhandledexceptionfilter(struct _exception_pointers *pei)
bool
return
false;
}
八、呼叫deletefiber函式
如果給deletefiber函式傳遞乙個無效的引數的話,deletefiber函式除了會丟擲乙個異常以外,還是將程序的lasterror值設定為具體出錯原因的代號。然而,如果程序正在被除錯的話,這個lasterror值會被修改,因此如果偵錯程式繞過了第七步裡講的反除錯技術的話,我們還可以通過驗證lasterror值是不是被修改過來檢測偵錯程式的存在,示例**:
bool
;//
會丟擲乙個異常並被偵錯程式捕獲
deletefiber(fib);
// 0x57
的意思是
error_invalid_parameter
return (getlasterror() != 0x57);
}未完待續
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...
反除錯技術二
五 使用ntqueryinformationprocess函式 ntqueryinformationprocess函式是乙個未公開的api,它的第二個引數可以用來查詢程序的除錯埠。如果程序被除錯,那麼返回的埠值會是 1,否則就是其他的值。由於這個函式是乙個未公開的函式,因此需要使用loadlibra...
反除錯 時間
include include include using namespace std void isdebuger tbefore tafter return intmain rdtsc時鐘檢測反除錯 使用時鐘檢測方法是利用rdtsc這個彙編指令,它返回至系統重新啟動以來的時鐘數,並且將其作為乙個...