本文转自《一个真实的病毒世界》第四节 躲避杀毒软件的检测――病毒的多态(变形)技术
d28K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2N6r3y4$3j5#2)9J5k6h3y4G2L8g2)9J5c8X3y4Y4K9g2)9J5k6r3u0A6L8W2)9J5c8X3q4@1N6r3q4U0K9r3#2W2L8Y4c8Q4x3X3g2U0k6$3W2Q4x3@1k6X3L8%4u0#2L8g2)9K6c8o6p5@1i4K6t1$3N6r3!0H3K9h3y4Q4x3@1b7K6x3g2)9J5y4Y4m8G2M7%4c8F1L8#2)9K6c8o6q4Q4x3U0k6@1P5i4m8W2i4K6y4p5i4K6u0W2P5X3W2H3 2002年写的,作者不详。
转载这一节,主要是帮助大家了解多态变形技术。
第四节 躲避杀毒软件的检测――病毒的多态(变形)技术
我们把使用通常的特征码扫描法无法检测(或者极其难以检测)的病毒称为多态病毒。多态病毒避免被检测的方法主要有两种:使用不固定的密钥或者随机数加密病毒代码,或者在病毒运行的过程中改变病毒代码,除了这两种主要的方式外,还有的病毒,例如“炸弹人”(Bomber)通过一些奇怪的指令序列等方法可以实现多态性。
运行时改变的代码在早期是一种很常见的技术,最早的BASIC时代,一些BASIC语言的狂热爱好者举行了一种奇特的竞赛,看谁可以在一行BASIC代码里面完成尽可能多的功能(BASIC语言可以在一行包括很多语句),为了实现复杂的功能,人们在这一行BASIC代码中就会包括改变代码本身的代码,这样造成程序的复杂性是难以想象的,所以在实际的软件开发中,这种运行时候改变自己的技术已经不再被采用了,但是多态病毒程序出于隐藏自身的目的,还经常采用这种技术。
多态病毒和前面所述的引导型、文件型和宏病毒并不是同一层次的概念,实际上,多态病毒中既有引导型病毒,也有文件型病毒和宏病毒。
使用加密解密技术的多态性
下面是一段最简单的多态病毒代码,这段代码的作用是将预先加密的病毒代码解密,然后跳转到执行感染和破坏功能的病毒代码中。
(代码示例见原文)
这段解密的代码和加密后的病毒都是在感染的时候动态生成的,我们可以看到,使用的寄存器、密钥、加密代码的长度等等,甚至解密使用的指令都是随机的,所以指望能够从这些代码中找到固定的病毒特征码是徒劳的,也就是由于这种多态(变形)病毒的出现,使利用简单特征码进行病毒检测的技术走到了尽头。
实际的多态病毒比我们上面提供的例子要复杂得多,在病毒生成的解密代码中,使用的指令千奇百怪,甚至包括了很多完全没有实际作用,只是迷惑分析者的指令序列。上面的例子中,解密的流程是固定的,只是解密使用的数据和寄存器变化,而很多多态病毒连指令序列都是随机的,使用的指令也基本上涵盖了整个英特尔80x86的指令集。
还有一些更加恐怖的多态病毒,他们使用的指令甚至是一些英特尔都没有公布的指令,比如说CS:NOP什么的,也就是给空指令NOP加上CS前缀,这些指令你在任何英特尔的参考书上都找不到,但是它确确实实可以执行,在多态病毒中使用这种指令给病毒分析者带来了巨大的难度。
多态性的级别
根据病毒使用多态技术的复杂程度,我们可以将多态病毒划分成下面几个级别:
1. 半多态:病毒拥有一组解密算法,感染的时候从中间随机的选择一种算法进行加密和感染。
2. 具有不动点的多态:病毒有一条或者几条语句是不变的(我们把这些不变的语句叫做不动点),其他病毒指令都是可变的。
3. 带有填充物的多态:解密代码中包含一些没有实际用途的代码来干扰分析者的视线。
4. 算法固定的多态:解密代码所使用的算法是固定的,但是实现这个算法的指令和指令的次序是可变的。
5. 算法可变的多态:使用了上述所有的技术,同时解密的算法也是可以部分或者全部改变的。
6. 完全多态:算法多态,同时病毒体可以随机的分布在感染文件的各个位置,但是在运行的时候能够进行拼装,并且可以正常工作。
对于前面3种多态病毒,使用病毒特征码或者改进后的病毒特征码是可以发现病毒的(所谓的改进后的特征码,就是包括一些非比较字节的特征串),对于第4种多态病毒,由于代码的变化是有限的,所以通过增加多种情况的改进后的特征码,应该也可以处理。至于第5和第6种多态病毒,依靠传统的特征码技术是完全无能为力的。
对付多态病毒的最好办法是某种形式的虚拟执行技术,也就是仿真出一个80x86的CPU,让解密代码自己解密完成之后,再使用通常的特征码识别法进行病毒检测。但是针对这种仿真技术也出现了一些具有反仿真技术的病毒,比如说根据执行所需要的时间判断是否处于虚拟机的监视下,在监视下和非监视下表现出完全不同的行为。因此,衡量多态病毒的难度、复杂性和检测的困难程度可以从下面几个方面进行:
采用算法的复杂性,是否采用了非公开、非标准的80x86指令,是否使用了大量的寻址方法和多种类型的指令实现解密算法。
是否使用了反仿真(虚拟执行)技术。
是否采用了可变的加密/解密算法。
解密代码是否具有充分的随机性。
在这里我不可能再进一步详细的描述多态病毒的技术和发展了,因为目前有一些多态病毒所使用的技术已经给反病毒软件带来了极大的困难。如果本书的读者能够改进这些新的多态病毒,对普通用户来说可能又是一场灾难的来临。
使用改变可执行代码技术的多态病毒
由于在运行过程中改变机器语言的指令是非常困难的,所以这种技术主要使用在宏病毒中,其技术和原来曾经出现过的BASIC程序在运行过程中动态修改自己非常类似(也许不是因为巧合,我们可以注意到所有的宏语言基本上都是以BASIC语言为基础的)。在运行过程中,病毒可以随机的改变变量名,指令的顺序等,但是不影响病毒所实现的算法。
很少一些复杂的引导型病毒也采用了这种技术,在引导区或者分区表中,包含了一小段代码来加载实际的病毒代码,这段代码在运行的过程中是可以改变的。
由于动态修改机器语言代码的复杂性,完成在文件型病毒中使用动态代码修改技术有相当的难度,但是目前仍然至少有两种病毒使用了这种技术:“厚度”(Ply)在病毒体中随机的移动指令,然后利用跳转(JMP)或者调用(CALL)指令使病毒代码仍然能够实现原来的功能。另外一种“TMC”病毒没有在运行过程中改变代码,但是在感染的时候,整个代码的分段、偏移量和填充代码的分布都是可以随机变化的,这样虽然病毒没有对自己进行加密/解密,仍然可以看成一种多态病毒,使用传统的特征代码比较法很难准确的查到病毒并且安全的清除。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!