信息来源:瑞星
虚拟机技术并不是一项全新的技术。我们经常遇到的虚拟机有很多。比如象GWBasic这样的解释器、MicrosoftWord的WordBasic宏解释器、JAVA虚拟机等等。 虚拟机的应用场合很多,它的主要作用是能够运行一定规则的描述语言。
我们说“虚拟”二字,有着两方面的含义:其一在于运行一定规则的描述语言的机器并不一定是一台真实地以该语言为机器代码的计算机,比如JAVA想做到跨平台兼容,那么每一种支持JAVA运行的计算机都要运行一个解释环境,这就是JAVA虚拟机;另一个含义是运行对应规则描述语言的机器并不是该描述语言的原设计机器,这种情况也称为仿真环境。比如Windows的MS-DOS Prompt就是工作在V86 方式的一个虚拟机,虽然在V86方式,实x86指令的执行和在实地址方式非常相似,但是Windows为MS-DOS程序提供了仿真的 ( 相对于物理1M以下内存是虚假的) 内存空间。
跨越计算机平台?虚拟机也有很多,比较典型的是在很多Unix下运行MS-DOS或Windows程序的仿真器。在一台非WinTel计算机上运行 MS-DOS应用程序,首先需要对MS-DOS应用程序所使用的x86指令进行解释执行,并要提供完整的仿真MS-DOS中断、功能调用和绝大多数BIOS调用,并要解决MS-DOS 环境所使用的内存特点。 根据仿真的彻底程度不同,所获得的兼容性也是不同的。 如果要仿真 MS-Windows 程序的运行环境,除了上述工作以外,基本上要完整地再做一份完全兼容的 Windows API,并且会遇到DDE、OLE、DirectX 等类似的令人头疼的兼容性问题。同时,仿真运行的程序必定是以比宿主计算机慢得多的速度来运行的。
因此,我们大致可以看到一个比较完整的虚拟机需要在很多的层次上做仿真,总的来说是分为“描述仿真”和“环境仿真”两大块。最简单的仿真环境几乎不能算是虚拟机:比如为了运行使用磁盘加密而制作的钥匙盘仿真驻留程序,它仅仅做一些诸如修改Int13这样的小手段,而不(必)包括指令执行的“描述仿真”;而象 Sourcer 这样的反汇编工具则是更注重指令解释, 而不必关心程序的运行结果,因此在环境仿真上所做的工作要少得多。完整、复杂的虚拟机是几乎没有尽头的,假想我们要在一台Unix计算机上运行一个看VCD的Windows 95程序, 或是运行一个使用8259中断、8237DMA的程序……, 有些仿真在理论上是可以实现的,有些则很可能行不通。所以,一个实用的虚拟机是根据需要和可能这两方面的因素来构造的,要权衡时间/空间复杂度、仿真兼容性、 运行性能和代价等诸多因素,根据实际情况来设计和实现。
我们在谈论病毒之前,可以再回顾一下模式识别和人工智能中的一些颇有回味的问题。比如图象图形识别中,区分一个汉字的描述是很清楚的,比如“三点水”右面加一个“又”字就是汉字的汉,但汉字识别却不能单纯使用这样的直接标准;又比如对弈问题中,国际象棋的的输赢准则很清楚,简单地说就是老王被吃掉者为输、都吃不了就和,同样,这个标准是一个易于描述和判断却不易实现的标准。
回头我们再来看病毒。前面大家都谈到了,病毒的最终判定准则是其复制传染性。但这个标准是不易被使用和实现的。如果病毒已经传染了,才判定是它是病毒,必然会给病毒的清除带来麻烦 (正如看病确诊不能等病人咽气,而要使用病症其他的特征一样); 而且很多病毒的传染是有条件的,不是说让它传染就传染的;即使是能够有效地控制病毒的蔓延,如何判定它是感染了一个文件( 而不是一个程序对其他程序做正常的处理)也会有相当的难度(比如多态编码病毒),而且判定另一个文件是否被感染病毒的问题,必然会陷入病毒判定的递归。
因此,复制传染性仅仅是作为病毒区分的最终概念和标准,而不是实用的检查病毒的通常手段。那么检查病毒用什么方法呢?这就是大家所看到的形形色色的反病毒软件所实用的手法。可谓八仙过海各显其能。与复制传染性这个以概念出发的直接准则相比,实际使用的方法都是相对准则、间接方法,即相对易于实现、同时也相对不那么准确的准则和方法。
客观地说,在各类病毒检查方法中,特征值方法是适用范围最宽、速度最快、最简单、最有效的方法 (比如我认识你一般只要看脸听声,而不必看出生证明、血型乃至DNA 检验,如同枪毙之前的验明正身) 。具体怎样提取特征使得准确率高、虚警和虚漏都比较少或可接受,就看各个反病毒研究者对病毒代码的理解、其自身水平等很多方面了,其中还要包括很多技术和技巧。最原始的特征值方法就是字符串匹配,比如大家都知道的KVn00, 至多是将无条件匹配变成加几个 ?? 的有条件匹配,当然还要再结合一些其他技巧。特征提取实际上也是一种信号处理的概念与实现。理论和事实都证明字符串匹配方法对特征提取的方向性不明确,真正有用的信息遗漏得太多,而提取出来的部分又有一些不带有病毒自身的特定信息。在技术上是一个比较失败的“特征提取”方法。当然,KVn00 作者的文化水平、能力和精力等情况都决定了目前的现状。
有效的特征提取方法可以将特定的病毒信息浓缩在很短的几个字节以内。这对于目前上万种病毒的检查和确认无疑是非常重要的。但是,通常的特征值方法对于未知病毒和多态编码病毒是无效的。多态编码病毒必须经过还原。也就是某些软件所称的必须有那么一个“解密引擎”(至于是否货真价实是另外一个问题)。而对于未知病毒,没有人工分析在先,而必须去寻求与病毒的直接准则更近而在实现程度上更“飘渺”的方法。
我们先从MS-DOS文件型病毒谈起。先说对于已知多态编码病毒,如果能够正确解析这个病毒在编码上的规律,那么理论上是可以应付自如的,但是对于比较复杂的编码算法以及众多的多态编码病毒,如果没有相对统一的方法来处理,那么势必要仔细研究每种病毒的编码。如果能够让病毒在控制下先行运行一段时间,让其自己还原,那么,问题就会相对明了。可以说虚拟机是这种情况下的最佳选择。
一些类似AVP这样的国外软件都使用了这一技术。通过构造虚拟x86计算机的寄存器表、指令对照表和虚拟内存,能够让病毒体在监控下在虚拟机中运行一段时间。这一过程可以提取与“有可能被怀疑是”病毒或与病毒程序“相似”的行为,比如截获中断、“可疑”的跳转等和普通计算机程序“不太一样”的地方。同时,编码病毒在运行过程中完成自解码,还原成病毒体“原形”。病毒在自解码之后,还要再度结合原来的特征值方法,将已知病毒代码特征库的先验知识应用到虚拟机的运行结果中,完成对一个特定已知病毒的判定。
前面说了,病毒特征值一般是适用于已知病毒的,它不是判定病毒的唯一方法。病毒在感染前后都会有其它表象和结果,比如驻留病毒截取一些中断向量,尤其是Int21、Int13等比较“敏感”的中断、比如明显读操作 (如列目录)时出现的写目录,这些表象或结果与特征值相比,是病毒的一些动态判据, 常被应用在另一类的反病毒工具中,它们往往需要对PC环境做动态的监控。但是,单纯的截获向量只能是怀疑有病毒,在内存中确认有病毒一般要结合特定病毒在内存中的特定的特点。一般不能单纯凭借风吹草动就判定病毒。目前的动态监控技术的致命弱点是兼容性差。尤其在进入Window后,很多软(硬)件的表现将“不可意料”。
那么,究竟有多少因素就能够判定是一个新的未知病毒呢?如何在没有特征这一静态判据的条件下去根据动态判据去判定病毒呢?最现实的答案仍然是虚拟机。从理论上说,因为病毒在虚拟机中运行的每个步骤都是可控和可观测的,因此,只要判据充分,就首先可以判断是一个新的病毒。
首先的工作是对病毒代码做解释执行。一个有一些汇编语言基本功、能力稍强一些的程序员通过艰苦的劳动是完全有可能胜任这一过程的。但这个工作的彻底程度如何,决定了这个虚拟机的基本性能。除了处理每种 x86指令在各种寻址上的差异外,如果要叫真,那么286指令、386指令、x87指令、 保护模式指令、MMX 指令也应该在仿真的范围之内,因为任何一条虚拟机不认识的指令都会另虚拟机“当机”。并且保不准那个病毒就运行了一条这种怪指令 (当然,目前还很罕见)。
第二个考验是仿真一部分MS-DOS和BIOS调用。其中包括重要的内存分配、文件处理。磁盘操作等关键环节。仿真的目的不仅仅是识别这些调用,而且是仿真获得这些调用及指令运行的结果及其连带结果。
第三个考验是PC环境、BIOS环境、MS-DOS环境及扩充的PC环境。比如重要的BIOS和MS-DOS数据区、MS-DOS的内存管理链、UMB甚至Himem、Emm386这样的程序所带来的XMS、EMS、DPMI等等管理协议。尽管这有些偏门,但已经发现有病毒通过DPMI来实现一些特定的功能。
尽管具体实现上困难重重,虚拟机仍然在反病毒软件中获得了极其成功的应用,并成为目前反病毒软件的一个趋势,归结起来可能是由于下面的这些原因:
(1) 在处理加密编码病毒过程中,虚拟机是比较理想的处理方法;
(2) 在反病毒软件中引入虚拟机是由于综合分析了大多数已知病毒的共性,并基本可以认为在今后一段时间内的病毒大多会沿袭这些共性;
(3) 虚拟机的确可以抓住一些病毒“经常使用的手段”和“常见的特点”,并以此来怀疑一个新的病毒;
(4) 目前“临床”应用的虚拟机并不是“高大全”的完整仿真环境,而是相对比较简单的、易于实现的版本。 (但各个反病毒厂商如果进行新一轮吹嘘,可能又没有边际了。)
(5)虚拟机技术仍然与传统技术相结合,并没有抛弃已知病毒的特征知识库。
到目前为止,即便我们经受了上述艰难的考验,完成了一个比较完整的虚拟机,能够让绝大多数病毒“运行”而不“死机”,仍然还没有述及关于病毒标准的问题。如果最终以传染性来判定病毒的产生,并且,不仅能够识别新的未知病毒而且能够清除这个病毒,我们会发现这个反病毒工具不再是一个程序,而成为可以和卡斯帕罗夫抗衡的IBM深蓝超级计算机。
首先,虚拟机必须提供足够的虚拟,以完成或将近完成病毒的“虚拟传染”。如何获得这个兼容性目前还没有人专门探讨。
第二,在判定病毒的标准上, 仍然会有问题。 尽管根据病毒定义而确立的“传染”标准是明确的,但是,这个标准假如能够实施却是模糊的。一是,我们要仿真传染条件,对于那些条件感染病毒,怎样制造传播条件?如系统日期、感染对象的文件名等等,二是这个分析是通过动态执行(甚至回朔)分支屡试呢,还是通过反回头进行静态的指令过程分析?
第三,假如上一步能够通过,那么,我们必须检测并确认所谓“感染”的文件确实感染的就是这个病毒或其变形。
当然,如果能够具有这样的超级计算,并实现上述过程,那么,杀掉未知病毒也许是可能的。比如前面宝宝P_ost上来的getexe这样的脱壳程序,似乎就有那么一点动态杀毒的影子了,但实际实现还差着很遥远很遥远……
可以说,最后这个软件到底是怎样一个“专家”,和这个虚拟机的构造是密切相关的。即便扣除上面讨论中貌似叫真抬杠的地方,这个工作量对于一、两个人,几乎是不收敛的!当然,说道这里,我并不是否定虚拟机的作用,而是肯定了虚拟机在反病毒软件中的特 夤毕住 虚拟机的引入使得反病毒软件件从单纯的静态分析进入了动态和静态分析相结合的境界,在一个阶段里面,极大地提高了已知病毒和未知病毒的检测水平,以相对比较少的代价获得了可观的突破。在今后相当长的一段时间内,虚拟机在合理的完整性、技术技巧等方面都会有相当的进展。目前国际上公认的、并已经实现的虚拟机技术在未知病毒的判定上能够达到 80% 左右的准确率,这已经是相当的成就了。获得这个结果也经过了几年的时间。
目前虚拟机的处理对象主要是文件型病毒。对于引导型病毒、Word/Excel宏病毒、木马程序在理论上都是可以通过虚拟机来处理的,但目前的实现水平还相距甚远。道高一尺、魔高一丈。就象病毒编码变形使得传统特征值方法失效一样,针对虚拟机的新病毒可以轻易使得虚拟机失效。简单的比喻,让一个虚拟机失效只需一条特殊的指令,或特殊的中断、甚至逆指令流……。
虚拟机是作为对过去已知病毒的统计分析而出现、并合理地存在的。随着新病毒的发展,虚拟机因此也会在实践中不断得到发展。但是,PC的计算能力是有限的,反病毒软件的制造成本也是有限的,而病毒的发展可以说是无限的。让虚拟技术获得更加实际的功效,甚至要以此为基础来清除未知病毒,其难度相当之大。当然这不影响我们在这里借此论坛讨论与这个技术相关的问题。作为一个学生,kav 能对反病毒技术和市场做如此深入的调研,实令人钦佩。
反病毒新技术的构思、实现与应用最终会归结在不仅是技术,而且还包括资金、知识、合作、市场、体制、心理等等太多的因素,正如前面dock所说,似乎仍将不可避免地归结为我们民族软件业的一个悲剧。这是我们无法回避的一个社会现实。当然,通过适当的学习、借鉴,尽可能地接近目前的反病毒国际先进水平,也许还是有一线曙光的。但愿中国反病毒行业依靠吹嘘和欺骗的日子早日过去…… |