THE EVOLUTION OF POLYMORPHIC VIRUSES
Fridrik Skulason

译者:jdxyw

       最近,在多态变形病毒领域中,最引人注目的是它们的发展究竟是如何受阻的。这并不意味着,没有新的多态变形病毒出现,相反,新的多态变形病毒正持续的出现。但是,它们只不过是旧的病毒的新的变种而已,并没有在技术上有多少新的突破。

       不管怎么样,仅仅关注多态变形病毒的发展是不够的,同时关注检测多态变形技术的发展也是十分必要的。日益增加的更加复杂的多态变形病毒也带动了更为先进的病毒检测技术,这也导致了新的多态变形技术的发展。

       在深入那些已经公开的技术之前,有必要考虑一些有关多态变形病毒的基本问题,我们将以“这些病毒为什么被编制?”作为开始。

       这个问题十分容易回答――他们被编写的主要目的是为了抵抗某一类的反病毒产品――病毒扫描器。既然病毒扫描器是最广泛使用的反病毒产品,因此它们便成为了防范的主要对象。

       从这点上来说,多态变形病毒没有给另外一类的反病毒产品——也就是完整性检查器——造成多大的麻烦。但这也并不意味着完整性检查器优于病毒扫描器,毕竟有一类被称为‘慢病毒’的病毒,它们是很容易就被病毒扫描器检测出,而这个同时也给完整性检查器造成很大麻烦。

       幸运的是,多态变形慢病毒现在还未流行。从一方面来讲‘慢多态变形病毒’已经存在了,但是不要与‘多态变形慢病毒’混淆起来。它们的区别将在这篇文章的后面讨论到,到时还将包括一些另人厌烦的小技巧。

       考虑到病毒扫描软件的工作原理,病毒编写者大体上使用两种不同方法对它们进行攻击。两者都是感染扫描软件无法处理的对象。或是使得扫描软件对病毒的检测的难度加大,或是使得病毒扫描软件无法处理所扫描的病毒。

       多态变形病毒使得病毒检测的难度加大,或是使得检测时间变的非常长,或是使得病毒技术超越了反病毒软件编写者的水平。

       病毒编写者的成功并不仅仅归功于他们的编程水平,也要归功于检测技术的使用。在叙述现今的技术之前,简短的将多态变形病毒进行分类。

       多态变形病毒主要分为三类

1.    加密型,伴随着变量的解密。这是现今最大,最重要的一类。几种实现多变性的方法将在下面进行讨论,其中的大多数应该早已被读者所熟知。

2.  块交换病毒。现今只有少数几个病毒是属于这一类型的,但它们证明了多态变形病毒并不一定要进行加密。这些病毒有好几块代码块组成,从理论上说,只要有两条指令,它们就能以任何顺序进行交换,这就使得平常的字符串搜索变的无效。

3.  自我修改病毒,这应用了指令替换技术。这就是说,病毒能够用一条或是更多的指令来替代原先的指令,从而达到自我修改的目的,而同时达到相同或是更多的功能。迄今为止,这一类型的病毒只存在技术上的可能性,还没有哪个病毒应用这种技术。也许在未来的某一天,这一种病毒将最终出现,可能只是为了证明这种技术确实可行。

       考虑到第二种类型的病毒能够轻易的被一般的字符串查找技术检测出来,并且,第三类型的病毒并不实际存在。现今唯一重要的多态变形病毒是加密型的。

       但是,这些病毒是如何被检测出的?

       从本质上说,检测技术可以分为两大类。一是仅仅是检测和确定解密程序段,二是检查解密程序段后面的程序段,检测真正的病毒。这不是一个严格的分类,一个扫描器可以在解密代码之前,通过分析解密循环程序段来确定这是由哪一个特定的病毒产生的。

       解密循环段检测器

       现在有几种不同的手段可以用来检测和确定解密循环段——这是检测多态变形病毒的标准手段——这些方法都有些重要的问题。最为普遍的方法将在后面讨论,但是如果这些手段仅仅被用于第一步,那么病毒将是隐藏的问题完全暴露出来。

