内存PE加载器:一种绕过EDR检测的无文件攻击技术
内存PE加载器:一种绕过EDR检测的无文件攻击技术
近年来,一种新型的攻击技术逐渐在高级持续性威胁(APT)和红队行动中流行起来,它通过将恶意文件作为内存中的可移植可执行文件(PE)加载器运行,成功绕过了多种端点检测与响应(EDR)系统的检测。这种技术之所以难以防御,在于它充分利用了现代安全防护体系中对“可信进程”的依赖和文件扫描机制的盲区。
技术核心:在内存中加载并运行PE文件
这项技术的关键在于“无文件”执行。攻击者首先利用一个已被系统信任的合法进程,从远程服务器(如GitHub或其他可托管代码的平台)下载一个完整的PE文件——可能是远控木马、信息窃取程序或其他后门工具。
与传统的恶意软件不同,该PE文件并不会被写入目标的磁盘。相反,它被完整地载入内存,成为一个字节数组。随后,攻击者使用自定义的PE加载器,在宿主进程的内存空间中手动重建该可执行文件的结构,并最终触发其执行。
由于整个过程中恶意文件从未落地,依赖静态文件扫描或基于磁盘行为分析的EDR和传统防病毒软件往往难以察觉其存在。
攻击流程拆解
整个攻击流程可以概括为以下几个关键阶段:
-
远程下载PE至内存
攻击者通过调用InternetOpenUrlA
及InternetReadFile
等Windows网络API,将远程PE文件以二进制数据流的形式读入内存缓冲区。此阶段常被伪装为常规网络流量,难以引起警报。 -
解析PE结构并分配内存
加载器首先解析PE文件的DOS头和NT头结构,获取其区块布局、入口点及依赖信息。接着,利用VirtualAlloc
申请一块具有读写执行权限的内存区域,用于映射PE映像。 -
映射区块与修复依赖
PE的各个区块(如代码段.text
和数据段.data
)被复制到刚分配的内存中,并按照其虚拟地址偏移进行对齐。随后,加载器遍历导入表,通过LoadLibraryA
和GetProcAddress
动态解析所需DLL函数的实际地址。 -
处理重定位与内存权限
如果PE映像无法在其首选基址加载,则需对代码中的重定位项进行修正。接着,调用VirtualProtect
为不同区块设置适当权限,例如将代码段设为可执行,数据段设为可读写。 -
执行入口点
一切准备就绪后,加载器直接跳转至PE文件的入口点地址,恶意代码即在合法进程的上下文内开始运行。
为何能绕过EDR?
这种攻击之所以有效,是因为它具备以下几个特点:
- 信任继承:恶意代码在受信进程内执行,继承了该进程的安全上下文与令牌。
- 无文件特征:不产生文件写入,规避了基于文件的检测与扫描。
- 模仿合法行为:PE加载过程模拟了Windows系统自身加载器的行为,不易被行为检测机制标记为异常。
- 内存隐匿:恶意代码完全运行于内存中,除非EDR具备实时内存扫描与深度行为分析能力,否则难以发现。
实际影响与防御思考
包括Microsoft Defender for Endpoint、Sophos XDR在内的多款知名EDR产品,在实际攻防对抗中已被证实会受到此类技术的影响。尽管该技术并非无法检测——例如结合人工智能对进程行为进行异常分析、监控非常规内存分配与API调用链等——其实施门槛与检测成本仍不对称。
这一趋势也提醒我们,现代安全防护必须超越对文件扫描的依赖,加强对内存操作、进程行为、API调用序列等深层行为的监控与分析。企业应考虑部署具备动态行为分析、运行时内存检测能力的下一代EDR,并实施“最小权限原则”和应用程序白名单策略,构建起纵深防御体系。