SSDT HOOK實現程序保護

2021-05-23 01:42:32 字數 2327 閱讀 2862

**灰狐

ssdt hook已經是很老的技術了,但對新手來說還是有一些嚼頭的。根據常規的做法,我們應該掛鉤 zwterminateprocess函式,不過這個函式僅有兩個引數,其中乙個是程序控制代碼,它指定了需要被結束的程序。

由於我們不能直接從程序控制代碼獲取有關程序的一些資訊,這就使得一些「懶惰」的傢伙嘗試找一些捷徑。由 於要想獲得控制代碼通常都需要首先呼叫zwopenprocess,而zwopenprocess需要傳遞pid作為標識,於是有些人就不管 zwterminateprocess函式了,改為掛鉤zwopenprocess,這樣你無法開啟我們關注的程序,也就無法獲得控制代碼,自然也就沒辦法結 束我們的程序。

乍一看,這還是真是一種思路巧妙的做法。不過,點心畢竟是不能當正餐吃的,這樣的做法作為臨時救火也 沒什麼,要是一直抱著它不願放棄就大錯特錯了。

實際上,這種做法是有***的,比如通常在ring3使用psapi列舉程序時,我們經常使用下面的 **來獲取程序完整路徑:

handle hprocess = openprocess(

process_query_information | process_vm_read,

false,

processid[i]);

if(hprocess)

closehandle(hprocess);

如果我們掛鉤了zwopenprocess,那麼使用這種方法列舉程序的程式就可能無法獲得我們的保 護程序資訊。有人會說這樣還不好?不要忘了,我們的目的不是隱藏,而是保護。自我保護是任何人都無可非議的做法,但嘗試隱藏自身卻會讓人懷疑你的目的。

其實說穿了,我們掛鉤zwopenprocess的根本原因是不會使用控制代碼得到程序資訊。好吧,我們 現在就介紹如何通過程序控制代碼獲取資訊。

在爐子的《api hook實現ring3的程序保護》一文中給出了一種解決方法,即使用ntdll 匯出的

zw(nt)queryinformationprocess

函式。

下面我們看看這個函式的宣告:

ntsysapi 

ntstatus

ntapi

ntqueryinformationprocess(

in handle       

processhandle,

in processinfoclass 

processinformationclass,

out pvoid         

processinformation,

in ulong        

processinformationlength,

out pulong       

returnlength );

這個函式的關鍵是第二個引數,它決定了第三個引數輸出什麼結構。現在我們可以將其填寫為 processbasicinformation,這樣我們會獲得乙個process_basic_information結構的資訊輸出。而 process_basic_information結構的uniqueprocessid子域即是該控制代碼代表的程序id。

下面是通過控制代碼獲得pid的**:

ulong

lret;

pvoid

pbuffer;

process_basic_information  *pbi;

pbuffer = exallocatepool(pagedpool, sizeof(process_basic_information));

zwqueryinformationprocess(processhandle, 

processbasicinformation, 

pbuffer, 

sizeof(process_basic_information), 

&lret);

pbi = (struct _process_basic_information *)pbuffer;

kdprint(("processhandle代表程序%d!", pbi.uniqueprocessid));

有了pid剩下的就好辦了,我們可以使用函式pslookupprocessbyprocessid 來獲取該程序的eprocess結構,這個結構中就有程序名的資訊。

與之類似,檔案控制代碼可以通過zw(nt)queryinformationfile函式,登錄檔控制代碼 可以通過zw(nt)querykey函式來獲取有關資訊。

另外還有一種較為通用的方法,即使用obreferenceobjectbyhandle函式和 obquerynamestring函式配合使用。它可以通過程序控制代碼、檔案控制代碼、登錄檔控制代碼獲取完整的路徑資訊。

SSDT HOOK 記憶體寫保護

有些人說不去掉也不會藍屏,照樣能hook成功 確實,我當時也是這樣過。不過拿給別人機器一測試就藍了 網上找到了mj給出的答案 當使用大頁面對映核心檔案時,段和資料段在一塊兒,所以頁必須是可寫的,這種情況下直接改是沒有問題的 hkey local machine system currentcontr...

驅動實現程序保護

基於ssdt hook hook zwterminateprocess對傳入的程序進行檢查,如果匹配,則返回拒絕訪問 include include include ssdthook.h typedef enum system information class system information...

關於SSDT HOOK取消記憶體寫保護的問題

有些人說不去掉也不會藍屏,照樣能hook成功 確實,我當時也是這樣過。不過拿給別人機器一測試就藍了 網上找到了mj給出的答案 當使用大頁面對映核心檔案時,段和資料段在一塊兒,所以頁必須是可寫的,這種情況下直接改是沒有問題的 hkey local machine system currentcontr...