CIH病毒庐山真面目
/ns/wz/otherwz/data/20020810031505.htm
CIH病毒庐山真面目
一年前的7月26日,一个名叫CIH的计算机病毒首次露面,袭击了美国,病毒发作时直接往计算机主板BIOS芯片和硬盘写乱码,破坏力非常大,可造成主机无法启动,硬盘数据全部被清洗。一个月后,该病毒在中国大陆出现,给多家计算机应用单位造成严重损失。今年4月26日该病毒又一次在全球总爆发,据有关报道,全球有六千万台电脑受到破坏,大量重要资料无法复原,灾情严重者,连计算机主板硬件也不得不更换。仅一天,由于CIH病毒发作,在中国大陆受损的电脑总数约有卅六万台,
所造成的直接、间接经济损失超过十亿元人民币。
CIH病毒是一种文件型病毒,又称Win95.CIH、Win32.CIH、PE_CIH,是第一例感染Windows95/98环境下PE格式(Portable
Executable Format)EXE文件的病毒。
不同于以往的DOS型病毒,CIH病毒是建立在WINDOW95/98平台。由于微软WINDOWS平台的不断发展,DOS平台已逐渐走向消亡,DOS型病毒也将随之退出历史的舞台。随之而来的是攻击Windows系统病毒走上计算机病毒的前台。可以预测,在未来几年内,连同宏病毒在内,Windows平台将会是造病毒和反病毒的主战场。
因此,剖析CIH病毒机理,掌握在Windows平台下病毒驻留和传染方法,对于预防、检测和清除CIH病毒,预防未来新型Windows病毒,在反病毒的战场上掌握主动权,都具有十分重要的意义。
目前CIH病毒有多个版本,典型的有:CIHv1.2:四月二十六日发作,长度为1003个字节,包含字符:CIHv1.2TTIT;CIHv1.3:六月二十六日发作,长度为1010个字节,包含字符:CIHv1.3TTIT;CIHv1.4:每月二十六日发作,长度为1019个字节,包含字符:CIHv1.4TATUNG。其中,最流行的是CIHv1.2版本。本文将作重对该版本进行剖析。
病毒的表现形式、危害及传染途径
CIH病毒是一种文件型病毒,其宿主是Windows 95/98系统下的PE格式可执行文件即.EXE文件,就其表现形式及症状而言,具有以下特点:
1.受感染的.EXE文件的文件长度没有改变;
2.DOS以及WIN 3.1 格式(NE格式)的可执行文件不受感染,并且在Win NT中无效。
3.用资源管理器中"工具>查找>文件或文件夹"的"高级>包含文字"查找.EXE特征字 符串----"CIH
v",在查找过程中,显示出一大堆符合查找特征的可执行文件。
4.若4月26日开机,显示器突然黑屏,硬盘指示灯闪烁不停,重新开机后,计算机无法启动。
病毒的危害主要表现在于病毒发作后,硬盘数据全部丢失,甚至主板上的BIOS中的原内容被会彻底破坏,主机无法启动。只有更换BIOS,或是向固定在主板上的BIOS中重新写入原来版本的程序,才能解决问题。
该病毒是通过文件进行传播。计算机开机以后,如果运行了带病毒的文件,其病毒就驻留在Windows的系统内存里了。此后,只要运行了PE格式的.EXE文件,这些文件就会感染上该病毒。
病毒的运行机制
同传统的DOS型病毒相比,无能是在内存的驻留方式上还是传染的方式上以及病毒攻击的对象上,CIH病毒都于众不同,新颖独到。病毒的代码不长,CIHv1.2只有1003个字节,其他版本也大小差不多。它绕过了微软提供的应用程序界面,绕过了ActiveX、C++甚至C,使用汇编,利用VxD(虚拟设备驱动程序)接口编程,直接杀入Windows内核。它没有改变宿主文件的大小,而是采用了一种新的文件感染机制即碎洞攻击(fragmented
cavity
attack),将病毒化整为零,拆分成若干块,插入宿主文件中去;最引人注目的是它利用目前许多BIOS芯片开放了可重写的特性,向计算机主板的BIOS端口写入乱码,开创了病毒直接进攻计算机主板芯片的先例。可以说CIH病毒提供了一种全新的病毒程序方式和病毒发展方向。下面对该病毒作进一步的剖析,该病毒程序由三部分组成。
1.CIH病毒的驻留(初始化)
当运行带有该病毒的.EXE时,由于该病毒修改了该文件程序的入口地址(Address of
EntryPoint),首先调入内存执行的是病毒的驻留程序,驻留程序长度为184字节,其驻留主要过程如下:
1.用SIDT指令取得IDT base address(中断描述符表基地址),然后把IDT的INT 3
的入口地址改为指向CIH自己的INT3程序入口部分;
2.执行INT 3指令,进入CIH自身的INT 3入口程序,这样,CIH病毒就可以获得Windows最高级别的权限(Ring
0级),可在Windows的内核执行各种操作(如终止系统运行,直接对内存读写、截获各种中断、控制I/O端口等,这些操作在应用程序层Ring
3级是受到严格限制的)。病毒在这段程序中首先检查调试寄存器DR0的值是否为0,用以判断先前是否有CIH病毒已经驻留。
3.如果DR0的值不为0,则表示CIH病毒程式已驻留,病毒程序恢复原先的INT 3入口,然后正常退出INT3,跳到过程9;
4.如果DR0值为0,则CIH病毒将尝试进行驻留。首先将当前EBX寄存器的值赋给DR0寄存器,以生成驻留标记,然后调用INT 20中断,使用VxD
call Page Allocate系统调用,请求系统分配2个PAGE大小的Windows系统内存(system
memory),Windows系统内存地址范围为C0000000h~FFFFFFFFh,它是用来存放所有的虚拟驱动程序的内存区域,如果程序想长期驻留在内存中,则必须申请到此区段内的内存。
5.如果内存申请成功,则从被感染文件中将原先分成多块的病毒代码收集起来,并进行组合后放到申请到的内存空间中;
6.再次调用INT 3中断进入CIH病毒体的INT
3入口程序,调用INT20来完成调用一个IFSMgr_InstallFileSystemApiHook的子程序,在Windows内核中文件系统处理函数中挂接钩子,以截取文件调用的操作,这样一旦系统出现要求开启文件的调用,则CIH病毒的传染部分程序就会在第一时间截获此文件;
7.将同时获取的Windows默认的IFSMgr_Ring0_FileIO(核心文件输入/输出)服务程序的入口地址保留在DR0寄存器中,以便于CIH病毒调用;
8.恢复原先的IDT中断表中的INT 3入口,退出INT 3;
9.根据病毒程序内隐藏的原文件的正常入口地址,跳到原文件正常入口,执行正常程序。
2.病毒的感染
CIH病毒的传染部分实际上是病毒在驻留内存过程中调用Windows
内核底层函数IFSMgr_InstallFileSystemApiHook函数挂接钩子时指针指示的那段程序。这段程序共586字节,感染过程如下:
1.文件的截获
每当系统出现要求开启文件的调用时,驻留内存的CIH病毒就截获该文件。病毒调用INT20的VxD call
UniToBCSPath系统功能调用取回该文件的名和路径。
2.EXE文件的判断
对该文件名进行分析,若文件扩展名不为".EXE",不传染,离开病毒程序,跳回到Windows内核的正常文件处理程序上;
3.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头组成。其格式结构图见图1。
Windows PE格式文件结构的详细分析可到下列网址查阅:
http://www.microsoft.com/win32dev/base/pefile.htm
CIH病毒感染的就是PE格式可执行文件!
当病毒确认该文件是.EXE文件后,打开该文件,取出该文件的
PE文件标识符(Signature),进行分析,若Signature="00455000"(00PE00),则表明该文件是PE格式的可执行文件,且尚未感染,跳到过程4,对其感染;否则,认为是已感染的PE格式文件或该文件是其它格式的可执行文件,如MS-DOS或WIN
3.X NE格式,不进行感染,而直接跳到病毒发作模块上执行;
4.病毒首块的寄生计算:
以往的文件型病毒,通常是将病毒程序追加到正常文件的后面,通过修改程序首指针,来执行病毒程序的。这样,受感染的文件的长度会增加。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字节,而MS header为128字节,PE file header(包括PE
Signature)为24字节,PE optional header为224字节,以上共376字节,Section headers
大小是根据Sections
数量来确定的,但每个Section的大小是固定的,为40字节。一般情况下,Section有5~6个即.text区、.bbs区、.data区、idata区、rsrc区以及reloc区。这样计算下来,整个文件头有408~448字节的自由空间提供给病毒使用。
在PE格式文件头的自由空间里,CIH病毒首先占用了(Section数+1)*8个字节数的空间(本文称为病毒块链表指针区),用于存放每个病毒块的长度(每块4字节)和块程序在文件里的首地址(每块4字节)。然后将计算出的可寄存在文件头内的病毒首块字节数,送入病毒链表指针区;修改PE文件头,用病毒入口地址替换PE文件头原文件程序入口地址,而将原文件的入口地址保存在病毒程序的第94字节内,以供病毒执行完后回到正常文件执行上来。
由于病毒的首块部分除了病毒块链表指针区外必须包含病毒的184字节驻留程序,若文件头的自由空间不足,病毒不会对该文件进行感染。只是将该文件置上已感染标志。
5.病毒其余块的寄生计算
剩余的病毒代码是分块依次插入到各Section里的自由空间里的。
要确定该区(Section)是否有自由空间,可通过查看Section Header里的参数确定。Section Headers区域是紧跟在PE
Optional Header 区域后面。每个Section
Header共占40个字节,由Name(区名)、VirtSize(本已使用大小)、RVA(本区的虚拟地址)、PhysSize(区物理大小)、Phys
off(本区在文件中的偏移量)和Flags(标志)组成。其结构如下所示:
typedef struct _IMAGE_SECTION_HEADER {
UCHAR Name[8];
ULONG VirtSize;
ULONG RVA;
ULONG PhysSize;
ULONG Pyus off;
ULONG PointerToRelocations;
ULONG PointerToLinenumbers;
USHORT NumberOfRelocations;
USHORT NumberOfLinenumbers;
ULONG Flags;
} IMAGE_SECTION_HEADER
病毒将整个Section Headers读入内存,取第一个Section
Header,计算出该Section的自由空间(=PhysSize-VirtSize),以确定可存放到该区的病毒块字节数;计算出病毒块在该区的物理存放位置(=Physoff+VirtSize);计算出病毒块在该文件的逻辑存放位置(=VirtSize+RVA+ImageBase);修改VirtSize(=该块病毒长度+原VirtSize);修改Flags,置该区为已初始化数据区和可读标志;将该区的病毒块长度和逻辑指针参数写入病毒链表指针区相应区域;求出病毒剩余长度,并取下一个Section
Header。反复前面的操作,直到病毒全部放入为止。
6.写入病毒
病毒程序在前面只是计算出了病毒的分块、长度和插入到文件的位置等参数,将这些参数用PUSH指令压入栈中。在计算完所有病毒存放位置后,才从栈中POP出进行写盘操作。写盘的步骤如下:
以逆序将各块病毒写入文件各区(Section)相应的自由空间中;
将病毒首块写入文件头自由空间内;
将病毒块链表指针区写入文件头;
将修改后的Section Headers写回文件;
将修改后的PE File Header 和 PE File Option Header写回文件
置病毒感染标志,将IFSMgr_Ring0_FileIO程序的第一个字节(通常是55h='U',即PUSH
EBP的操作代码)写到PE文件标识符(Signature)'PE'的前一地址内(原为00h),'00PE0000'改为了'UPE0000'。
病毒读入文件和写入文件都是通过调用系统内核的IFSMgr_Ring0_FileIO的读(EAX=0000D600)和写(EAX=0000D601)功能实现的。
病毒在PE格式文件中存放位置见图2。
2.病毒的发作
1.病毒发作条件判断
在CIHv1.4中,病毒的发作日期是4月26日,病毒从COMS的70、71端口取出系统当前日期,对其进行判断:
MOV AX,0708
OUT 70,AL
IN AL,71 取当前系统月份->AL
XCHG AL,AH
OUT 70,AL
IN AL,71 取当前系统日->AL
XOR AX,0426 是否为4月26日
JZ 病毒发作程序
如果系统当前日期不是4月26日,则离开病毒程序,回到文件的原正常操作上去;若正好是4月26日,则疯狂的CIH病毒破坏开始了!
2.病毒的破坏
①通过主板的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(据有关资料为Intel
430TX chipset、部分Pentium chipsets)进行攻击。
②覆盖硬盘
通过调用Vxd call
IOS_SendCommand直接对硬盘进行存取,将垃圾代码以2048个扇区为单位,从硬盘主引导区开始依次循环写入硬盘,直到所有硬盘(含逻辑盘)的数据均被破坏为止。
3.病毒的清除
目前,检测和清除CIH病毒的程序已有很多, KV300、瑞星、Norton
Antiviurs,这些杀病毒工具都非常有效。受CIH病毒破坏后系统如何恢复的文章也有不少。这里本文只给出一般的检测和清除方法和程序。
病毒的检测
①利用"资源管理器"进行搜寻
具体的搜索方法为:首先开启"资源管理器",选择其中的菜单功能"工具>查找>文件或文件夹",在弹出的"查找文件"设置窗口的"名称和位置"输入中输入查找路径及文件名(如:*.EXE),然后在"高级>包含文字"栏中输入要查找的特征字符串----"CIH
v",最后点取"查找键"即可开始查找工作。如果在查找过程中,显示出一大堆符合查找特征的可执行文件,则表明你的计算机上已经感染了CIH病毒。
但这种方法中存在着一个致命的缺点,那就是:如果用户已感染了CIH病毒,那么这样一个大面积的搜索过程实际上也是在扩大病毒的感染面。
②Debug检测PE Signature
用\windows\command\debug.com检测.EXE。
通过"程序"进入"MS-DOS方式",在MS-DOS方式下:
DEBUG XXX.EXE
-D CS:3F 41
如果显示的值是0x554550("UPE"),则该文件有可能已经感染了CIH病毒。