免杀基础(1)-免杀技术及原理

 

0x00 免杀的基本概念

免杀就是反病毒技术,它指的是一种使病毒木马免于被杀软查杀的技术,由于免杀技术的涉猎范围非常广,其中包含反会变、逆向工程、系统漏洞等和可技术,所以难度很高,其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。

 

0x01 杀毒软件检测方式

基于文件扫描的反病毒技术

基于文件扫描的反病毒技术可以分为三种,分别是“第一代扫描技术”、“第二代扫描技术”、“算法扫描”。

第一代扫描技术

第一代扫描技术的核心用一句话就可以概括——在文件中检索病毒特征序列,虽然出现的比较早,但是直到现在也仍然被个大杀软厂商使用着,其主要分为“字符串扫描技术”和“通配符扫描技术”两种

字符串扫描技术

使用从病毒中提取出来的具有特征的一段字符来检测病毒,这些字符必须在一般程序中不太可能出现。例如一个隐藏执行格式化所有硬盘的命令不可能出现在普通程序中,可以将其作为特征字符。

通配符扫描技术

由于字符串扫描技术有执行速度与特征码长度的限制,所以正在逐渐被通配符扫描技术取而代之。现在反病毒软件中简单的扫描器通常支持通配符。扫描器中的通配符一般用于跳过某些字节或字节范围,而现在大多数扫描器已经支持正则表达式了。下面通过一个例子来说明通配符扫描技术的原理,例如病毒库中有以下一段特征码:

......020E 07BB ??02  %3  56C9......

可以将其解释如下:

  • 尝试匹配02,如果找到则继续否则返回为假
  • 尝试上一匹配目标后匹配0E,如果找到则继续否则返回为假
  • 尝试上一匹配目标后匹配07,如果找到则继续否则返回为假
  • 尝试上一匹配目标后匹配BB,如果找到则继续否则返回为假
  • ??表示忽略此字节
  • 尝试上一匹配目标后匹配02,如果找到则继续否则返回为假
  • 在接下来的3个位置(字节)中尝试匹配56,如果找到则继续,否则返回假
  • 尝试上一匹配目标后匹配C9,如果找到则继续,否则返回假

由于这种技术支持半字节匹配,这样可以更加精确地匹配特征码,一些早期的加密病毒使用这种方法都能比较容易地检测出来。

第二代扫描技术

第二代扫描技术以“近似精确识别法”和“精确识别法”为代表,除此之外还有“智能扫描法”与“骨架扫描法”,第二代扫描技术与第一代相比,对检测精度提出了更严格的要求。

智能扫描法

忽略检测文件中像NOP这种无意义的指令。而对于文本格式的脚本病毒和宏病毒,则可以替换多余的格式字符,如空格、换行符或制表符等。所有的替换动作均在扫描缓冲区中执行,大大提高了扫描器的检测能力。

近似精确识别法

多套特征码该方法采用至少两个字符串集来检测每个病毒,如果扫描器检测到其中一个特征符合,将会将其识别为变种,但不会执行清除病毒体的操作。如果使用的多个特征码全部符合,则会执行清除病毒体的操作。校验和这个方法是让每一个无毒软件生成一个校验和,等待下次扫描时在进行简单的校验和对比,如果校验和发生变化,再进行其他的扫描,否则则说明这个文件没有被感染,由于不需要对所有文件进行扫描,大大提升了扫描器的效率,但是严格来说这并不算扫描技术,目前,某些安全厂商还对病毒采取了分块校验的方式以提高识别的准确性。以上两种方式只是近似精确识别法中的两种,近似精确识别法中包含了若干种方法,这里就不进行一一介绍了。

骨架扫描法

由大名鼎鼎的卡巴斯基公司发明,在检测宏病毒时效果特别显著,没有使用上面所说的特征码和校验和而是采用逐行解析宏语句,并将所有非必要字符丢弃,只剩下代码的骨架,对代码骨架进行进一步的分析,在一定程度上跳了对变种病毒的检测能力。

