DbgNexum 是一个概念验证程序,利用 Windows 调试 API 和共享内存(文件映射)注入 shellcode。它避免直接写入和读取远程内存,而是通过上下文操作强制目标进程自行加载和执行有效负载。
该注入器附加到目标进程并创建一个挂起的线程。通过调试循环,它设置一个硬件断点,在特定的返回地址处捕获执行。每次捕获时,注入器修改 CPU 寄存器以模拟函数调用,在目标进程内部编排一系列 Windows API 函数调用。
在编写本 README 时,我针对 MDE 和 Elastic 测试了该技术,两者均未检测到它。
WriteProcessMemory / VirtualAllocEx: 有效负载通过 CreateFileMapping 和 MapViewOfFile 传输。ReadProcessMemory: 该方法从线程上下文中获取所有关键信息。该 PoC 使用一个经过 XOR 处理的 msfvenom shellcode,用于生成“calc.exe”。但请使用你自己的 shellcode!
shellcode.h 中包含你的 shellcode(和 XOR 密钥)DbgNexum.exe <PID>
示例输出:
[i] Section 'MZ' created and shellcode copied
[+] Bait thread created. Setting HWBP on FileTimeToSystemTime
[i] Execution Redirected:
|-> [0] Preparation & anchoring stack
|-> [1] Setting HWBP & buffer alloc
|-> [2] Copying File-Mapping name
|-> [3] Zeroing stack slot
|-> [4] Opening handle to named file mapping
|-> [5] Mapping payload into mem. with exec. perm.
|-> [6] Cleanup & shellcode execution
[+] Successfully detached from process 19256
[i] Orchestration complete.
执行流程在注入器的调试循环与目标进程之间持续来回切换。
注入阶段
DebugLoop 函数包含主要的注入逻辑并编排“状态机”:
0. 准备阶段:
ret 调用。1. 分配阶段:
LocalAlloc 以(显然)分配一个小缓冲区。2. 数据设置阶段:
memcpy 将字符串 MZ 复制到先前分配的缓冲区中。3. 堆栈准备阶段:
memset 将一个堆栈槽清零。这是为了准备阶段 5,该阶段将调用 MapViewOfFile。由于该函数将使用超过 4 个参数,第 5 个参数通过堆栈传递(我们在此处设置)。4. 打开映射阶段:
OpenFileMappingA,使用在阶段 2 和 3 中“创建”的名称 MZ。5. 映射有效负载阶段:
MapViewOfFile。这将共享内存段(包含 shellcode)映射到目标地址空间,并具有 EXECUTE 权限。6. 执行阶段:
RIP 重定向到 MapViewOfFile 返回的地址。