首页  >  文章  >  电脑教程  >  我们一起聊聊利用Windows页防护机制进行函数挂钩

我们一起聊聊利用Windows页防护机制进行函数挂钩

WBOY
WBOY转载
2024-03-26 09:40:47861浏览

摘要

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删除