精确识别法

目前唯一能保证扫描器精确识别病毒变种的方法,通常情况下与第一代扫描技术结合使用。精确识别法也是利用校验和技术,不过应用更广、更负责。甚至能通过对整个病毒进行校验和计算来生成特征图。

基于内存扫描的反病毒技术

内存扫描器一般与实时监控型扫描器协作,从理论上来杀软的文件扫描组件能识别的病毒,内存扫描器也能识别。但是由于程序在运行后会将自身释放到内存中,导致释放后的文件结构与未执行的文件相比有较大的差异。因此在内存扫描时和文件扫描时所使用的特征码很多情况下使用的不是一套。当病毒被加载到内存中就证明它要开始执行一些动作,在病毒或木马初始化运行环境时,会让更多的可疑点暴露出来,为了进一步提高效率和准确性,杀软厂商一般会为内存扫描组件单独定义一套新的特征码。

基于行为监控的反病毒技术

此类反病毒技术一般需要虚拟机与主动防御等技术配合使用。其原理是,监控程序的行为,并将其与病毒木马行为进行分析比对,如果某些程序在执行会进行一些可疑的操作,那么即使是一个新生病毒,也会被拥有这种技术的反病毒产品所拦截。ps:行为——应用程序运行后的操作。行为特征——一个程序按照某种顺序执行某一系列操作所具有的特征。下面以一个典型的木马程序为例,进行解释。一个木马程序,可能执行的操作步骤如下

  • 释放一些文件到系统关键目录中
  • 修改系统设置使这些新释放的文件可以自启动
  • 删除自身

如果一个程序执行的操作具有上述特征,那么这个系统大概率就是木马

基于新兴技术的反病毒技术

云查杀

云查杀用一句话概括就是——“可信继承,群策群力”,也正因此,云查杀以及其跟随衍生出来的技术也是最具有挑战性的。云查杀的基本思路就是以服务器为脑,以所有用户的机器为触角,从而使服务器可以随时知道每个用户的情况,如果其中一个用户与其他用户对比产生差异,那么服务器就会发出指令,让发生异常的机器检查出问题所在。并将问题反馈给服务,让问题在干扰到其他用户之前被扼杀掉。上面我们提到的其他用户是整个信任机制的根本,举例来讲,如果大多数机器都运行过一个软件,那么当一个新加入的机器也试图运行这个软件时,服务器就认为这是正常的,否则服务器就会发出相应指令让用户的机器去阻止其运行。

可信继承

整个云的信任机制是非常复杂的结构,其中包含用户参与的信任评价体系、反病毒专业人员参与的样本分析信任体系、服务端自动判断信任体系、基于数字签名的认证信任体系等。顶端的信任体系由数字签名、样本分析构成,这些顶端的信任体系在用户的机器上表现出来的形式就是“根可信进程”。所谓的“根可信进程”就是指可信进程链条的顶端,凡是由可信进程开启的新进程都被认为是可信的。举例解释一下,假如进程A是具有数字签名的根可信进程,那么它在被用户直接执行时就不会触发杀软的任何操作,且由A进程创建的新进程也成为可信进程。如果进程B是一个非可信程序,那么它在被用户执行时就会受到严密的监控,如果执行期间有什么敏感操作,样本会被马上提交到服务器进行处理。这样以来,基于云的信任网络会越来越庞大,其收集的信息也将也来越多。

群策群力

云计算和病毒木马的感染都具有分布性这一特点,这样一来,病毒木马感染的速度越快、感染的面积越广,其被云查杀捕获到的可能性就越大。只要某一台计算机上发现新病毒,它马上会被提交到服务端,在服务端快速更新后,所有在云中的计算机就都获得了对这种病毒的免疫力。

双引擎查杀/多引擎查杀

