首頁  >  文章  >  電腦教學  >  我們一起聊聊利用Windows頁防護機制進行函數掛鉤

我們一起聊聊利用Windows頁防護機制進行函數掛鉤

WBOY
WBOY轉載
2024-03-26 09:40:47819瀏覽

摘要

Guard Pages是作業系統中的一種記憶體保護機制,用於偵測和防止記憶體的非法存取。在Windows作業系統中,Guard Pages通常位於記憶體頁的末尾,這些頁面通常是未分配或不可存取的。 Guard Pages的主要功能是提高系統的安全性,防止惡意程式或錯誤存取內存,從而保護系統免受潛在的風險和安全漏洞。透過使用Guard Pages,作業系統可以及時發現並阻止對記憶體的非法操作,確保系統的穩定性和安全性。

當程式嘗試存取Guard Page時,作業系統會立即識別並觸發異常,通常是存取違例異常。這種異常的產生有助於程式及時發現記憶體存取錯誤,進而採取適當的措施,如終止程式或記錄錯誤訊息,以防潛在的安全漏洞被利用。透過這種方式,系統能夠保持對記憶體存取的控制,確保程式運作的穩定性和安全性。 Guard Page的設定為系統提供了一種有效的機制,用於監視和保護記憶體訪問,使得任何潛在的問題都能夠被及時發現和處理,從而提高了系統的穩定性和安全性。透過異常的觸發,程式能夠在錯誤發生時快速做出回應,有效地防止可能導致嚴重後果的記憶體存取問題。

Guard Pages在Windows Hooking中被廣泛應用,用於監測和攔截對特定記憶體區域的存取。透過這種技術,可以實現系統功能的修改或監視,為軟體調試、安全研究和惡意軟體分析等領域提供強大支援。 Guard Pages的特點是能夠檢測對受保護記憶體的訪問,並在訪問發生時觸發相應的處理程序。這種機制對於保護關鍵資料或程式碼非常有用,可以有效防止未經授權的存取和潛在的安全漏洞。透過合理配置Guard Pages,可以提高系統的安全性和穩定性,確保系統

實作過程

整體程式碼如下:

#include 
#include 

// Hook函数功能
HANDLE hook(LPSECURITY_ATTRIBUTES rcx, SIZE_T rdx, LPTHREAD_START_ROUTINE r8, LPVOID r9, DWORD stck1, LPDWORD stck2) {
MessageBoxA(0, "CreateThread() was called!", "YAY!", 0);
MessageBoxA(0, "Hooked CreateThread", "YAY!", 0);
// 这里调用原始CreateThread函数
//return CreateThread(rcx, rdx, r8, r9, stck1, stck2);
 return NULL;
}

LONG WINAPI handler(EXCEPTION_POINTERS * ExceptionInfo) {
 if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) {
if (ExceptionInfo->ContextRecord->Rip == (DWORD64) &CreateThread) {
 printf("[!] Exception (%#llx)!" , ExceptionInfo->ExceptionRecord->ExceptionAddress);
printf("nClick a key to continue...n");
 getchar();
 ExceptionInfo->ContextRecord->Rip = (DWORD64) &hook;
printf("Modified RIP Points to: %#llxn", ExceptionInfo->ContextRecord->Rip);
printf("Hook Function = %#llxn", (DWORD64) &hook);
}
return EXCEPTION_CONTINUE_EXECUTION;
 }
 return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
 DWORD old = 0;
DWORD param = 5000;
 AddVectoredExceptionHandler(1, &handler);
 VirtualProtect(&CreateThread, 1, PAGE_EXECUTE_READ | PAGE_GUARD, &old);
 printf("CreateThread addr = %#pn", &CreateThread);
 
 HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) &Sleep, ¶m, 0, 0);
 WaitForSingleObject(hThread, param);
 printf("YEP!n");

 return 0;
}

頭檔部分:

程式碼從包含必要的頭檔開始,包括和 ,它們分別提供了Windows API和標準I/O操作的函數和定義。

Hook函數:

本程式碼定義了一個鉤子函數hook,用於攔截Windows應用程式中建立執行緒的CreateThread API函數。在鉤子函數內部,展示了兩個訊息框,以提示CreateThread函數的呼叫情況並表明它已被hook。要注意的是,在這段程式碼中,並沒有實際呼叫原始的CreateThread函數,而是進行了攔截處理。

異常處理

定義了一個處理函數, 並使用AddVectoredExceptionHandler將其設定為異常處理程序, 這個函數被設計用來處理異常,特別是STATUS_GUARD_PAGE_VIOLATION,這是一種在受保護的記憶體頁上嘗試執行程式碼時發生的異常。如果異常碼是STATUS_GUARD_PAGE_VIOLATION,且指令指標(Rip)指向CreateThread函數,它會顯示一則訊息,並修改Rip指向鉤子函數。任何嘗試呼叫執行CreateThread函數的操作都會被重定向到執行鉤子函數。

主函數

在主函數內部,宣告了一個變數old,但未被使用。一個param變數被設定為5000,並呼叫AddVectoredExceptionHandler函數將處理程序函數註冊為異常處理程序。使用VirtualProtect在CreateThread函數上設定了一個守衛頁面。如果嘗試執行它,這將觸發處理程序函數。使用printf顯示了CreateThread函數的位址。使用CreateThread創建了一個新線程,但似乎並沒有提供任何實際目的,因為該線程只是休眠了5000毫秒。等待線程結束後,列印“YEP!”。

測試

將程式碼編譯後執行,效果如下:

我們一起聊聊利用Windows頁防護機制進行函數掛鉤

# 圖片

以上是我們一起聊聊利用Windows頁防護機制進行函數掛鉤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:mryunwei.com。如有侵權,請聯絡admin@php.cn刪除