ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Voidgate三大核心机制拆解:VirtualAlloc、硬件断点与VEH如何协同工作

Voidgate三大核心机制拆解:VirtualAlloc、硬件断点与VEH如何协同工作 Voidgate三大核心机制拆解VirtualAlloc、硬件断点与VEH如何协同工作【免费下载链接】VoidgateA technique that can be used to bypass AV/EDR memory scanners. This can be used to hide well-known and detected shellcodes (such as msfvenom) by performing on-the-fly decryption of individual encrypted assembly instructions, thus rendering memory scanners useless for that specific memory page.项目地址: https://gitcode.com/gh_mirrors/vo/VoidgateVoidgate 是一个围绕内存扫描绕过bypass AV/EDR memory scanners展开的教学型 C 项目它演示如何让 shellcode 在内存中始终保持 XOR 加密仅在 CPU 执行到某条指令的瞬间用 VEH 单步解密这一条指令执行完立即重新加密使内存扫描器在任何时刻都抓不到完整的 shellcode 特征。本文带你拆解 VirtualAlloc、硬件断点与 VEH 三大核心机制是如何协同工作的。 先搞懂Voidgate 要解决什么问题传统内存扫描如 AV/EDR 的内存扫描器会遍历进程内存匹配已知 shellcode 特征码例如 msfvenom 生成的载荷。常见的对抗思路是先加密驻留、执行前解密但一旦解密完成完整明文就暴露在内存中扫描器迟早能抓到。Voidgate 的答案是任何时刻内存里最多只有一条解密后的汇编指令。对比项常规 shellcode 执行Voidgate 方式内存中的 shellcode解密后完整驻留始终加密仅当前指令为明文内存扫描器视角可匹配完整特征码只能看到密文 单条指令执行速度正常每条指令触发一次异常处理明显变慢适用场景通用小型初始载荷如 msfvenom 反弹 shell一句话概括三大角色⚙️VirtualAlloc准备一块可执行 可读写的内存舞台硬件断点HWBP在 shellcode 入口处精准踩刹车把执行流交给异常机制️VEH扮演贴身调试器每条指令执行前后完成解密/加密并用单步模式持续接力。 机制一VirtualAlloc 开辟可执行内存区入口代码在voidgate-master/Voidgate/main.cpp。程序启动后第一件事是调用VirtualAlloc以PAGE_EXECUTE_READWRITE权限申请一段堆内存第 17 行大小 加密载荷长度 前后各 32 字节0x20填充填充常量定义在voidgate-master/Voidgate/Voidgate.h第 6 行的SHELLCODE_PADDING。关键细节有三个整块内存先填充 NOP0x90再把加密后的 shellcode 拷到中间第 29-31 行——这段内存海绵让载荷边界不那么生硬也预留了容错空间程序记录三个全局地址payload_base入口点、payload_lower_bound、payload_upper_bound第 25-33 行这三个地址是后面 VEH 判断当前指令是不是我们的 shellcode的唯一依据。为什么必须可执行 可读写因为 VEH 要在这块内存上边执行、边原地改写解密/加密普通的只读代码段做不到。 机制二硬件断点——在入口处精准踩刹车SetHardwareBreakpoint函数voidgate-master/Voidgate/Voidgate.cpp第 72-92 行是第二个角色。它通过GetThreadContext/SetThreadContext操作当前线程的调试寄存器Dr0写入 shellcode 入口地址第 81 行——在哪个地址踩刹车Dr7设置启用位第 82 行——让刹车生效。硬件断点相比软件断点如int 3有一个关键优势内存里不会多出任何可见字节。扫描器翻遍内存也找不到断点痕迹只会看到纯密文。当main把执行流跳转到 payload 入口第 36-44 行时CPU 一碰到 Dr0 指定的地址就触发调试异常——相当于给 VEH 递上了第一根接力棒。️ 机制三VEH 单步解密——永远只解密一条指令main.cpp第 39 行通过AddVectoredExceptionHandler注册 VEH处理函数VehDecryptHeapAsm位于voidgate-master/Voidgate/Voidgate.cpp第 10-70 行。它的工作循环可以概括为五步只认领单步异常异常码不是EXCEPTION_SINGLE_STEP就放行给其他处理器第 65-68 行范围校验读取 RIP若不在 payload 上下界内比如跳进了 kernel32 的函数直接恢复执行、不做任何加解密第 24-27 行加密上一条把全局变量last_decrypted_asm记录的那条已执行指令重新 XOR 加密第 32-46 行解密当前条以 RIP 为起点 XOR 解密当前指令最多 15 字节即 x64 单条指令最大长度常量见Voidgate.h第 7 行第 48-59 行设置单步标志在 EFlags 中置位 TRAP 标志第 21 行保证下一条指令再次触发异常循环继续。XOR 密钥的偏移并不是固定的GetXorKeyIndexForAsm第 94-100 行用「当前指令地址 − 载荷基址」对密钥长度取模保证同一条指令每次加解密都用同一组密钥字节。密钥同时硬编码在main.cpp第 9 行和加密工具voidgate-master/XorEncryptPayload/XorEncryptPayload.cpp第 59 行中两端必须完全一致否则解出来的就是乱码。 三者协同一条指令的完整生命周期把三个机制串起来执行流是这样接力的VirtualAlloc铺好可执行内存密文 shellcode 就位main.cpp 第 17-33 行硬件断点守在入口主线程跳转后立刻被调试异常拦下VEH 接管解密第 1 条指令置位 TRAP放行执行同时记下这条指令的地址CPU 执行完这 1 条指令 → TRAP 触发EXCEPTION_SINGLE_STEPVEH 回来把第 1 条重新加密解密第 2 条再次置位 TRAP如此逐条接力……内存扫描器任意时刻采样都只能看到密文 1 条明文指令shellcode 执行完毕回连成功VirtualFree释放内存main.cpp 第 48 行。 六步复现 PoC从 msfvenom 到回连成功想亲手验证这套内存扫描绕过机制按下面顺序操作即可仓库获取git clone https://gitcode.com/gh_mirrors/vo/Voidgate用 msfvenom 生成目标载荷README 给出的示例为 x64 反弹 TCP shell运行XorEncryptPayload.exe shellcode文件路径完成 XOR 加密工具会直接输出 C 数组把输出的数组替换voidgate-master/Voidgate/main.cpp中的payload[]确认加密工具与main.cpp中的 XOR 密钥完全一致在监听机上启动nc -nvlp 443执行Voidgate.exe稍等片刻即可看到回连。⏱️ 注意由于每条指令都要走一遍异常处理官方说明每次至少额外执行 300 条指令执行速度会显著变慢——msfvenom 这类求小而慢的载荷甚至可能耗时 15 秒以上这是机制的固有代价而非 bug。⚠️ 已知限制哪些场景不适合 VoidgateREADME 明确列出了三条限制研究或复现前务必了解限制原因影响执行极慢每条指令都触发 VEH 加解密大型、循环密集型载荷基本不可用载荷内NtCreateThread新建线程新线程没有安装硬件断点入口在新线程里的载荷会失败载荷内部引用自身数据内嵌字符串、常量等VEH 只解密 RIP 处的代码不解密数据区取到的是密文行为异常因此 Voidgate 最适合作为初始接入的小载荷或 stage-1 引导载荷先落地再拉取剩余 payload。✅ 总结一张表看懂三大核心机制机制核心 API职责源码位置可执行内存区VirtualAlloc分配 RWX 内存铺 NOP 与密文voidgate-master/Voidgate/main.cpp硬件断点SetThreadContextDr0/Dr7在入口无痕拦截执行流voidgate-master/Voidgate/Voidgate.cppVEH 单步解密AddVectoredExceptionHandler逐条解密/加密维持仅一条明文voidgate-master/Voidgate/Voidgate.cppVoidgate 的价值不在于某个单一 API而在于三者协同形成的闭环VirtualAlloc 提供可原地改写的舞台硬件断点提供无痕的第一脚刹车VEH 提供持续单步的解密引擎。理解了这条接力链你就掌握了内存扫描绕过中最经典的运行时逐指令解密范式。本项目为学术目的实际使用请遵守当地法律法规。【免费下载链接】VoidgateA technique that can be used to bypass AV/EDR memory scanners. This can be used to hide well-known and detected shellcodes (such as msfvenom) by performing on-the-fly decryption of individual encrypted assembly instructions, thus rendering memory scanners useless for that specific memory page.项目地址: https://gitcode.com/gh_mirrors/vo/Voidgate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表