多态变形生成器

文档编号:  S001-F008
原作者:  Data Fellows
译者:  Arhat[ptg]
审校:  NULL
发布时间:   2006-06-28
原文:  http://www.madchat.org/vxdevl/vdat/polyinvr.htm
关键词:
多态变形 生成器 检验和 算法 解密




多态变形病毒
多态变形病毒日益增多,这种现象可以看作是病毒作者为了反击高级病毒扫描器而做出的反应。因为设计合理的扫描器可以病毒的特征码发现病毒,因此,挫败扫描器的方法就是设计可以改变自身代码的病毒,从而使搜索字符串的识别技术失去效果。
多态变形病毒面对扫描器时,主要是通过代码变换及加密来隐藏自己。常见的策略是用变化的key加密病毒体的主要部分,而保持解密执行程序不变。为了防止搜索字符串的方法检测到,解密代码在每一次的感染过程中都会改变。
然而,设计多态变形病毒要求病毒作者有很扎实的基本功,以及很多技巧。因此,这在段相对较长的时间里,导致世面上较少出现真正的多态变形病毒。当然,世界不会一成不变。因此,在某个阶段,从事病毒贸易的大哥级人物注意到这种现象,决定通过编写并分布多态变形生成器的方式,向那些缺乏技能的小弟们伸出援手。

多态变形生成器
从根本上说,多态变形生成器是一些例程,可以与已存在的病毒链接。但生成器本身并不是病毒;它们的目的是使用多态变形的技术来隐藏真正的病毒。
第一个通用的多态变形生成是Mutation Engine,也被称为MtE。在1991年出现,大概有十亿多种不同的排列,可以与任何病毒链接,它的出现宣告了即时多态变形的时代到来了。时至今日,大约有33种已知的病毒使用了MtE。
其它的多态变形生成在MtE出现后接踵而至。1992年的晚些时候就出现了2个,它们分别是TridenT Polymorphic Engine (TPE)和NuKE Encryption Device (NED)。
TPE出生在荷兰。从根本上说,它处理的排列数比MtE要少一些,但是它为反病毒产品准备了另外的难题,因为它生成的译码器比MtE生成的更普通,更没有代表性(也就更难被检测到)。NuKE的生成器不是很高级,但它的独到之处是它不像大部分其它的多态变形生成器那样发布目标模块,而是发布易读的源码。
其它比较知名的多态变形生成器还有:Dark Angel的Multiple Encryptor (DAME),Darwinian Genetic Mutation Engine (DGME),Dark Slayer Mutation Engine (DSME),MutaGen,Guns'n'Roses Polymorphic Engine (GPE)和Dark Slayer Confusion Engine (DSCE)。
这些生成器都是通过地址网络,病毒交换BBS与因特网上的专用区域交换的。

操作原理
多态变形生成器的常见形式是一引动代码模块,程序可以把它插入程序。在这之后,程序就可以调用代码模块中包含的函数了。这个过程被称为链接。生成器一旦链接到病毒,将变成病毒的一部分。自那以后,病毒四处传播时,都会带着生成器。
应该注意,生成器本身并不在意它与哪种程序链接。虽然说已知的多态变形生成器明显是为病毒而写的,但从根本上说,它们也可以用于其它种类的程序。
当使用多态变形生成器的病毒感染程序文件时(或其它的对象),会要求生成器生成病毒体的加密拷贝和生成器本身。除此之外,生成器还将生成译码器――一个例程,把已加密的代码还原成真正的病毒代码。
生成器使用的加密技术相对比较简单。不过,它们在每次执行时都会改变加密key。这样一来将使检测这样的病毒变得非常困难,但加密的病毒也有一个命门:解密例程,如果想要它可执行,就不能加密它。因此,多态变形生成器的真正作用是通过它变换解密例程的能力来衡量的。
所有的多态变形生成器为了每次都能创建不同的算法,需要一些随机化例程。有些生成器允许病毒作者用自己喜欢的随机化例程替换原来的。
多态变形生成可能创建完全不同的加密方法以及与之对应的各不相同的解密例程。它们一般是通过以下的方式修改解密例程:移动例程周围的指令,在随机的地方增加无用的指令,使用不同的处理器寄存器和操作码。
这样做的主要目的是使解密例程对应的二进制代码在不同的感染体内完全不一样。这样将使那些用固定搜索字符串来搜索解密例程的方法失效――因为多态变形病毒生成的感染体并不存在相同的搜索目标(字符串)。
使用多态变形生成器的病毒怎样感染文件?
1.  在感染之前的干净文件。我们把它称为受害文件。
2.  病毒通过修改受害文件的第一条指令开始它的感染过程。它用jump文件尾部的指令替换它们。被替换的字节保存在病毒体内。
3.  接下来,病毒调用多态变形生成器,生成病毒代码的加密拷贝和生成器本身。生成器也将生成解密例程,并把它添加到受害文件的尾部。
4.  把加密的代码添加到受害文件的尾部。这个加密的部分包含三小部分:病毒体的真正拷贝;被替换的受害文件的第一条指令;多态变形生成器的代码。

