无文件落地木马检测的实战策略
一个简单寻找无文件落地后门与内存免杀shellcode的工具
在企业内部网络里,常常会碰到“看不见、摸不着”的威胁——无文件落地木马。它们不在磁盘留下任何痕迹,却能在内存里偷偷运行,给传统的防病毒方案制造了巨大的盲区。要想在实战中把这类隐蔽程序拦截下来,光靠签名比对显然不够,需要把目光投向进程的运行时行为。
从内存分配切入:定位异常 VirtualAlloc 区域
大多数文件less 载荷都会调用 VirtualAlloc 或 NtAllocateVirtualMemory 来申请可执行内存,然后把经过 XOR、AES 等混淆的 shellcode 写进去。实战中可以借助 StackWalkEx 对活跃线程进行栈回溯,筛选出栈帧指向的地址落在这些新分配的可执行页上。若发现同一进程频繁创建并执行新页,往往意味着“自制”代码正在运行。
硬件断点(HWBP)与异常返回的双重校验
硬件断点是捕获内存写入的利器。将 HWBP 设置在 NtWriteVirtualMemory、WriteProcessMemory 等写入函数入口,一旦触发就记录下写入目标、写入长度以及当前调用栈。随后再比对这些写入是否对应已知的 PE 头特征(MZ 标记),若出现“写入后立即跳转执行” 的模式,基本可以判定为“无文件落地木马”。
可疑进程画像:签名、节区与加载方式
- 签名过期或根本没有签名的进程;
- 拥有异常多的可执行节(.text、.code)且每个节大小都在 10~30 KB 之间;
- 进程启动时间与系统启动时间相差极小,却在系统运行数小时后才出现异常行为;
- 加载的模块列表中缺少文件路径,仅显示 “[Memory]”。
把这些画像与实时进程监控结合,能够在几秒钟内筛选出潜在的文件less 载荷。比如在一次红队演练中,安全团队仅用 30 秒就捕获到一名攻击者利用 PowerShell 生成的内存 PE,随后通过上述 HWBP+栈回溯手段锁定了对应的 Cobalt Strike beacon。
根植于日志的持久化追踪
单次检测固然重要,持续追踪更能发现隐藏在多次小规模内存分配背后的“慢性”威胁。建议在 SIEM 中建立如下查询模板:
EventID=4688 AND NewProcessName="*\[Memory]"
| stats count by ProcessId, CommandLine, TimeGenerated
| where count > 5
一旦同一进程在短时间内出现多次“内存加载”记录,便触发告警。配合上文的 HWBP 捕获信息,几乎可以在攻击链的早期阶段“拔掉”它的根基。
如果你已经在使用传统的 AV 与 EDR,却仍然感受到“隐形”威胁的压力,那么不妨把注意力从磁盘转向内存,从函数调用转向栈帧回溯,或许能在不经意间发现那颗潜伏已久的病毒种子。

参与讨论
这玩意儿真能绕过EDR?我们公司上个月就被搞了,怀疑就是这种内存马
PowerShell现在默认行为监控开了吗?没开的话是不是很容易中招?
前几天刚排查过类似事件,发现[Memory]进程但没深挖,看完这篇有点后怕
感觉还行,不过HWBP在高负载环境会不会误报太多?
又是红队秀操作…实际蓝队哪有这么多资源实时栈回溯啊🤔
我试过用Sysmon抓4688事件,但日志量爆炸根本看不过来,有优化建议吗?
VirtualAlloc频繁调用确实可疑,但有些合法程序也会这样,咋区分?
内存马防不胜防,现在连杀毒软件都摸不到边了,头疼