红队攻防
近两年免杀技术年鉴
Python免杀技术实录
AD域攻防系列微课程
免杀技术入门基础知识
小迪安全知识库
-
+
首页
免杀技术入门基础知识
免杀技术入门基础知识
# 前言 在红队实战或者内网渗透中杀软(AV、EDR)是绕不开的"一道防线",无论是权限提升还是横向,都会被杀软发现拦截。对抗的检测能力在也在不断的提升,形成了"静态 + 动态 + 行为 + 云查 + 威胁情报"多维立体检测体系,免杀技术也在持续进化,攻防双方始终在互相博弈。 本文大致介绍主流杀软的工作原理,包括静态特征查杀、动态内存扫描、行为监控、启发式与机器学习等。还从实战角度出发,分类介绍当前主流的静态、内存、行为、加载免杀以及环境规避等技术手法,结合部分具体的绕过代码通过动态API解析、栈字符串混淆、无文件落地、反沙箱检测等手法提升免杀成功率,一份实用的参考。 # 一、杀软工作原理 ### 01、静态特征查杀:基于特征码的识别 * ## **原理** 提取病毒文件内的一段唯一性二进制串,静态扫描二进制串、哈希值 (MD5/SHA256)、模糊哈希 (SSDEEP) 以及 Yara 规则。  * ## 扫描范围 包括文件资源段、字符串表、输入表(IAT)如果你的程序调用了VirtualAllocEx和`CreateRemoteThread`这两个敏感API出现在IAT中就会大幅增加风险分值。 * ## 定位工具 ** 特征码定位可以通过 MyCCL、CheckPlease、AvClean 等工具定位特征吗。 ** **** * ## 补充 VirtualAllocEx和CreateRemoteThread组合风险很高在正常的程序中,基本不需要去操作其他进程的内存。 ``` (1)VirtualAllocEx:在远程进程中申请一块内存。 ``` 结果就是当杀软看到这两个函数同时出现在 IAT 时,程序意图把一段代码塞进别人的进程里执行。典型的代码注入行为,Loader 加载 ShellCode 的标配。 ### 02、动态内存查杀:运行时对抗 * ## 原理 当恶意代码在内存中解压并执行时,EDR 会定期扫描进程内存空间。  * ## 关键点 * **解密时刻** 加密后的 Shellcode 在执行前必须解密回明文,此时特征暴露。 * **堆栈回溯** EDR 会检查调用堆栈,判断 API 调用是否来自合法的模块(如`ntdll.dll`),还是来自一段无文件的私有内存。 * **代表产品** **Windows Defender** (`Scanning of arbitrary memory`) 和 **Kaspersky**。 ### 03、行为查杀:基于行为分析 * ## 原理 通过应用层Hook或者内核层回调监控敏感 API 调用。  * ## 监测点 * **文件操作** 在 C:\\Windows\\System32 等目录下创建文件。 * **注册表操作** 修改 Run 键值实现自启动。 * **网络操作** 非标准进程发起外部长连接。 * **敏感动作** 注入代码到 `lsass.exe` 或 `explorer.exe`。  ### 04、启发式与机器学习 * ## 启发式 根据经验规则打分。例如:一个程序没有图标、没有版本信息、还带有压缩壳、且尝试访问网络 = 判定为木马。  * ## 云查杀 利用**查询指纹**,一旦一个样本在某台机器被确认为恶意,全球同步封杀。  通过全球安全厂商、企业用户、研究机构共享威胁数据,构建实时更新的威胁情报网络。 # 二、免杀技术分类  ### 01、静态免杀:规避不落地与特征隐藏 **(1)特征码修改**:加花指令、改字符串、调整入口点(EP)。 (2)Shellcode加密:不再推荐简单的 XOR(容易被启发式扫描发现)。目前主流是 **AES-256**、**RC4** 或 **基于 IPv4/IPv6 地址格式的混淆**(将 Shellcode 伪装成一系列 IP 地址)。 **(3)资源修改**:图标、版本信息、数字签名(使用 **SigThief** 等工具伪造签名)。 **(4)加壳**:强壳(如 VMP)虽然静态强,但其 **壳本身特征** 极重,常被杀软直接报“压缩壳/加密壳”而杀掉。建议使用自制简单的混淆壳。  ### 02、内存免杀:对抗运行时扫描 ****(1)**睡眠混淆:程序在休眠期间加密自身的内存空间并挂起线程,躲避周期性扫描(如 SystemBC 采用的技术)。** ****(2)**堆内存加密**:将敏感数据存在堆中并加密。 ****(3)**避免 Private Memory**:利用 **模块覆盖 (Module Overloading)** 将恶意代码写入合法的 DLL 内存段中。 ### 03、行为执行免杀:对抗 API Hook  **(1)直接系统调用:不调用** `kernel32.dll` 中的 API,而是直接通过汇编指令 `syscall` 进入内核,绕过用户态 Hook。进阶:**Indirect Syscalls**(间接系统调用),通过在 `ntdll.dll` 中寻找 `syscall` 指令跳回执行,规避堆栈检查。 **(2)动态调用:手动在内存中寻找 API 地址,不通过导入表,避开静态分析。** **(3)UnHooking**:在程序运行时,从磁盘读取一份干净的 `ntdll.dll` 覆盖掉内存中被杀软 Hook 过的版本。  ### 04、传输与加载:分离免杀 **(1)资源分离**:Shellcode 放在图片(隐写术)、文本文件或远程 Web 服务器上。  **(2)白加黑:利用有合法签名的白程序(如 Office、微信组件)加载带有恶意代码的同名 DLL。** ### 05、环境规避:反沙箱反分析 ###  沙箱和虚拟机的环境特征通常与真实的物理机办公环境有很大差异。 * **硬件特征检测** * **CPU 核心数** 沙箱为了节省资源,通常只分配 1核 或 2核。检测到核心数 < 4 可认为可疑。 * **内存大小** 沙箱内存通常较小(如 2GB 或 4GB)。检测到内存 < 4GB 可认为可疑。 * **MAC 地址** 检查网卡 MAC 地址前缀(OUI)是否属于 VMware (00:50:56, 00:0C:29) 或 VirtualBox (08:00:27)。 * **用户交互特征检测 (最有效)** * **鼠标移动** 真实用户肯定会移动鼠标。记录鼠标当前位置,Sleep 几秒后再次记录,如果没有变化,大概率在沙箱中。 * **开机时间** 使用 GetTickCount64 获取开机时间。沙箱通常是每次扫描时新启动的,开机时间很短。 * **特定的分析工具检测** * 使用 FindWindow 检测是否存在 Wireshark, x64dbg, Process Hacker 等逆向分析工具的窗口。 * 检测 PEB.BeingDebugged 标志位判断自身是否处于被调试状态。 * **时间加速检测** * 某些沙箱会 Hook Sleep 函数,将其时间缩短为 0 以加速分析。 * **对抗策略** 在 Sleep 前后分别调用 GetSystemTime 计算时间差。如果时间差远远小于设定的 Sleep 时间,说明被沙箱欺骗了,直接退出。  环境探测代码本身也可能被杀软作为恶意特征,不要堆砌过多的探测代码选择 2-3个最有效、最不像恶意的探测方式(如鼠标轨迹检测、CPU核心数检查)即可。最好的处理方式是:**执行一段正常无害的业务逻辑,或者无限进入深度睡眠。** 三、杀软识别 在执行敏感恶意操作(如释放木马、注入进程、连接 C2)之前,先确认自己是不是在沙箱里,或者机器上有没有极其难搞的 EDR。 01、杀软识别 * **进程枚举** * 使用 CreateToolhelp32Snapshot 或 EnumProcesses 遍历当前运行的进程。 * 匹配常见杀软进程名:如 ZhuDongFangYu.exe (360), avp.exe (卡巴斯基), MsMpEng.exe (Defender), TMBMSRV.exe (趋势科技)。 * **加载模块 (DLL)** * 很多 EDR 会向所有进程注入 DLL 用于 Hook。 * 检查自身进程中是否加载了可疑模块:如 sysmon64.dll (Sysmon), qax\_safe.dll (奇安信), hmpalert.dll (Sophos)。 * **服务与注册表探测** * 查询特定的 Windows 服务是否处于运行状态。 * 检查特定的注册表键值是否存在。 在线杀软识别辅助平台:https://av.aabyss.cn  四、特征码规避 01、简单案例:以 nc.exe 为例修改特征码规避查杀 **(1)生成切片文件**:打开 MyCCL,载入 nc.exe。第一段 0000 是文件序号,第二段是开始位置,第三段是长度。生成一系列用于测试的文件块。 **** **(2)杀软扫描与二次处理**: 使用目标杀软对生成的文件夹进行扫描。 删除报毒的文件(留下未报毒的,说明这些没包含特征码)。 在 MyCCL 中点击“二次处理”,工具会根据剩余文件计算出特征码的大致范围。  **(3)复合定位缩小范围**: 特征区间,“复合定位此处特征码”。 重复“生成 -> 扫描 -> 删毒 -> 二次处理”的过程,不断缩小范围(如将分块数量改为 100 细化)最终将范围锁定在极小的字节内。   **(3)十六进制修改与测试**: 使用010Editor或者其他的十六进制工具打开原始的nc.exe跳转到定位的偏移地址。 修改保存这段特征码(例如:将原来的符号修改为十六进制的 5E,即 ^ 符号)。    五、静态免杀规避 01、分离免杀规避 用Loader与ShellCode分离的方式来规避杀软,这里实验用远程加载并且做了如下5点规避手法。 (1)动态 API 解析 / 隐藏导入表:不直接调用系统API VirtualAlloc,通过解析 PE 结构(导出表)动态获取函数地址。这样编译出的程序导入表(IAT)非常干净,杀软无法知道程序会进行网络请求和内存分配。 (2)栈字符串混淆:将敏感的函数名、URL 拆分成单字符数组。这样在编译后,静态文件中不会出现完整的字符串明文,安全软件的 strings 分析工具无法提取到特征。 (3)无文件落地 / 内存直接执行:把网络下载的恶意载荷直接放入内存中运行,全程不生成实体文件(不写入硬盘)绕过杀毒软件的文件监控和磁盘扫描。 (4)反沙箱检测:通过检查系统特征来判断是否处于杀软的虚拟分析环境(沙箱)中。比如沙箱通常是纯净环境不会有U盘插入记录,如果没有记录则直接退出程序。 (5)脱离 C 运行库依赖:不调用 C 标准库strcmp,全部自己手写。结合上面的动态 API 解析,这使得这段代码可以作为纯粹的Shellcode被注入到别的进程中执行,不依赖宿主程序的任何库文件。 > 最后在用VisualStudio编译的时候也要配置一下,尽可能的消除静态特征。   
xiaodi
2026年4月29日 19:13
0 条评论
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
分享
链接
类型
密码
更新密码
有效期
Markdown文件
Word文件
PDF文档
PDF文档(打印)