局限性
当第一个多态变形生成器出现时,大家都很恐惧,生怕会出现大量的多态变形病毒。然而,这些生成器并没有像人们当初设想那样流行起来――到目前为止,大
其原因之所一是生成器必须与要加密的程序链接,而这样的操作需要对程序做些修改,因此也就要求使用者具有一些编程经验。这样一来使菜鸟级的病毒狂热分子敬而远之。但不幸地是,与生成器一起提供的还有怎样使用它们的详细说明,因此,甚至那些只有有限汇编编程经验的病毒迷也可以依葫芦画瓢,轻松使用它们。
另外的局限性是生成器的大小。尽管生成器本身的体积很小,但它们毕竟增加了病毒的总大小。这使它不合适引导区病毒(因为引导区病毒只能用有限的代码空间)。还没有发现由生成器生成的引导区病毒。除了V-Sign(一个温和的多态变形引导区病毒)之外,多态变形似乎成了文件型病毒的特权。
当然,病毒从多态变形生成器那里获得的好处并不是那么明显。如果一个反病毒程序可以识别某个生成器,那么它通常能检测出由这个生成器生成的所有病毒。

检测
不管多态变形生成器有多巧妙,使用适当的工具可以检测出由它们伪装的病毒。反病毒程序通常使用算法来识别被多态变形病毒感染的文件。寻找这类病毒的另一种方法是使用检验各。设法解决加密层下病毒的加密和搜索问题也是可能的。

算法
算法主要取决于无论生成器变化了多少个解密例程,它其中仍包含了某些解密使用的编程结构。如果一个程序文件中包含了这样的结构,反病毒程序就可以假设这个文件被多态变形病毒感染了。
当多态变形生成器大量变化时,每个生成器需要不同的算法――为了构造这样的算法,生成器将不得不仔细学习。
不过,这样的算法有一些弱点:它们的误报可能会比较多。多态变形生成使用的程序结构可以非常随机。这意味着类似的结构可能会出现在合法的程序代码内。误报可能会突然出现,尤其是如果搜索范围包括数据文件时,因为它们之中很可能包含与(生成器生成的)随机‘垃圾代码’类似的数据。创建一个找出所有被多态变形引擎生成的感染体的算法相对比较容易,但是,如果这个算法把大量干净的程序也标记为被感染了,那么它的用处就不大了。

检验和
检验和是通过对系统里的可执行文件计算后得出的比较值。这些值通常保存在数据库里。当进行检验和搜索时,将重新计算检验和,并把结果和数据库里的原始值做比较。因为这种方法检测系统中所有的变化,多态变形病毒的易变性也就没什么意义了不得;这种变化也是变化,因此,照样可以检测出来。
尽管从理论上说,检验和技术可以检测出系统里的所有改变,但它仍容易秘密病毒的攻击。如果这样的病毒在内存中激活了,它就能隐藏它所做的所有改变。当涉及到秘密病毒时,检验和是以虚假的数据为计算基础,因此会发现每个东西都状况良好。应该注意,能同时隐藏它们身影的多态变形病毒是非常罕见的,因为很难创建它们。

基于解密的检测
基于解密的检测原理是,首先通过推理被检查的对象是否被加密。如果对象有些可疑,就会先把它解密,然后对它们进行基于字符串的搜索。
这个方法对某些多态变形生成器很有效,但移植性不好,不通用。

什么是最好的解决办法?
检验和是检测多态变形病毒最强大的方法――只要生成检验和时这个机器是干净的,病毒没有伪造被检验和接收到的信息。检验和也可以用于检测那些还没有被分析的多态变形(和普通的)病毒。
基于算法的检测机制存在误报的问题,但是这些问题可以通过精心设计检测引擎来克服。基于算法检测的一个优势是,一旦这个检测引擎能检测出某个多态变形生成器,它将可能检测出所有使用这个生成器的病毒。
基于解密的检测机制只能检测那些已经被反病毒产品的创建者分析过的多态变形病毒,但是它很少出现误报。此外,这样的机制也可以精确检测出所讨论病毒的变体――这恰好是基于算法的检测机制所不具备的。