与字面意思相同,即同时运用两个反病毒引擎扫描病毒,其扫描的准确度会比单一反病毒引擎有所提高。通常,具有多个反病毒引擎的产品都会让用户选择扫描模式,如是启动某个引擎,还是启动所有引擎,因此在针对此类反病毒产品进行免杀的时候往往会在操作思路上将其分割为若干个反病毒产品,然后逐个攻破。

 

0x02 免杀技术发展史

  • 1989年:第一款杀毒软件Mcafee诞生,标志着反病毒与反查杀时代的到来。
  • 1997年:国内出现了第一个可以自动变异的千面人病毒(Polymorphic/MutationVirus)。自动变异就是病毒针对杀毒软件的免杀方法之一,但是与现在免杀手法的定义有出入。
  • 2002年7月31日:国内第一个真正意义上的变种病毒“中国黑客II”出现,它不但具有新的特征,还实现了“中国黑客”第一代所未实现的功能。可见这个变种也是病毒编写者自己制造的。
  • 2004年:在黑客圈子内部,免杀技术在这一年首次公开提出,由于当时还没有CLL等专用免杀工具,所以一般都使用WinHEX逐字节更改技术。
  • 2005年1月:大名鼎鼎的免杀工具CCL的软件作者tankaiha在杂志上发表了一篇文章,推广了CCL工具,从此国内黑客界才有了第一个专门用于免杀的工具。
  • 2005年的2~7月:通过各方面有意或无意的宣传,黑客爱好者们逐渐重视免杀技术,在一些黑客站点的木马专栏下,开始有越来越多的人讨论此技术,这也为以后木马免杀技术的火暴埋下根基。
  • 2005年8月:第一个可查的关于免杀的教学录像诞生,为大量黑客爱好者提供了一个有效的参考资料,成功地对免杀技术进行了第一次科普。
  • 2005年9月:免杀技术开始被越来越多的黑客技术爱好者知晓。

国内在1997年出现了第一个可以自动变异的千面人病毒,虽然自动变异也可以看作是针对杀毒软件的一种免杀方法,但是由于它与现在定义的免杀手法有出入,因此如果将国内免杀技术的起源定于1997年会显得比较牵强。国内在1997年出现了第一个可以自动变异的千面人病毒,虽然自动变异也可以看作是针对杀毒软件的一种免杀方法,但是由于它与现在定义的免杀手法有出入,因此如果将国内免杀技术的起源定于1997年会显得比较牵强。从国内免杀技术的发展过程来看,一直到2005年9月免杀技术才正式进入公众的视野。但是从国外的发展来看,20世纪80年代就已经出现了使用Rootkit反扫描技术的病毒,不过这属于一个源码级应用的例子。而国内的病毒或木马是什么时候开始使用Rootkit的呢?2003年还是2003年以后的某个日子?要知道国内各大论坛普遍出现系统内核利用的文章应该是从2007年~2008年才开始的。

 

0x03 免杀思路总结

免杀的最基本思路就是去除其特征,这个特征有可能是特征码,也有可能是行为特征,只要在不修改其原有功能的情况下,破坏了病毒与木马所固有的特征,一次免杀就能完成。

文件免杀

修改特征码

在讲述修改特征码前,先解释一下啥叫特征码特征码就是杀软用于判断文件是否带病毒的一段独一无二的代码,这些特征码在不同的杀软的病毒库中不同。但总体来说,特征码就是一种只在病毒或木马文件内才有的独一无二的特征,它或是一段字符,或者在特定位置调用的一个函数。总的来说,如果某个文件具有这个特征码,那杀软就会认为它是病毒。反之,如果将这些特征码从病毒、木马的文件中去除或破坏掉,那杀软就会认为它是一个正常文件。更改特征码达到免杀的效果实际上包含两种思想。一种方法是直接修改特征码,这也是免杀的最初方式,例如在木马病毒中有一句话表明它是木马,只要将相应地址内的那句话改成别的就可以了,在不影响功能的情况下,可以考虑直接删掉第二种方法是针对目前推出的校验和查杀技术,原理虽然仍是特征码,但已经不是纯粹意义上特征码的概念。其方法就是针对杀软匹配的特定区域的校验和进行修改,使得这一区域的校验和改变,从而完成免杀。也正因此,在定位特征码时,会存在定位了两次却得出不同结果。

