病毒扫描软件由两部分组成:一部分是病毒代码库,含有经过特别选定的各种计算机病毒的代码串;另一部分是利用该代码库进行扫描的扫描程序。病毒扫描程序能识别的计算机病毒的数目完全取决于病毒代码库内所含病毒的种类有多少。病毒代码串的选择是非常重要的。短小的病毒只有一百多个字节,病毒代码长的有上IOKB字节的。如果随意从病毒体内选一段作为代表该病毒的特征代码串,可能在不同的环境中,该特征串并不真正具有代表性,不能用于将该串所对应的病毒检查出来。选这种串做为病毒代码库的特征串就是不合适的。代码串一定要在仔细分析了程序之后才能选出最具代表特性的,足以将该病毒区别于其它病毒和该病毒的其它变种的代码串。
一般情况下,代码串是连续的若干个字节组成的串,但是有些扫描软件采用的是可变长串,即在串中包含有一个到几个 “模糊”字节。扫描软件遇到这种串时,只要除 “模糊”字节之外的字串都能完好匹配,则也能判别出病毒。
例如给定特征串:\7C 00 10 ? 37 CB”则 “E9 7C 00 10 27 37 CB”和 \”都能被识别出来。
一些AV产品,当匹配一个特征串后,再对剩余部分计算CRC来确认。为了提高扫描速度,扫描串一般是20-30个字节,并且只是从固定的指令开始,比如
\\
当扫描未知病毒时,大多数AV产品使用模拟器(emulation),而有一些仍然在使用特征串扫描。 4.3.2 特征字扫描
特征字识别法是基于特征串扫描法发展起来的一种新方法。特征字识别法 只需从病毒体内抽取很少几个关键的特征字,组成特征字库。由于需要处理的字节很少,而又不必进行串匹配,大大加快了识别速度,当被处理的程序很大时表现更突出。
使用基于特征串扫描法的查病毒软件方法与使用基于特征字识别法的查病毒软件方法是一样的。只要运行查毒程序,就能将己知的病
12
毒检查出来。将这两种方法应用到实际中,都需要不断地对病毒库进行扩充,一捕捉到病毒,经过提取特征并加入到病毒库,就能使查病毒程序多检查出一种新病毒来。 4.4如何发现变形病毒和未知病毒 4.4.1简单变形
对于前面提到的简单变形,AV可以用特征码模糊匹配它的解密头。如:
Mov ecx, Virus_Size Mov edi,Virus_Start Decrypt: xor [edi], key Loop Decrypt
这段代码Virus_Size, Virus_Start, key是变化的,其他是固定的,正好适应于模糊匹配。 4.4.2模拟器 (Emulator)原理
实现启发扫描的就是模拟器,它截获文件操作,让文件先在VM中运行一段时间,未发现病毒再让程序真正运行。检测变形病毒时,模拟器运行文件代码,跟踪文件映像的虚拟内存,发现连续的内部被修改后,会认为这是被解密的代码,在从中扫描特征串来发现病毒。 为了避免模拟器永远运行下去,当它运行到指令条数的上限时,或遇到未知API时就会停止 (因为它不知道API有多少参数,无法正常返回)。为了提高模拟器的效率,它还使用了很多技巧: 1.排除字符串
比如,如果一个程序含有这条指令\,机器码有3种形式 05 03 00 00 00 ;32位立即数 83 CO 03 ;带符号 81 CO 03 00 00 00 ;不带符号
13
如果一个变形病毒只能在1,3两种情况下变化,那么如果发现了指令2,那么就可以排除这种病毒的可能性。 2.包含字符串
如果一个病毒包含了\,等无用指令,那么如果在文件中找不到这些指令,就认为文件没有感染这种病毒。
3.遍历所有分支
最新的模拟器并不是按照程序的流程执行,因为有些病毒的执行存在一定的概率,它产生一个随机数,符合一定条件时在运行,否则返回宿主,那么很可能逃过模拟器。所以,模拟器会遍历程序所有分支,遇到不可到达的再回溯,这样,可以有效的对付这类病毒。 4.根据病毒行为特征
变形病毒在复制自身时,两个版本几乎找不到任何两个相同的字节,是特征穿完全失效。几乎等同于未知病毒。但是从感染文件的角度来说,并无特别之处。这就可以用启发式来判断以下方面: 1)入口是否在最后一个段
目前病毒体积很大,通常给宿主文件添加一个节,存放病毒。 2)入口是否己imp开始
其实是最简单的EPO.JMP到病毒执行。好处是不必修改入口。 3)Size0fCode错误
病毒具有代码段的属性,但有些病毒不把自己体积计算到SizeofCode 4)可疑的节名
和正常的编译器生成的节名不同,病毒的节有自己的特色名字。 5)从Keme132中导入的可疑函数,比如使用索引。 正常程序不会这样做,直接引用函数。 6)入口附近存在重定位代码(CALL/POP) 病毒必备。
14
7)多个PE头
原来的PE头不够大,自己生成一个。 8)不正确的校验和
很多病毒不重新计算校验和。· 9)打了补丁的输入节
很可能挂接了APL病毒常用手段。 同时结合以下技巧: 1)排除字符串 2)感染标记 3)垃圾代码 4)解密例程
注意,这些是病毒未在虚拟机中运行前的判断,上面提到的可以功能是在运行程序中发现的,不可混淆。
另外,还可以根据某些特性判断变形病毒,比如前面获得api地址中提到
的,获取API地址通常是一个循环,按照固定次序。
模拟器到达Get Proc Address。的第一条指令后,会停下来判断参数,如果模拟器检测到获得地址的顺序和病毒相同,就可以增加是病毒的可疑度。
4.4.3传统扫描技术与启发式代码分析扫描技术的结合运用 前面论述了启发式代码分析技术的优点和长处,会不会引起某些人的误解,以为传统的检测扫描技术就可以丢弃了呢?情况当然不是这样。从实际应用的效果看来,传统的手法由于基于对已知病毒的分析和研究,在检测时能够更准确,减少误报;但如果是对待此前根本没有见过的新病毒,由于传统手段的知识库并不存在该类 (种)病毒的特征数据,则有可能产生漏报的严重后果。而这时基于规则和定义的启发式代码分析技术则正好可以大显身手,使这类新病毒不至成为漏网之
15
鱼。传统与启发式技术的结合支用,可以使病毒检测软件的检出率提高到前所未有的水平,而另一方面,又大大降低了总的误报率。详见以下测试实验结果对比数据:
分析的结论相一,致那么真实的结果往往就如同其判断结论一样砍无,疑两种不同技术对同一检测样分析的结果不一致的情况比较少见,这种情形下需借助另外的分析去得出最后结论。
抛开启发式代码分析技术实现的具体细节和不同手法不谈,这种代表着未来反病毒技术发展的必然趋势具备某种人工智能特点的反毒技术,向我们展示了一种通用的、不需升级(较省需要升级或不依赖于升级)的病毒检测技术和产品的可能性,由于诸多传统技术无法企及的强大优势,必将得到普遍的应用和迅速的发展。资料显示,目前国际上最著名的排名在前五名的反病毒软件产品均声称应用了这项技术,从来自不同机构和出处的评测结果来看,纯粹的启发式代码分析技术的应用 不〔借助任何事先的对于被测目标病毒样本的研究和了解),已能达到80%以上的病毒检出率,而其误报率极易控制在0.1%之下,这对于仅仅使用传统的基于对己知病毒的研究而抽取 “特征字串”的特征扫描技术的查毒软件来说,是不可想象的,一次质的飞跃。在新病毒,新变种层出不穷,病毒数量不断激增的今天,这种新技术的产
16