按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
00),则表明该文件是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声称,该公司通过同时发布有关漏洞的信息以及漏洞补丁,使用户得以在黑客行动前采取防护措施。
由于黑客或者病毒程序的作者往往拥有比一般用户更高的技术水平,在对待漏洞上,他们利用的速度要远远超过用户修补漏洞的速度,所以我比较赞成微软的做法,公布漏洞的详细细节更有利于黑客和病毒的作者而不是用户,但是普通用户需要注意的一点就是,一定要及时下载最新的补丁,因为纸是包不住火的,这些漏洞一定会被黑客们发现,而且他们会很快找到利用的办法的,类似“尼姆达”这样的病毒/木马今后会越来越多。
第六节 谁制造了病毒
形形色色的人们,科学家、学生、病毒爱好者等等,出于不同的目的,制造了数万种病毒,而且由于因特网的爆炸性发展,病毒的制造技术越来越简单,人们获得病毒知识的途径也越来越多。病毒制造从早期少数玩家的游戏已经变成一种非常大众化和时尚化的行为了,病毒的数量在可以预见的将来仍然会持续的增长。
学生的课外作业
大量的病毒可能来自学生的课外作业,他们对汇编语言有好奇心,愿意学习这样一门新的语言,如果他们有机会接触到一些病毒的源代码