一. 病毒的确定。从本质上说,多态变形病毒的检测并没有使得这更加容易检测其他的目标。

二. 更容易造成误报。随着多态变形病毒的增多,不断增长的解密程序的变种,使得误报的机会日益增多。一些无关的代码有时也会被认定为一段解密程序段。

三. 确定种类的困难。许多多态变形病毒会产生类似的解密程序段,这将完全有可能使得扫描程序错报一个由多态变形病毒产生的解密程序段,这有可能是由另一个毫无联系的多态病毒产生的。

四. 无法杀毒。杀毒需要在被感染文件中修补一些重要的字节段,然而这些文件往往保存在多态变形病毒的加密程序段中。这意味着确定病毒的杀除一般是不可能的,这需要将病毒进行解密。

       从积极的一方面来说,增加对某个特别的解密程序段的检测是十分容易的,虽然这取决于扫描程序的设计和病毒的复杂性。这些解密技术已经很陈旧了,许多的反病毒产品已经弃用它们了,转向其它更为先进的技术。

在这一类型中最广泛使用的手段是

一. 包含简单通配符的字符串搜索

二. 包含可变长度通配符的字符串搜索

三. 多方式字符串查找

四. 指令用法识别

五. 统计分析

六. 多算法检测技术

包含简单通配符的字符串搜索

       这种方法的局限性是明显的,它只能处理少数一些多态变形性并不十分明显的病毒。例如它们只能利用一些简单的解密程序段和单一的变量指令。最新的变量多态变形病毒只使用两种不同的指令,NEGNOP,它们分别只有一位大小。它们抵御检测的方法十分简单,只需要在有效代码之间随机插入一些花指令即可。花指令并不意味着是无效指令,它们是指,能够插入解密程序段中却不会产生任何功能的任何指令。典型的例子如NOP, JMP $+2, MOV AX,AX,和一些类似的指令。

包含可变长度通配符的字符串搜索

       这个方法能够处理包含花指令的解密程序段。但是,这个方法依然存在着两个问题。一些扫描器并不能使用这个技术,因为这些软件的设计不允许使用可变长度的通配符。但是这个并没有什么影响,因为这项技术十分容易就能被抵御。只要使得解密程序段增加一点可变性,使得没有单一可被用于搜索的字符串存在即可,甚至使用一个可变长度的通配符就能匹配几乎所有的病毒实例。这个能够用几种不同的方法实现。

一. 改变寄存器的用法。例如,DI替代SI用做索引,或者是解密密钥保存在BX中而不是AX中。

二. 改变指令的顺序。如果指令的顺序对程序并不影响,那么它们能够被任意的交换次序。

三. 改变加密的方法。除了使用XOR,也可以使用ADDSUB

多方式字符串查找

       这普遍被认为是一项过时的技术,但在九十年代的时候,在Wahle病毒出现后,许多防病毒生产商重新使用这项技术。在一个十分巨大的被用来搜索的简单字符串集合下,这种病毒能够被可靠的检测出来。但是今天,它们当中的大多数可能使用不同的方法。这种检测方法很容易就能够被抵御,通过增加解密程序段的可变性,用于搜索的字符串的数量将变的异常巨大。有一些多方式字符串查找技术被应用的例子。一个防病毒公司使用一个特别的多态变形病毒的例子用作产品比较。他们看来已经增加了一些搜索用的字符串用来检测这一类的病毒,而不是承认他们不能够检测这类病毒。他们确实在测试中做到了100%通过,虽然最近的一次测试中显示他们只能检测测试中的5%的这类病毒。

