反除錯技術二

2021-07-14 04:15:32 字數 1773 閱讀 1938

五、使用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這個彙編指令,它返回至系統重新啟動以來的時鐘數,並且將其作為乙個...