知者无畏--一个真实的簿世界-第14章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
一个最简单的查找CIH病毒的方法是用资源管理器中 “工具》查找》文件或文件夹”的“高级》包含文字”查找所有。EXE特征字符串〃CIH v〃,在查找过程中,显示出一大堆符合查找特征的可执行文件,很可能意味着你的机器已经被CIH病毒感染了。
如果被CIH病毒感染的机器在4月26日开机,很可能会造成显示器突然黑屏,硬盘指示灯闪烁不停,重新开机后,计算机无法启动。
病毒的危害主要表现在于病毒发作后,硬盘数据全部丢失,甚至主板上的BIOS中的原内容被会彻底破坏,主机无法启动。只有更换BIOS,或是向固定在主板上的BIOS中重新写入原来版本的程序,才能解决问题。
该病毒是通过文件进行传播。计算机开机以后,如果运行了带病毒的文件,其病毒就驻留在视窗操作系统的系统内存里了。此后,只要运行了PE格式的。EXE文件,这些文件就会感染上该病毒。
病毒的运行机制
同传统的DOS型病毒相比,无能是在内存的驻留方式上还是传染的方式上以及病毒攻击的对象上,CIH病毒都于众不同,新颖独到。病毒的代码不长,CIHv1。2只有1003个字节,其他版本也大小差不多。它绕过了微软提供的应用编程界面(API),绕过了ActiveX、C++甚至C,使用汇编,利用VxD(虚拟设备驱动程序)接口编程,直接杀入视窗操作系统的内核。它没有改变宿主文件的大小,而是采用了一种新的文件感染机制即前面所说的“空洞利用”,将病毒化整为零,拆分成若干块,插入宿主文件中去。
最引人注目的是特征可能是“CIH”病毒破坏硬件的能力,它利用目前许多BIOS芯片开放了可重写的特性,向计算机主板的BIOS端口写入乱码,开创了病毒直接进攻计算机主板芯片的先例。可以说CIH病毒提供了一种全新的病毒程序方式和病毒发展方向。下面对该病毒作进一步的剖析,该病毒程序由三部分组成。
CIH病毒的驻留(初始化)
当运行带有该病毒的。EXE时,由于该病毒修改了该文件程序的入口地址(Address of EntryPoint),首先调入内存执行的是病毒的驻留程序,驻留程序长度为184字节,其驻留主要过程如下:
用SIDT指令取得IDT base address(中断描述符表基地址),然后把IDT的INT 3 的入口地址改为指向CIH自己的INT3程序入口部分;
执行INT 3指令,进入CIH自身的INT 3入口程序,这样,CIH病毒就可以获得Windows最高级别的权限(Ring 0级),可在Windows的内核执行各种操作(如终止系统运行,直接对内存读写、截获各种中断、控制I/O端口等,这些操作在应用程序层Ring 3级是受到严格限制的)。病毒在这段程序中首先检查调试寄存器DR0的值是否为0,用以判断先前是否有CIH病毒已经驻留。
如果DR0的值不为0,则表示CIH病毒程式已驻留,病毒程序恢复原先的INT 3入口,然后正常退出INT3,跳到过程9;
如果DR0值为0,则CIH病毒将尝试进行驻留。首先将当前EBX寄存器的值赋给DR0寄存器,以生成驻留标记,然后调用INT 20中断,使用VxD call Page Allocate系统调用,请求系统分配2个PAGE大小的Windows系统内存(system memory),Windows系统内存地址范围为C0000000h~FFFFFFFFh,它是用来存放所有的虚拟驱动程序的内存区域,如果程序想长期驻留在内存中,则必须申请到此区段内的内存。
如果内存申请成功,则从被感染文件中将原先分成多块的病毒代码收集起来,并进行组合后放到申请到的内存空间中。
再次调用INT 3中断进入CIH病毒体的INT 3入口程序,调用INT20来完成调用一个IFSMgr_InstallFileSystemApiHook的子程序,在Windows内核中文件系统处理函数中挂接钩子,以截取文件调用的操作,这样一旦系统出现要求开启文件的调用,则CIH病毒的传染部分程序就会在第一时间截获此文件;
将同时获取的视窗操作系统默认的IFSMgr_Ring0_FileIO(核心文件输入/输出)服务程序的入口地址保留在DR0寄存器中,以便于CIH病毒调用。
恢复原先的IDT中断表中的INT 3入口;退出INT 3;
根据病毒程序内隐藏的原文件的正常入口地址,跳到原文件正常入口,执行正常程序。
病毒的感染
CIH病毒的传染部分实际上是病毒在驻留内存过程中调用Windows 内核底层函数IFSMgr_InstallFileSystemApiHook函数挂接钩子时指针指示的那段程序。这段程序共586字节,感染过程如下:
文件的截获
每当系统出现要求开启文件的调用时,驻留内存的CIH病毒就截获该文件。病毒调用INT20的VxD call UniToBCSPath系统功能调用取回该文件的名和路径。
EXE文件的判断
对该文件名进行分析,若文件扩展名不为〃。EXE〃,不传染,离开病毒程序,跳回到Windows内核的正常文件处理程序上。
PE格式。EXE判别
目前,在Windows 95/98以及Windows NT,可执行文件。EXE采用的是PE格式。PE格式文件不同于MS…DOS文件格式和WIN 3。X(NE格式,Windows and OS/2 Windows 3。1 execution File Format)。PE格式文件由文件头和代码区(。text Section)、数据区(。data Section)、只读数据区(。rdata Section)、资源信息区(。rsrc Section)等文件实体部分组成。其中文件头又由MS…DOS MZ头、MS…DOS实模式短程序、PE 文件标识(Signature)、PE文件头、PE文件可选头以及各个Sections头组成。
当病毒确认该文件是PE 格式的。EXE文件后,打开该文件,取出该文件的 PE文件标识符(Signature),进行分析,若Signature=〃00455000〃(00PE00),则表明该文件是PE格式的可执行文件,且尚未感染,跳到过程4,对其感染;否则,认为是已感染的PE格式文件或该文件是其它格式的可执行文件,如MS…DOS或WIN 3。X NE格式,不进行感染,而直接跳到病毒发作模块上执行;
病毒的寄生方法,下图是病毒感染PE文件前后的示意图:
感染CIH病毒之前 感染CIH病毒之后
以往的文件型病毒,通常是将病毒程序追加到正常文件的后面,通过修改程序首指针,来执行病毒程序的。这样,受感染的文件的长度会增加。CIH病毒则不是。它利用了PE格式文件的文件头和各个区(Section)都可能存在自由空间碎片这一特性,将病毒程序拆成若干不等的块,见缝插针,插到感染文件的不同的区(Section)内。
CIH病毒的首块程序是插在PE文件头的自由空间内的。病毒首先从文件的第134字节处读入82个字节,这82个字节包含了该文件的程序入口地址(address of EntryPoint);文件的分区数(Number of Section),第一个Section header 首址以及整个文件头大小(Size of Headers=MS header+PE file header+PE optional header+PE section headers+自由空间)等参数。以计算病毒首块存放的位置和大小。
通常PE格式文件头的大小为1024字节,而MZ (DOS可执行文件头)为128字节,PE文件头(包括PE文件的标志)为24字节,PE可选文件头为224字节,以上共376字节,“程序段头”区域大小是根据程序段的数量来确定的,但每个程序段头的大小是固定的,为40字节。一般情况下,一个PE可执行文件有5到6个段,即。text段、。bbs段、。data段、idata段、rsrc段以及reloc段。这样计算下来,整个文件头有408~448字节的自由空间提供给病毒使用。
在PE格式文件头的自由空间里,CIH病毒首先占用了(Section数+1)*8个字节数的空间(本文称为病毒块链表指针区),用于存放每个病毒块的长度(每块4字节)和块程序在文件里的首地址(每块4字节)。然后将计算出的可寄存在文件头内的病毒首块字节数,送入病毒链表指针区;修改PE文件头,用病毒入口地址替换PE文件头原文件程序入口地址,而将原文件的入口地址保存在病毒程序的第94字节内,以供病毒执行完后回到正常文件执行上来。
由于病毒的首块部分除了病毒块链表指针区外必须包含病毒的184字节驻留程序,若文件头的自由空间不足,病毒不会对该文件进行感染。只是将该文件置上已感染标志。
病毒其余块的寄生计算
剩余的病毒代码是分块依次插入到各段里的自由空间里的。
要确定该区(段)是否有自由空间,可通过查看“段头”的参数确定。“程序段头”区域是紧跟在PE可选头区域后面。每个“程序段头”共占40个字节,由Name(程序段名)、VirtualSize(程序段已使用大小)、RVA(程序段的虚拟地址)、PhysicalSize(程序段物理大小)、PhysicalOffset(程序段在文件中的偏移量)和Flags(标志)组成,详细结构就不描述了。
病毒将整个“程序段头”区域读入内存,取第一个“程序段头”,计算出该程序段的自由空间(程序段物理大小 …程序段已使用大小),以确定可存放到该程序段的病毒块字节数。计算出病毒块在该区的物理存放位置(本程序段在文件中的偏移量 +本程序段已使用大小)。计算出病毒块在该文件的逻辑存放位置(=本程序段已使用大小 + 虚拟地址A + PE文件的相对基地址);修改程序段已使用大小为 (病毒长度 + 原来的程序段已使用大小)。修改标志位,置该区为已初始化数据区和可读标志;将该区的病毒块长度和逻辑指针参数写入病毒链表指针区相应区域;求出病毒剩余长度,并取下一个“程序段头”。反复前面的操作,直到病毒全部放入为止。
写入病毒
病毒程序在前面只是计算出了病毒的分块、长度和插入到文件的位置等参数,将这些参数用PUSH指令压入栈中。在计算完所有病毒存放位置后,才从栈中POP出进行写盘操作。写盘的步骤如下:
以逆序将各块病毒写入文件各段(Section)相应的自由空间中;将病毒首块写入文件头自由空间内;将病毒块链表指针区写入文件头;将修改后的“段头”区域写回文件;将修改后的PE 文件头和 PE可选文件头写回文件置病毒感染标志,将IFSMgr_Ring0_FileIO程序的第一个字节(通常是55h='U',即PUSH EBP的操作代码)写到PE文件标识符(Signature)'PE'的前一地址内(原为00h),'00PE0000'改为了'UPE0000'。
病毒读入文件和写入文件都是通过调用系统内核的IFSMgr_Ring0_FileIO的读(EAX=0000D600)和写(EAX=0000D601)功能实现的。
病毒的发作
病毒发作条件判断:
在CIHv1。4中,病毒的发作日期是4月26日,病毒从S的70、71端口取出系统当前日期,对其进行判断:
如果系统当前日期不是4月26日,则离开病毒程序,回到文件的原正常操作上去;若正好是4月26日,则疯狂的CIH病毒破坏开始了!
病毒的破坏
对基本输入输出系统的破坏
通过主板的BIOS端口地址0CFEH和0CFDH向BIOS引导块(boot block)内各写入一个字节的乱码,造成主机无法启动。
为了保存BIOS中的系统基本程序,BIOS先后采用了两种不同的存储芯片:ROM和PROM。ROM(只读存储器)广泛应用于x86时代,它所存储的内容不可改变,因而在当时也不可能有能够攻击BIOS的病毒;然而,随着闪存(FlashMemory)价格的下跌,奔腾机器上BIOS普遍采用PROM(可编程只读存储器),它可以在12伏以下的电压下利用软件的方式,从BIOS端口中读出和写入数据,以便于进行程序的升级。
CIH病毒正是利用闪存的这一特性,往BIOS里写入乱码,造成BIOS中的原内容被会彻底破坏,主机无法启动。所幸的是,CIH只能对少数类型的主板BIOS构成威胁。这是因为,BIOS的软件更新是通过直接写端口实现的,而不同主板的BIOS端口地址各不相同。现在出现的CIH只有1K,程序量太小,还不可能存储大量的主板和BIOS端口数据。它只对端口地址为0CFEH和0CFD的BIOS(据有关资料为英特尔430TX 芯片组、部分奔腾电脑使用的芯片组)进行攻击。
对硬盘的破坏
通过调用Vxd call IOS_Sendmand直接对硬盘进行存取,将垃圾代码以2048个扇区为单位,从硬盘主引导区开始依次循环写入硬盘,直到所有硬盘(含逻辑盘)的数据均被破坏为止。
第五节 漏洞、臭虫还有其他
象任何人造的物品一样,电脑软件作为人类的创造物,同样存在缺陷。越是代码量多,规模庞大的软件,出现漏洞的可能性也就越大,这是由于软件本身的复杂性决定的。在六十年代,曾经出现过一次软件危机。在这一时期软件开始作为一种产品被广泛使用,出现了专门的软件开发公司专门开发软件。但是软件开发的方法基本上仍然沿用早期的个体化软件开发方式,但软件的数量和规模急剧膨胀,软件需求日趋复杂,维护的难度越来越大,开发成本令人吃惊地高,而失败的软件开发项目却屡见不鲜。〃软件危机〃就这样开始了。“软件危机〃使得人们开始对软件及其特性进行更深一步的研究,人们改变了早期对软件的不正确看法。早期那些被认为是优秀的程序常常很难被别人看懂,通篇充满了程序技巧。后来人们普遍认为优秀的程序除了功能正确,性能优良之外,还应该容易看懂、容易使用、容易修改和扩充。这种认识上的进步和软件工程、面向对象技术的出现,使得软件开发的质量有了一定的提高。
但是随着软件的规模达到上百万行,软件的运行环境日益复杂,软件中存在的漏洞和缺陷仍然具有逐步上升的趋势,特别是象微软操作系统这样极其复杂的软件,存在漏洞和臭虫是不可避免的。所以,问题的焦点不在于讨论是否存在漏洞和臭虫,而在于发现这些漏洞和臭虫之后如何处理。
对于〃发现软件漏洞后应作出怎样反应〃的问题,现在有两派:一派支持〃全面披露〃,他们认为发现漏洞后应当全面公布有关漏洞的信息;而另一派则持有比较保守的看法,他们认为应当只公布那些与修补漏洞有关的信息,而且,这些信息应当在软件公司编写出了相关补丁之后再作公布。在这方面,微软通常支持后者。该公司安全响应中心的安全程序经理Scott Culp声称,该公司通过同时发布有关漏洞的信息以及漏洞补丁,使用户得以在黑客行动前采取防护措施。
由于黑客或者病毒程序的作者往往拥有比一般用户更高的技术水平,在对待漏洞上,他们利用的速度要远远超过用户修补漏洞的速度,所以我比较赞成微软的做法,公布漏洞的详细细节更有利于黑客和病毒的作者而不是用户,但是普通用户需要注意的一点就是,一定要及时下载最新的补丁,因为纸是包不住火的,这些漏洞一定会被黑客们发现,而且他们会很快找到利用的办法的,类似“尼姆达”这样的病毒/木马今后会越来越多。
第六节 谁制造了病毒
形形色色的人们,科学家、学生、病毒爱好者等等,出于不同的目的,制造了数万种病毒,而且由于因特网的爆炸性发展,病毒的制造技术越来越简单,人们获得病毒知识的途径也越来越多。病毒制造从早期少数玩家的游戏已经变成一种非常大众化和时尚化的行为了,病毒的数量在可以预见的将来仍然会持续的增长。
学生的课外作业
大量的病毒可能来自学生的课外作业,他们