指令用法识别

       这个方法是用来处理Dark Avenger的转换引擎的。它主要是假定一开始,所有的文件都是被感染的,然后跟踪解密程序段,一次一条指令。如果发现一条指令不能够被某种病毒产生做为解密程序段的一部分,那么这个病毒不是被那种病毒所感染的。如果跟踪到了解密程序段尾部,依然假定这个文件被感染,那么将报告这个文件被感染。主要有两种方法用来攻击这种技术。第一种方法更显而易见,是增加解密程序段中可能的指令的数量。如果一个病毒在解密程序段中使用了每一种可能的指令,那么这个病毒用这个方法将不可能被检测出来。第二种方法更为巧妙,但这使得确定解密循环段何时结束变的更加困难。

       统计分析

       由于不可接受的高比率的误报,这个方法并没有被广泛使用。这主要是用于统计分析解密程序段中的特定的数字。它很适用于当病毒有着一个巨大的解密程序段的时候。

       其他的检测算法被频繁的使用。它们被用于核心部分,能够快速排除某个文件是否被特定的病毒感染的可能性,例如。

         IF       这个文件是个.exe的可执行文件

     AND     CS:IP 的初始值是 0000:0000

     THEN    这个文件并没有被 Virus-X感染

在其他例子中,算法提供了检测

      IF     这个文件是COM结构文件

     AND     这个至少5623字节长

     AND     这个从 JMP FAR指令开始跳转距离文件尾部至少 1623 字节处

AND     10条指令中至少有五条指令来自下面这个集合{AAD,NOP,CLI,CLD,STC}

     AND     在离程序入口点100字节内,包含着以下指令之一             XOR [SI/DI/BX],AX

     AND     在离程序入口点200字节内,有一个分枝指令,它可以转移回到上面描述的XOR指令处

     THEN    这个文件被Virus-Y病毒感染

       从这个例子,我们可以明显看出这些规则十分的复杂,有可能达到十分复杂的程度,需要大量的工作去实现。并且,在一些实例中,仅仅使用大量的类似的规则也是难以确保进行准确的检测,而不要说,用这些规则去确定一个文件是否被感染,造成的误报几率也是十分高的。

       从这点上看,在脑中形成这样的想法是很重要的,即,误报对于防病毒产品的作者是个十分重要的问题,然而对病毒作者却是无足轻重的。一个误报意味着,某种病毒不会感染特定一类的文件,却会被另外一种病毒所感染,因此,会有大量的文件被感染。

       由于扫描器仅仅检测解密程度段,因此我们必须寻求更为先进的检测器,它们能够检测出确定的病毒,而不仅仅是解密程序段。

       相比与仅仅检测解密程序段的检测方法,下面的这些区别将是十分明显的。

一. 更具有一般性。这些方法需要更多大量的初始化工作,但是增加检测一个多态变形形病毒需要的额外工作,还是是远远少于上面介绍的一些其他的方法。

二. 误报的几率减小。由于病毒被解密,误报的几率几乎被降至为零,因为这个时候病毒的全部代码将是可见的,可检测的。

三. 确定病毒类型将是十分容易的。当病毒被解密后,确定病毒类型将不比确定一个不加密的病毒难。

四. 更容易杀除。一个已经加密的病毒应当不会比它没被加密的时候更难杀除。

有两种技术已经被应用于检测变形多态病毒

'X-ray'
Generic decryption

'X-ray'技术仅仅使用于两种产品当中,但是如今这两种产品已经过时了。它主要是先

假定一个特殊的代码块被一个未知的算法加密,然后通过对源码和加密后的代码进行比较,获取加密算法和加密密钥。

       这个听起来似乎有点复杂,让我们来看个例子。

       假定一个已经解密的病毒在其一个特殊的代码块中含有如下的字节段

       B8 63 25 B9 88 01 CD 21

       那么在其对应的加密病毒中的相应字节段是这样的

       18 C4 8B 0C 34 C2 07 F0

       有没有什么办法能够从第一个字节段中,得知是用哪些简单的,可逆的计算来算得以上字节段得的?就像以下例子:

XOR 和一个常量
ADD/SUB和一个常量
ROL/ROR 一个固定大小的字节大小的数字

于是XOR两段字节段,得到下列字节段

