利用Windows页防护机制进行函数挂钩

系统 Windows
在主函数内部,声明了一个变量old,但未被使用。 一个param变量被设置为5000,并调用AddVectoredExceptionHandler函数将处理程序函数注册为异常处理程序。

摘要

Guard Pages是一种操作系统内存保护机制,旨在检测和防止对内存的非法访问。在Windows操作系统中,Guard Pages通常被用作内存页的末尾,它们通常是未分配或不可访问的内存页。

当程序试图访问一个Guard Page时,操作系统会检测到这种访问并引发异常,通常是访问冲突异常(如访问违例异常)。这种异常的引发使得程序能够及时检测到内存访问错误,从而可以采取适当的措施,例如终止程序或记录错误信息,以防止潜在的安全漏洞被利用。

在Windows Hooking中,利用Guard Pages可以用于检测和拦截对特定内存区域的访问,从而实现对系统功能的修改或监视。这种技术通常被用于软件调试、安全研究和恶意软件分析等领域。

实现过程

整体代码如下:

#include <windows.h>
#include <stdio.h>

// 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: %#llx\n", ExceptionInfo->ContextRecord->Rip);
            printf("Hook Function = %#llx\n", (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 = %#p\n", &CreateThread);
 
 HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) &Sleep, ¶m, 0, 0);
 WaitForSingleObject(hThread, param);
 printf("YEP!\n");
    
 return 0;
}

头文件部分:

代码从包含必要的头文件开始,包括 <windows.h> 和 <stdio.h>,它们分别提供了Windows API和标准I/O操作的函数和定义。

Hook函数:

定义了钩子函数hook。这个函数旨在充当CreateThread API函数的钩子,该函数负责在Windows应用程序中创建线程。 在钩子函数内部,显示了两个消息框,指示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!”。

测试

将代码编译后执行,效果如下:

图片图片

责任编辑:武晓燕 来源: 二进制空间安全
相关推荐

2013-04-26 09:45:35

2021-10-17 15:51:20

FIN7Windows 11黑客

2015-09-28 14:12:36

2011-07-11 17:00:07

Windows Vis控制台MMC

2013-04-11 16:30:59

2022-05-21 23:33:54

DDoS网络安全负载均衡器

2014-05-13 14:27:55

2022-05-26 08:31:41

分层机制优化

2010-09-26 16:19:18

2022-05-27 08:16:35

端点安全人工智能网络安全

2017-06-28 08:06:48

2018-10-10 05:12:35

2014-11-18 09:35:14

2014-03-31 10:51:40

pythonasyncio

2009-06-15 17:45:20

LINQ分组统计

2011-03-04 09:09:07

BlueJ

2017-08-16 10:12:10

CNN网络数据

2015-01-20 09:35:52

2014-06-20 14:07:49

2010-02-02 10:04:58

点赞
收藏

51CTO技术栈公众号