按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
在字处理和其他办公软件中包括宏语言的初衷是为了实现办公自动化,包括自动的报表生成,一些固定格式的公文生成等等,比如说打开一个文件实现自动的签名和回复对于公司的公文来说是很重要的功能,使用WORD的宏语言可以很方便的实现。但是这种自动执行的特性也给宏病毒的出现打开了方便之门。
宏病毒存在于文档文件中的形式非常复杂,宏病毒的感染都是通过宏语言本身的功能实现的,比如说增加一个语句、增加一个宏等等,不通过宏语言执行环境(比如说WORD或者EXCEL程序)的功能,直接在二进制的数据文件中加入宏病毒基本上是不可能的。在本书第五章中专门有一节详细叙述了微软办公软件文档的二进制结构,如果你感兴趣的话可以研究那一节的内容。
WORD版本7以后,宏可以以加密的形式存在,宏代码只能被运行而不能被查看,碰到这种加密的宏病毒,采用简单的字符串搜索的方式对查找这类病毒无能为力。
宏病毒还是一种与平台无关的病毒(甚至包括和CPU无关),任何电脑上如果能够运行和微软字处理软件、电子数据表软件兼容的字处理、电子数据表软件,也就是说可以正确打开和理解WORD文件(包括其中的宏代码)的任何平台都有可能感染宏病毒。
我们下面以WORD宏病毒为例,详细说明宏病毒的感染机制。
使用微软的字处理软件WORD,用户可以进行打开文件、保存文件、打印文件和关闭文件等操作。在进行这些操作的时候,WORD软件会查找指定的“内建宏”:关闭文件之前查找“FileSave”宏,如果存在的话,首先执行这个宏,打印文件之前首先查找“FilePrint”宏,如果存在的话执行这个宏。另外还有一些以“自动”开始的宏,比如说“AutoOpen”、“AutoClose”等,如果这些宏的定义存在的话,打开/关闭文件的时候会自动执行这些宏。在EXCEL环境下同样存在类似的自动执行的宏。
下面是以“自动”开始,可以在适当的时候自动执行的宏的列表:
WORD
EXCEL
Office97/2000
AutoOpen
Auto_Open
Documeny_Open
AutoClose
Auto_Close
Document_Close
AutoExec
AutoExit
AutoNew
Document_New
Auto_Activate
Auto_Deactivate
以“文件”开始的预定义宏在不同语言中名字不完全相同(但是对于非西方文字,如中文、日文,名字和英文的宏名字是一样的)。这些宏会在执行特定操作的时候被激发,比如说使用菜单项打开和保存文件等。还有一类宏,是在用户编辑文字的时候,如果输入了指定键或者指定的键的序列,则该类宏会被触发。
攻击微软WORD、EXCEL和其他Office程序的宏病毒,基本上都是采用上面三种方式触发的。如果打开一个被感染宏病毒的文档,WORD(EXCEL或者其他)会首先执行包含在“AutoOpen”宏中的病毒代码,如果宏病毒替换了标准的菜单处理函数,则使用该项菜单的时候会执行宏病毒代码,当然还有另外一种情况,就是敲入指定字符序列的时候会激发相应的病毒代码。
为了避免被杀毒软件检测出来,一些宏病毒使用了和DOS环境下多态病毒类似的方法来隐藏自己。在“自动”开始的宏中,不包括任何感染或者破坏的代码,但是在其中包含了创建新的宏(实际进行感染和破坏的宏)的代码,这样“自动”宏被执行之后,创建了新的病毒宏在执行,执行完毕之后再删除病毒宏。这样,杀毒软件很难从原始的代码中发现病毒的踪迹。
在WORD或者其他Office程序中,宏分成两种,一种是每个文档中间包含的内嵌的宏,另外一种是属于WORD应用程序,为所有打开的文档共用的宏。任何宏病毒首先都是藏身在一个指定的WORD文件中的,一旦打开了这个WORD文件,宏病毒就被执行了,宏病毒要做的第一件事情就是将自己拷贝到全局宏的区域,使得所有打开的文件都会使用这个宏。当WORD退出的时候,全局宏将被存放在某个全局的模板文件(。DOT文件)中,这个文件的名字通常是“NORMAL。DOT”。如果这个全局宏模板被感染,则WORD再启动的时候会自动的装入宏病毒并且执行。
然后病毒就开始进行实际的感染,有的病毒已经包括了对“FileSave”、“FileOpen”的处理,如果没有则病毒会创建一个新的处理函数替代原来的。这样,一旦用户保存文件,病毒就会被附加在新保存的文件中,一旦用户打开文件,病毒同样会立刻附加在新打开的文件中。还有一种感染速度更快的方法,病毒搜索所有最近打开的文档(宏语言具有这个功能),然后将它们全部感染。
EXCEL宏病毒除了很少的几点不同以外,和WORD宏病毒非常相似。首先是EXCEL的全局模板文件不是“NORMAL。DOT”,而是放在EXCEL安装目录下的“STARTUP”子目录中的所有EXCEL文件。EXCEL的版本变化非常快,4。0版本和EXCEL95使用的宏完全不一样,但是微软有一个良好的习惯,就是除了很少的例外以外,后来的版本对前一个版本的的支持都比较好,这样做带来的副作用就是,在4。0版本下编写的宏病毒在EXCEL95下仍然能够正常的工作。
ACCESS作为微软办公软件的一员,同样具有强大的宏语言,也就同样有可能被病毒感染。而且ACCESS中间存在自动脚本和自动宏的概念,由于ACCESS数据库处理的需要,软件本身就大量使用了脚本语言的功能,如果清除被病毒感染的文件很可能把正常的脚本也清除,这样会造成数据库文件的损坏。
其他的一些字处理软件,包括AmiPro、IBM的WordPro等,只要具有了足够强大的宏语言就可能包括病毒,由于使用这些字处理软件的人比较少,所以没有严重的病毒感染事件,但是AmiPro和WordPro环境下的病毒都已经被发现过。
有一些简单的办法可以判断一个文件是否被宏病毒感染。首先打开你的WORD,选择菜单:工具(Tools)-》宏(Macro)—》宏列表(Macros),如果发现里面有很多以“Auto”开始的宏,那么你很可能被宏病毒感染了。自从微软的Office97以后,在打开一个Office文档的时候,如果文档中包括了宏,则WORD会弹出下面的警告框:弹出这个警告框并不一定就意味着病毒,因为微软的很多Office自动化功能就是通过宏来实现的。但是在国内使用这些功能的用户很少,所以一些杀毒软件把正常的包含宏的文档中的宏统统去掉(甚至包括Office安装程序中的一些模板文档),用户反而觉得这种软件好,因为从此不会再有任何警告框出现了。唉,这就是中国用户的典型心理,和前面说的误报率一样,让人哭笑不得。
第四节 躲避杀毒软件的检测——病毒的多态(变形)技术
我们把使用通常的特征码扫描法无法检测(或者极其难以检测)的病毒称为多态病毒。多态病毒避免被检测的方法主要有两种:使用不固定的密钥或者随机数加密病毒代码,或者在病毒运行的过程中改变病毒代码,除了这两种主要的方式外,还有的病毒,例如“炸弹人”(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)指令使病毒代码仍然能