花指令免杀

花指令就是一段毫无意义的指令,也称为垃圾指令,花指令对程序的运行和功能没有任何影响,它存在的唯一目的就是阻止反汇编程序,或者增加反汇编的难度。然而这种操作对杀软的影响也是致命的。它之所以能影响杀软是因为杀软是靠特征码判断文件是否有毒,然而目前各大安全厂商为了提高杀软的效率,会将特征码限制在一定偏移量之内,而添加花指令,程序的部分偏移会受到影响,若杀软不能识别这段花指令,检测特征码的偏移量会整体移一段位置,无法正常检测。这仅仅是针对第一代扫描技术的方法,不过即使是杀软采用虚拟机分析、校验和扫描或启发式分析,花指令也会起到一定的作用,针对不同的检测方式,花指令起到的作用也不同,其最根本的思想是扰乱程序运行顺序,并未破解者设下陷,若花指令可以成功保护软件真正代码不被轻易反汇编,那对于杀软来说,其检测的也并非木马或病毒的真正内容了。

加壳免杀

软件加壳也可称为软件加密(软件压缩),只是加密的方式与目的不同。加壳的目的是减少被加壳应用程序的体积,或避免让程序遭到不法分子的破坏与利用。很多人就会想,如果加壳的话会不会破坏程序,其实并不会,当我们运行这个加壳的程序时,系统首先会运行程序的“壳”,然后由壳将加密的程序逐步还原到内存中,最后运行程序。加密后的文件结构已经发生了巨大的变化,原有的特征码已经不知去向,杀软也就自然认为其为一个正常的文件。

内存免杀

众所周知CPU不可能为某一款加壳软件特别设计,因此某个软件被加壳后的代码CPU无法读懂,这就要求在执行外壳代码时,要先将原软件解密,并放到内存中,然后再通知CPU执行,因此杀软可以在这设立一个关卡对木马和病毒进行检测让其原形毕露,也正因此我们前面讲到的文件免杀在这里统统失效。于是我们考虑在内存中对抗杀软的查杀,其实思想与文件查杀一样,因为杀软的内存扫描原理与硬盘上的文件扫描原理一样,都是通过特征码对比,为了制造迷惑性,大多数杀软的内存扫描与文件扫描采用的特征码不同,就导致一个病毒木马同时拥有两套特征码,需要全部破坏掉才能躲避杀软的查杀,在一定程度上增加了免杀的难度。

行为免杀

杀软目前都有主动防御,对恶意行为进行拦截提示,比如这些行为:

  • 注册表操作、添加启动项、添加服务
  • 文件写入、读系统文件、删除文件、移动文件
  • 杀进程、创建进程
  • 注入、劫持等

行为拦截原理

归根结底,恶意行为都是通过API调用来完成的,所调用的API可能是一个,也可能是多个API组合,杀软通过技术手段拦截这些API调用,然后根据提前设置好的策略来判断是否属于恶意行为,因此我们想要对因为免杀做出相应的措施需要关注的只有两个关键点:

  • API
  • 策略(顺序,调用源,参数等等)

常见的行为免杀有如下几种方法

  1. 替换API使用相同功能的API进行替换,由于杀软只会针对一部分API进行拦截,对于API不能做到面面俱到的拦截,比如未导出API和底层API,所以这种方法还是有效的。
  2. 重写API完全重写系统的API功能,实现自己的对应功能API,对ring3的行为拦截非常有效。
  3. 合理更改调用顺序有时被拦截的行为是通过多个API组合来完成的,所以合理替换顺序,绕过杀软的拦截策略,也可以绕过行为拦截
  4. 绕过调用源通过调用其他进行功能来完成API的功能,最经典的通过rundll32.exe来完成dll的加载等。
(完)