A0 A7 AE B5 BC C3 CA D1

通过计算相邻两个字节的差值,得到如下结果

07 07 07 07 07 07 07 07

       这个揭示了原始代码,并且能够得到病毒的所有代码——首先通过和一个密钥XOR每个字节,然后在应用于下个字节之前加上一个常量7h到密钥上。

       通过这个方法,能够减少解密程序段的工作量。Eugene Kaspersky开发的另一种X-ray技术,虽然工作原理不同,但得到的结果是相同的。

       'X-raying'技术被弃用的原因是因为它很容易就能被抵御住。例如使用'X-raying'不能够处理的运算,或是对每个解密字节进行三次或更多次的运算,或是使用多轮的加密。

       最后一种方法的发展并没有受到那些的局限,并且能够处理几乎所有的复杂的解密程序段。它主要是通过使用病毒的解密程序段来解密病毒本身——或是通过模拟解密程序段,或是通过一种控制的方法单步跟踪,使得病毒无法再对可执行文件进行控制。

       但不幸的是,这个技术依然存在着一些问题:

一. 哪种处理器可以被模拟。一个病毒很有可能只能工作在一个特定的处理器上,例如Cyrix 486 SLC,如果工作在其它处理器上,解密程序段将有可能生成乱码。一个智能的模拟器应该能够处理这些问题,但用的不是‘单步跟踪’的。

二. 单步跟踪是十分危险的。如果病毒作者使用一些隐藏的陷阱,这些循环将能够使得病毒得到控制权。在这种情况下,仅仅是扫描一个被感染的文件,都有可能会使得病毒激活,扩散,传播,最终导致破坏。这种情况应当被重视,类似的情况从前曾经发生过,但细节部分我们将步在这里讨论。

三. 如果一个病毒的解密程序段进入到一个无限的循环当中,并且在运行中挂起,那么通用解密程序也将进入无限的循环当中。这个应该不会发生,但有个产品存在着这个问题。

四. 通用解密程序如何知道什么时候停止对代码的解密,而不浪费时间尝试着解密正常的未被加密的代码。

五. 如果解密程序段包含着能够确定自己本身是否被模拟,或是运行是否正常的代码怎么办?例如一个变形的定时循环。

六. 如果解密程序段损坏了,以至于病毒无法正常运行怎么办?这个对于一个仅仅是检测解密程序段的扫描器是没有影响的,但是一个将要利用解密程序段的更为高级的扫描器将无法检测出任何东西。例如SMEG病毒偶尔会产生出失败的变种,它们不会有传播性,但一个扫描器是否应该检测到它们呢?

       最后,我们应当注意,还有许多其它的办法使得多态变形病毒更难检测到,而不是仅仅像上面叙述的对检测技术进行攻击。

       “慢多态变形”病毒就是一种办法。它们具有多态变形性,但所有在同一台机器上生成的变种看起来都有着相同的解密程序段。这将误导防病毒程序用单一的字符串搜索去检测病毒,好像这个只是一个简单的加密病毒,而不是多态变形病毒。

       可是,要是在不同的机器,一星期中不同的天,甚至是不同的月相的时候生成的变种有着不同的解密程序段,那么这个病毒就一定是多态变形病毒。

       另一个最近发展的现象是多态变形的代码变的看起来更正常。在解密程序段中放置大量的无用指令是使得代码看起来更随意的最简单的方法,但这也使得它对于一个智能扫描器看起来仍然具有可疑性。,并且是值得去学习它的细节的。如果代码看起来正常——例如使用一个看起来无害的获取DOS版本号的函数——这将更难被检测到。

       因此,这把我们留在哪?现今的防病毒产品紧跟着病毒的发展,但不幸的是最好的可用的方法依然存在些问题。对用户来说最明显的就是扫描器的扫描速度变的更慢了。没有迹象表明,这个状况会得到改善。但从另外一方面讲,没有迹象表明病毒作者能够跟上新的多态变形技术,这些技术将要求新的一代的检测器。