VEH Hook 及 检测

SEH(Struct Exception Handler,结构化异常) VEH(Vector Exception Handler,向量异常处理)
SEH是OS提供给线程来感知和处理异常的一种回调机制。
在Intel Win32平台上,由于FS寄存器问题指向当前的TIB(线程信息块),因此FS:[0]处能找到最新的一个EXCEPTION_REGISTRATION_RECORD结构。
typedef struct _EXCEPTION_REGISTRATION_RECORD {
    struct _EXCEPTION_REGISTRATION_RECORD *Next;
    PEXCEPTION_ROUTINE Handler;
} EXCEPTION_REGISTRATION_RECORD;
EXCEPTION_ROUTINE (
    _Inout_ struct _EXCEPTION_RECORD *ExceptionRecord,
    _In_ PVOID EstablisherFrame,
    _Inout_ struct _CONTEXT *ContextRecord,
    _In_ PVOID DispatcherContext
    );

typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE;
typedef struct _EXCEPTION_RECORD {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    struct _EXCEPTION_RECORD *ExceptionRecord;
    PVOID ExceptionAddress;
    DWORD NumberParameters;
    ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
    } EXCEPTION_RECORD;
   
XP之后,在基于线程的SEH基础增加了基于进程的VEH
比较:
1.SEH基于线程,VEH基于进程
2.优先级:调试器 > VEH > SEH 即KiUserExceptionDispatcher()函数先检查进程是否处理调试,然后VEH,最后SEH.
3.SEH单链表,VEH双链表,VEH节点可挂在头上或尾上。
注册VEH的回调API:
PVOID WINAPI AddVectoredExceptionHandler(
  __in  ULONG FirstHandler,
  __in  PVECTORED_EXCEPTION_HANDLER VectoredHandler
);

IA-32处理器定义了8个调试寄存器(DR0-DR7) DR0-DR3用于指点内存地址或I/O地址 DR4-DR5保留,DR6事件发生报告详细信息,DR7定义中断条件。
硬件断点HOOK是结合DR0-DR3调试寄存器和Winows SEH或VEH机制所引入的HOOK机制,因不涉及修改代码,不易检验检测到。

 

//测试EXE
#include <stdio.h>
#include <Windows.h>
#include <vector>

typedef LONG  (WINAPI *PVECTOREDEXCEPTIONHANDLER)(PEXCEPTION_POINTERS ExceptionInfo);

typedef PVOID (WINAPI *ADDVECTOREEXCEPTIONHANDLER)(
    ULONG FirstHandler,
    PVECTOREDEXCEPTIONHANDLER VectoredHandler
);

typedef struct _VECTORED_EXCEPTION_NODE {
LIST_ENTRY ListEntry;
PVECTORED_EXCEPTION_HANDLER pfnHandler; // 该指针出于安全目的已经被加密
} VECTORED_EXCEPTION_NODE, *PVECTORED_EXCEPTION_NODE;

LONG CALLBACK VectoredHandlerinit1(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
    return EXCEPTION_CONTINUE_SEARCH;
}
LONG CALLBACK VectoredHandlerinit2(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
    return EXCEPTION_CONTINUE_SEARCH;
}
LONG CALLBACK VectoredHandlerinit3(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
    return EXCEPTION_CONTINUE_SEARCH;
}


LONG CALLBACK VectoredHandler(__in  PEXCEPTION_POINTERS ExceptionInfo)
{
	ExceptionInfo;
	return EXCEPTION_CONTINUE_EXECUTION;
}

int CheckVEHHook(std::vector&
### 实现VEH Hook绕过安全检测的技术方案 #### 1. 理解VEH机制 Vector Exception Handler(VEH) 是Windows操作系统提供的一种异常处理机制,允许应用程序注册自己的异常处理器来捕获并响应特定类型的异常。当发生指定类型的异常时,系统会调用已注册的VEH回调函数,在这里可以执行自定义逻辑[^1]。 #### 2. 隐藏VEH钩子的存在 为了使VEH挂钩不易被发现,一种方法是在安装过程中尽可能减少对目标进程的影响。例如,可以在加载阶段动态创建而非静态编译入PE文件;或者利用其他合法模块作为载体间接注入代码片段。 #### 3. 使用混淆技术保护shellcode 针对基于特征码扫描的安全产品,可以通过加密、编码等方式隐藏实际payload的内容。每次触发前即时解密有效载荷部分,并确保其仅存在于内存中的短暂时间内[^2]。 #### 4. 动态分配与释放资源 为了避免长期占用固定地址空间引起怀疑,可采用按需申请的方式获取必要的工作区。完成任务后立即清理现场,不留痕迹地撤回所使用的句柄和其他对象。 #### 5. 利用内核模式下的辅助功能 某些情况下还可以借助Ring0级别的支持来进行更深层次的操作,如修改页表项属性以控制访问权限等高级特性。不过这种方法风险较高且容易引发蓝屏等问题,因此除非必要否则应谨慎考虑[^3]。 ```cpp // 示例:简单展示如何设置一个基本的VEH handler而不暴露明显特征 #include <windows.h> LONG WINAPI VectoredHandler(EXCEPTION_POINTERS* ep){ // 自定义处理逻辑... return EXCEPTION_CONTINUE_SEARCH; } void InstallVEHHook(){ AddVectoredExceptionHandler(TRUE, VectoredHandler); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值