免杀初探(一)
字数 2513 2025-08-09 16:00:17
免杀技术初探:原理、工具与实践
前言与基础概念
在当今网络安全环境中,杀毒软件作为第一道防线被广泛使用。研究防病毒软件的工作原理、发现其引擎漏洞并找到绕过方法,对于评估安全解决方案的有效性至关重要。
基础工具介绍
Process Explorer (微软官方工具):
- 功能:监控进程及其详细信息
- 关键参数解读:
- Process:进程文件名及图标
- CPU:进程CPU占用百分比
- Private Bytes:进程分配的内存量
- Working Set:进程占用的RAM量
- PID:进程标识符
- Description:进程描述
- Company Name:所属公司名称
Process Monitor:
- 用于监控防病毒软件的文件扫描过程
- 关键信息:
- Event:事件日期、操作结果、可执行路径
- Process:相关流程信息
- Stack:进程堆栈
Autoruns:
- 显示系统中所有自启动位置,包括:
- 注册表路径:
- HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
- HKLM\System\CurrentControlSet\Services
- HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
- 文件路径:
- %AppData%\Microsoft\Windows\Start Menu\Programs\Startup
- 注册表路径:
Regshot:
- 开源注册表比对工具
- 使用方法:
- 安装前拍摄第一个快照
- 安装后拍摄第二个快照
- 比较两次快照差异
Windows安全机制
核心安全特性
-
ASLR (地址空间布局随机化):
- 随机化内存地址空间布局
- 防止利用固定内存位置漏洞
-
DEP (数据执行保护):
- 阻止在非可执行内存区域执行代码
- 缓解缓冲区溢出攻击
-
SEHOP (结构化异常处理覆盖保护):
- 防止滥用SEH结构的攻击
- 可通过组策略部署
保护环与权限模型
- Windows访问控制列表(ACL/DACL):
- 每个文件/对象都有权限设置
- 包含两部分:
- 接收权限的安全主体
- 对象获得的特定权限
防病毒软件漏洞类型
1. 权限相关问题
-
静态签名文件权限不足:
- 低权限用户可能修改/删除签名文件
- 导致扫描时比对失效
-
未引用的服务路径:
- 服务可执行路径包含空格且未加引号
- 利用方法:
- 在服务路径中的特定位置创建恶意可执行
- 系统将优先执行恶意文件而非防病毒服务
2. DLL劫持
- 利用Windows不安全的DLL加载机制
- 当软件使用LoadLibrary()加载DLL时:
- 可替换原始DLL为同名恶意DLL
- 可能导致防病毒软件加载恶意DLL而失效
- 常用于"白+黑"技术
3. 缓冲区溢出
两种类型:
- 基于堆栈的缓冲区溢出
- 基于堆的缓冲区溢出
利用步骤:
- 使程序崩溃定位漏洞点
- 确定溢出所需字节数
- 覆盖EIP/RIP寄存器
- 注入shellcode
- (可选)注入NOP雪橇
- 跳转到payload执行
防病毒场景应用:
- 利用防病毒解压引擎的strcpy()等不安全函数
- 溢出缓冲区导致引擎崩溃或跳过检测
进程注入技术
基本原理
将代码注入到目标进程的内存地址空间并执行,可注入:
- Shellcode
- DLL文件
- 完整EXE文件
技术实现
DLL注入:
- 使用API:
- OpenProcess:获取目标进程句柄
- VirtualAllocEx:分配内存
- WriteProcessMemory:写入恶意负载
- CreateRemoteThread:创建远程线程执行
- LoadLibrary/GetProcAddress:获取函数地址
Process Hollowing:
- 创建挂起状态的合法进程(如notepad.exe)
- 使用ZWUnmapViewOfSection取消映射进程节
- VirtualAllocEx分配新内存
- WriteProcessMemory写入恶意内容
- SetThreadContext和ResumeThread恢复执行
Process Doppelgänging:
- 基于NTFS事务特性(TxF)
- 关键API:
- CreateFileTransacted
- WriteFile
- NtCreateSection
- RollBackTransaction
- 系列创建和执行函数
PE文件结构
主要部分:
-
PE头:
- DOS头:标识PE文件的魔数
- DOS存根:遗留信息(可能被用于免杀)
- PE头:声明文件格式
- 可选头:包含代码大小、入口点等信息
- 区段表
-
PE节:
- 代码节:CPU执行的机器码
- 导入节:从DLL导入的函数
- 数据节:变量和函数参数
DLL执行方式:
- 使用rundll32.exe:
RUNDLL32.EXE <dllname>,<entrypoint> <argument> - 使用LoadLibrary()/LoadLibraryEx()
内存轰炸技术(Memory Bombing)
原理
通过分配超大内存迫使杀毒软件因资源限制放弃检测
实现方法
使用C函数:
malloc():分配未初始化内存calloc():分配并初始化为零的内存free():释放分配的内存
POC示例:
int main(){
char *memory_bombing = NULL;
memory_bombing = (char *)calloc(200000000, sizeof(char));
if(memory_bombing != NULL){
free(memory_bombing);
payload();
}
return 0;
}
技术优势
- 利用防病毒引擎的内存扫描限制
- 大内存分配导致引擎放弃扫描
- 不影响最终恶意代码执行
研究与实践建议
-
环境准备:
- 使用最新版杀毒软件并更新签名库
- 断开互联网连接避免云检测干扰
- 使用最新版操作系统
-
检测方法:
- 静态代码分析:检测特定函数组合
- 运行时监控:识别进程注入行为
-
工具链:
- Process Explorer/Monitor:进程分析
- Autoruns:持久化位置检查
- Regshot:注册表变更分析
- 调试器(IDA Pro/x64dbg):漏洞分析
-
绕过方法分类:
- 基于漏洞的绕过(如缓冲区溢出、DLL劫持)
- 基于检测的绕过(如进程注入、内存轰炸)
通过深入理解这些技术和原理,安全研究人员可以更有效地评估防病毒解决方案的实际防护能力,并开发相应的防御措施。