7.4.1 恶意代码的常规检测方法
1.特征代码法
一种病毒可能感染很多文件或计算机系统的多个地方,而且在每个被感染的文件中,病毒程序所在的位置也不尽相同,但是计算机病毒程序一般都具有明显的特征代码,这些特征代码,可能是病毒的感染标记(一般由若干个英文字母和阿拉伯数字组成),例如,“1150”病毒的病毒代码中含有“Burdlar/H”或“The Grave of Granma”等;“快乐星期天”病毒的病毒代码中含有“Today is Sunday”;“1434”病毒的病毒代码中含有“it is my birthday”等。特征代码也可能是一小段计算机程序,它由若干个计算机指令组成,如Xq R(New century)病毒中“EB 68 90 07 BA ED OB C3”就可作为其特征代码,“1575”病毒的特征码可以是“0A0CH”(“1575”病毒的感染标识),也可以是从病毒代码中抽出的一组十六进制的代码“06 1E 8C C0 0E 07 A3”。特征代码不一定是连续的,也可以用一些通配符或模糊代码来表示任意代码,只要是同一种病毒,在任何一个被该病毒感染的文件或计算机中,总能找到这些特征代码。
将各种已知病毒的特征代码串组成病毒特征代码数据库,这样,可在通过各种工具软件检查、搜索可疑计算机系统(可能是文件、磁盘、内存等)时,用特征代码与数据库中的病毒特征代码逐一比较,就可确定被检计算机系统感染了何种病毒。
特征代码法被广泛应用于很多著名病毒检测工具中。国外专家认为特征代码法是检测已知病毒的最简单、开销最小的方法。特征代码法的实现步骤如下。
(1)采集已知病毒样本,同一种病毒,当它感染一种宿主时,就要采集一种样本,如果一种病毒既感染“.com”文件,又感染“.exe”文件以及引导区,就要同时采集“.com”型“.exe”型和引导区型三种病毒样本。
(2)在病毒样本中,抽取特征代码,依据如下原则:抽取的代码比较特殊,不大可能与普通正常程序代码吻合;抽取的代码要有适当长度,一方面维持特征代码的唯一性,另一方面又不要有太大的空间与时间的开销;在既感染“.com”文件又感染“.exe”文件的病毒样本中,要抽取两种样本共有的代码。
(3)将特征代码纳入病毒数据库。
(4)打开被检测文件,在计算机系统中搜索,检查计算机系统中是否含有病毒数据库中的病毒特征代码。如果发现病毒特征代码,由于特征代码与病毒一一对应,便可以断定被查文件中患有何种病毒。
这种方法不仅可检查计算机系统是否感染了病毒,并且可确定感染病毒的种类,从而能有效地清除病毒。但缺点是只能检查和发现已知的病毒,不能检查新出现的病毒,并且由于病毒不断变形、更新,老病毒也会以新面孔出现,或者病毒产生了变种,原特征代码不一定还能真正代表新的病毒变种,因此,病毒特征代码数据库和检查软件也要不断更新版本,才能满足使用需要。另外,如果特征代码选取不合适,则可能出现虚假报警,一个正常的程序,在特定的位置上,具有和病毒特征代码内容相同的机会虽然很小,但并不是没有,如果遇到这种情况,会把正常的程序当作病毒,从而在清除病毒时产生失误。
特征代码检测法的优点有:①检测准确,快速;②可识别病毒的名称;③误报警率低;④根据检测结果,可准确杀毒。特征代码检测法也有局限性:①它依赖于对已知病毒的精确了解,需要花费很多的时间来确定各种病毒的特征代码;②如果一个病毒的特征代码是变化的,这种方法就会失效;③随着病毒种类的增多,检索时间变长,如果要检索5 000种病毒,必须对5 000种病毒特征代码逐一检查,如果病毒种数再增加,检索病毒的时间开销就变得十分可观,此类工具检测的高速性将难以保障;④内存有病毒时一般不能准确检测病毒。
2.比较法
比较法是用正常的对象与检测的对象进行比较。比较法包括注册表比较法、长度比较法、内容比较法、中断比较法、内存比较法等。比较时可以靠打印的代码清单进行比较,或用软件进行比较(如EditPlus、UltraEdit等软件)。比较法不需要专用的检测恶意代码的程序,只要用常规工具软件就可以进行。而且用比较法还可以发现那些尚不能被现有杀毒程序发现的恶意代码。因为恶意代码传播得很快,新恶意代码层出不穷,由于目前还没有通用的能查出一切恶意代码或通过代码分析就可以判定某个程序中是否含有恶意代码的程序,因此,发现新恶意代码就只有靠手工比较分析法。比较法是反恶意代码工作者的常用方法。
(1)注册表比较法
当前的恶意代码越来越喜欢利用注册表进行一些工作(如自加载、破坏用户配置等),因此监控注册表的变化是恶意代码诊断的最新方法之一。目前网络上有很多免费的注册表监控工具(如Reg Mon等),利用这些工具可以发现木马病毒、恶意脚本等。
(2)文件比较法
普通计算机病毒感染文件,必然引起文件属性的变化,包括文件长度和文件内容的变化。因此,将无毒文件与被检测的文件的长度和内容进行比较,即可发现是否感染病毒。目前的文件比较法可采用File Mon工具。
以文件的长度或内容是否变化作为检测的依据,在许多场合是有效的。众所周知,现在还没有一种方法可以检测所有的恶意代码。文件比较法有其局限性,只检查可疑文件的长度和内容是不充分的。原因在于:
①长度和内容的变化可能是合法的,有些命令可以引起长度和内容变化;
②某些病毒可保证宿主文件长度不变。
在上述情况下文件比较法不能区别程序的正常变化和病毒攻击引起的变化,不能识别保持宿主程序长度不变的病毒,无法判定为何种病毒。实践证明,只靠文件比较法是不充分的,将其作为检测手段之一,与其他方法配合使用,才能发挥其效能。
(3)中断比较法
中断技术是传统病毒的核心技术,随着操作系统的发展,这种技术已经被现有恶意代码放弃。中断比较法作为对抗传统病毒的手段之一,已经不适用于对抗现有恶意代码。对中断比较法感兴趣的读者,建议查阅网络资料自学。
(4)内存比较法
内存比较法用来检测内存驻留型恶意代码。由于恶意代码驻留于内存,必须在内存中申请一定的空间,并对该空间进行占用、保护。通过对内存的检测,观察其空间变化,与正常系统内存的占用和空间进行比较,可以判定是否有恶意代码驻留其间,但无法判定为何种恶意代码。
使用比较法能发现系统的异常。例如,文件的长度和内容的变化。由于要进行比较,保留好原始备份是非常重要的,制作备份时必须保证在干净的环境里进行妥善保管。
比较法的优点是简单方便,无须专用软件。缺点是无法确认恶意代码的种类和名称。如果发现异常,造成异常的原因尚需进一步验证,以查明是否由于恶意代码造成的。可以看出,制作和保留干净的原始数据备份是比较法的关键。
3.行为检测法
利用恶意代码的特有行为特征监测恶意代码的方法称为行为监测法。通过对恶意代码多年的观察、研究,人们发现恶意代码有一些共性的、比较特殊的行为,而这些行为在正常程序中比较罕见。行为监测法就是监视运行的程序行为,如果发现了恶意代码行为,则报警。这些作为监测恶意代码的行为特征可列举如下。
(1)写注册表
像特洛伊木马、WebPage等恶意代码等都具有写注册表的特性。通过监测注册表读写行为,可以预先防范部分恶意代码。
(2)自动联网请求
自动联网请求行为是特洛伊木马、蠕虫等恶意代码的特征。监测应用程序的联网请求行为,也可以预防这部分恶意代码。现在市面上流行的个人防火墙就是通过监控自动联网请求来防止个人信息外泄的。
(3)病毒程序与宿主程序的切换
在染毒程序运行时,先运行病毒,而后执行宿主程序。在两者切换时,有许多特征行为。
(4)修改DOS系统数据区的内存总量
病毒常驻内存后,为了防止DOS系统将其覆盖,必须修改其内存总量。
(5)对“.com”和“.exe”文件做写入动作
病毒要感染可执行文件,必须写“.com”或“.exe”文件,然而在正常情况下,不应该对这两种文件进行修改操作。
(6)使用特殊中断
DOS时期的病毒几乎都使用特殊的中断。例如,引导区型病毒都会占用INT 13H功能,并在其中放置病毒所需的代码。
行为检测法的优点在于不仅可以发现已知恶意代码,而且可以相当准确地预报未知的多数恶意代码。但行为监测法也有缺点,即误报警和不能识别恶意代码名称,而且实现过程有一定的难度。
4.软件模拟法
多态病毒或多型性病毒即俗称的变形病毒。多态病毒每次感染都变化其病毒密码,这类病毒的代表是幽灵病毒。对付这种病毒,普通特征代码法无效。因为多态病毒对其代码实施密码变换,而且每次感染所用密钥不同。把染毒文件中的病毒代码相互比较,也不易找出相同的可能作为病毒特征的稳定代码。虽然行为检测法可以检测多态病毒,但是因为不知病毒的种类,所以在检测出病毒后,无法做杀毒处理。
一般而言,多态病毒采用以下几种操作来不断变换自己:采用等价代码对原有代码进行替换;改变与执行次序无关的指令的次序;增加许多垃圾指令;对原有病毒代码进行压缩或加密。但是,无论病毒如何变化,每一个多态病毒在其自身执行时都要对自身进行还原。为了检测多态病毒,反病毒专家研制了一种新的检测方法——软件模拟法。它是一种软件分析器,在虚拟内存中用软件方法来模拟和分析不明程序的运行,而且程序的运行不会对系统各部分起到实际的作用(仅是模拟),因而不会对系统造成危害,在执行过程中,从虚拟机环境内截获文件数据,如果含有可疑病毒代码,则杀毒后将其还原到原文件中,从而实现对各类可执行文件内病毒的查杀。
软件模拟技术又称为“解密引擎”“虚拟机技术”“虚拟执行技术”“软件仿真技术”等。它的运行机制是:一般检测工具纳入软件模拟法,这些工具开始运行时,使用特征代码法检测病毒,如果发现隐蔽式病毒或多态病毒嫌疑时,即启动软件模拟模块,监视病毒的运行,待病毒自身的密码译码后,再运用特征代码法来识别病毒的种类。
5.启发式代码扫描法
(1)启发式代码扫描法的原理
病毒和正常程序的区别可以体现在许多方面,比较常见的是通常一个应用程序在最初的指令是检查命令行输入有无参数项、清屏和保存原来屏幕显示等,而病毒程序则从来不会这样做,通常它最初的指令是直接写盘操作、解码指令,或搜索某路径下的可执行程序等相关操作指令序列。这些显著的不同之处,一个熟练的程序员在调试状态下可一目了然。启发式代码扫描技术实际上就是把这种经验和知识移植到一个查病毒软件的具体程序中体现。因此,在这里,启发式指“自我发现的能力”或“运用某种方式或方法去判定事物的知识和技能”。一个运用启发式代码扫描技术的病毒检测软件,实际上就是以特定方式实现的动态反编译器,通过对有关指令序列的反编译逐步理解和确定其蕴藏的真正动机。例如,如果一段程序以如下序列开始:
即调用格式化盘操作的BIOS指令功能,那么这段程序就高度可疑,值得引起警觉,尤其是假如这段指令之前不存在取得命令行关于执行的参数选项,又没有要求用户交互性输入继续进行的操作指令时,可以有把握地认为这是一个病毒或恶意破坏的程序。
在具体实现上,启发式代码扫描技术是相当复杂的。通常这类病毒检测软件要能够识别并探测许多可疑的程序代码指令序列,如格式化磁盘类操作,搜索和定位各种可执行程序的操作,实现驻留内存的操作,发现非常规的或未公开的系统功能调用的操作等,所有上述功能操作将被按照安全和可疑的等级排序,根据病毒可能使用和具备的特点而授以不同的加权值。例如,格式化磁盘的功能操作几乎从不出现在正常的应用程序中,而病毒程序中出现的概率极高,于是这类操作指令序列可获得较高的加权值,而驻留内存的功能不仅病毒要使用,而且很多应用程序也要使用,于是应当给予较低的加权值。如果对于一个程序的加权值的总和超过一个事先定义的阈值,那么,病毒检测程序就可以声称“发现病毒!”。仅仅一项可疑的功能操作远不足以触发“病毒报警”的装置,为减少虚警,最好把多种可疑功能操作同时并发的情况定为发现病毒的报警标准。
(2)启发式代码扫描通常应设立的标志
为了方便用户或研究人员直观地检测被测试程序中可疑功能调用的存在情况,病毒检测程序可以显示不同的可疑功能调用设置标志。
例如,TBSCAN这一病毒检测软件就为每一项它定义的可疑病毒功能调用赋予一个标志旗,如:
F=具有可疑的文件操作或有可疑进行感染的操作。
R=重定向项功能。程序将以可疑的方式进行重定向操作。
A=可疑的内存分配操作。程序使用可疑的方式进行内存申请和分配操作。
这样一来可以直观地帮助我们对被检测程序进行是否感染病毒的主观判断。
对于某个文件来说,被点亮的标志越多,感染病毒的可能性就越大。常规“干净的”程序甚至很少会点亮一个标志旗,但如果要作为可疑病毒报警,则至少要点亮两个以上标志旗。如果再给不同的标志旗赋予不同的加权值,情况还要复杂得多。
(3)关于虚警(谎报)
正如任何其他的通用检测技术一样,启发式代码扫描技术有时也会把一个本无病毒的程序指证为染毒程序,这就是所谓的查毒程序虚警或谎报现象。例如,常用的磁盘加密程序BITLOCK就显然含有病毒的功能:它必然修改可执行文件,以加入反备份代码,这是典型的文件型病毒行为,它足以触发检测病毒程序的报警装置。虽然BITLOCK就是通过往可执行文件中加入反备份代码来达到反备份目的,然而,检测程序并不能分辨出(对BITLOCK来说)这种类病毒行为的合法性,因此,检测程序只能判定BITLOCK程序是可能的病毒程序。
尽管有虚警和误报的缺点,和其他的扫描识别技术相比起来,启发式代码扫描技术还能提供足够的辅助判断信息让我们最终判定被检测的目标对象是染毒的还是“干净的”。启发式代码扫描技术仍然是一种正在发展和不断完善中的新技术,但已经在大量优秀的反病毒软件中得到迅速的推广和应用。