guard pages是操作系統(tǒng)中的一種內(nèi)存保護機制,用于檢測和防止內(nèi)存的非法訪問。在windows操作系統(tǒng)中,guard pages通常位于內(nèi)存頁的末尾,這些頁面通常是未分配或不可訪問的。guard pages的主要功能是提高系統(tǒng)的安全性,防止惡意程序或錯誤訪問內(nèi)存,從而保護系統(tǒng)免受潛在的風(fēng)險和安全漏洞。通過使用guard pages,操作系統(tǒng)可以及時發(fā)現(xiàn)并阻止對內(nèi)存的非法操作,確保系統(tǒng)的穩(wěn)定性和安全性。
當(dāng)程序嘗試訪問Guard Page時,操作系統(tǒng)會立即識別并觸發(fā)異常,通常是訪問違例異常。這種異常的產(chǎn)生有助于程序及時發(fā)現(xiàn)內(nèi)存訪問錯誤,進而采取適當(dāng)?shù)拇胧?,如終止程序或記錄錯誤信息,以防潛在的安全漏洞被利用。通過這種方式,系統(tǒng)能夠保持對內(nèi)存訪問的控制,確保程序運行的穩(wěn)定性和安全性。 Guard Page的設(shè)置為系統(tǒng)提供了一種有效的機制,用于監(jiān)視和保護內(nèi)存訪問,使得任何潛在的問題都能夠被及時發(fā)現(xiàn)和處理,從而提高了系統(tǒng)的穩(wěn)定性和安全性。通過異常的觸發(fā),程序能夠在錯誤發(fā)生時快速做出響應(yīng),有效地防止可能導(dǎo)致嚴重后果的內(nèi)存訪問問題。
Guard Pages在Windows Hooking中被廣泛應(yīng)用,用于監(jiān)測和攔截對特定內(nèi)存區(qū)域的訪問。通過這種技術(shù),可以實現(xiàn)對系統(tǒng)功能的修改或監(jiān)視,為軟件調(diào)試、安全研究和惡意軟件分析等領(lǐng)域提供有力支持。Guard Pages的特點是能夠檢測對受保護內(nèi)存的訪問,并在訪問發(fā)生時觸發(fā)相應(yīng)的處理程序。這種機制對于保護關(guān)鍵數(shù)據(jù)或代碼非常有用,可以有效防止未經(jīng)授權(quán)的訪問和潛在的安全漏洞。通過合理配置Guard Pages,可以提高系統(tǒng)的安全性和穩(wěn)定性,確保系統(tǒng)
整體代碼如下:
#include #include // Hook函數(shù)功能 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); // 這里調(diào)用原始CreateThread函數(shù) //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和標(biāo)準(zhǔn)I/O操作的函數(shù)和定義。
本代碼定義了一個鉤子函數(shù)hook,用于攔截Windows應(yīng)用程序中創(chuàng)建線程的CreateThread API函數(shù)。在鉤子函數(shù)內(nèi)部,展示了兩個消息框,以提示CreateThread函數(shù)的調(diào)用情況并表明它已被hook。需要注意的是,在這段代碼中,并沒有實際調(diào)用原始的CreateThread函數(shù),而是進行了攔截處理。
定義了一個處理函數(shù), 并使用AddVectoredExceptionHandler將其設(shè)置為異常處理程序, 這個函數(shù)被設(shè)計用來處理異常,特別是STATUS_GUARD_PAGE_VIOLATION,這是一種在受保護的內(nèi)存頁上嘗試執(zhí)行代碼時發(fā)生的異常。 如果異常代碼是STATUS_GUARD_PAGE_VIOLATION,并且指令指針(Rip)指向CreateThread函數(shù),它會顯示一條消息,并修改Rip指向鉤子函數(shù)。 任何嘗試調(diào)用執(zhí)行CreateThread函數(shù)的操作都將被重定向到執(zhí)行鉤子函數(shù)。
在主函數(shù)內(nèi)部,聲明了一個變量old,但未被使用。 一個param變量被設(shè)置為5000,并調(diào)用AddVectoredExceptionHandler函數(shù)將處理程序函數(shù)注冊為異常處理程序。 使用VirtualProtect在CreateThread函數(shù)上設(shè)置了一個守衛(wèi)頁面。如果嘗試執(zhí)行它,這將觸發(fā)處理程序函數(shù)。 使用printf顯示了CreateThread函數(shù)的地址。 使用CreateThread創(chuàng)建了一個新線程,但似乎并沒有提供任何實際目的,因為該線程只是休眠了5000毫秒。 等待線程結(jié)束后,打印“YEP!”。
將代碼編譯后執(zhí)行,效果如下:
圖片
以上就是我們一起聊聊利用Windows頁防護機制進行函數(shù)掛鉤的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號