摘要
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頁防護機制進行函數掛鉤的詳細內容,更多請關注本站其它相關文章!