LINKS

 

 

[回首页]

CIH感染的原理分析







  CIH发作时将会把部分5V电压的Flash ROM重写,填入杂乱的数据,使机器无法启动,同时从第一个硬盘的第一个扇区开始以2048个字节为单位将内存中不相关的数据填入硬盘。IOS_SendCommand是Win95的一个非常底层的VXD调用,通常是用作对IO设备的低层操作,如:读,写,加锁,格式化等等。一般情况下只能在Ring 0和虚拟机中使用。CIH病毒先构造一个IOR,再使用IOS_SendCommand调用,完成IOR所指定的功能。 病毒指定第一次写的磁盘为第一个磁盘,位置为0,即0柱面0磁头1扇区,指定一次写的长度为2048个字节,然后调用IOS_SendCommand进行一次写操作。如果成功,将继续重复写操作,直到将所有的扇区全部写完,然后转到第二个硬盘继续写。

  病毒理想的情况是将所有硬盘全部写完。但由于写盘的速度比较慢,加之Flash ROM在硬盘破坏之前被破坏,因此很可能导致死机或被用户Reset复位,所以病毒不会将所有的数据破坏掉,通常只能破坏硬盘前部的几百个至上千个扇区。而现在的硬盘都比较大,病毒并没有破坏到数据区,这就给恢复提供了先决条件。

  CIH 病毒病毒实现了干净样本和染毒样本 Setup.exe的文件大小完全相同, 用Debug跟踪染毒样本Setup.exe的文件头时, 发现DOS环境中跟踪结果指向了 "Theprogram cannot berunat DOS mode"。这只能意味着一件事 --新病毒是Windows 95病毒,感染的是95环境下执行的PE格式的 EXE文件。

  病毒全长只有 1019字节,而且还分为九块,见缝插针,插到染毒样本的不同部分。对比Setup.exe和干净样本Setup1.exe, 原来一些数值为0的连续字节被病毒体所占据。

  一般情况下,杀毒者对付病毒有两种基本方法: 静态方法是通过反汇编,得到病毒体的源代码;而动态方法则是用Debug和WinDebug去跟踪染毒样本的执行过程。由于开始时无法确认病毒体在染毒样本中的位置, 因而查毒、杀毒都是从Debug开始,在执行过程中对比染毒样本和相应干净样本状态变化,从中发现病毒体的位置, 同时,也为编写将染毒样本还原为干净样本的杀毒算法提供依据。但要进一步了解病毒发作的机理,就必须对病毒体进行反汇编。

  这种病毒居然通过端口操作攻击BIOS!用户BIOS将被垃圾信息填满, 除非使用特殊设备重新写入原来的BIOS程序, 否则用户机器会因被"洗脑"而不得不更换BIOS芯片或主板。

  CIH对BIOS的攻击,以及由此引起的"硬件"故障,是CIH病毒最大的"卖点",也最容易引起人们的恐慌。不过,这一点说穿了其实也没什么,CIH仍然是一段寄生性、传染性的程序。

  CIH工作机理:

  1.攻击BIOS

  CIH病毒最异乎寻常之处,是它对计算机BIOS的攻击。打开计算机时,BIOS首先取得系统的控制权,它从CMOS中读取系统设置参数,初始化并协调有关系统设备的数据流,在这之后,系统控制权移交给硬盘或软盘的引导区,最后转给操作系统。

  为了保存BIOS中的系统基本程序,BIOS先后采用了两种不同的存储芯片:ROM和 PROM。ROM(只读存储器)广泛应用于x86时代,它所存储的内容不可改变,因而在当时也不可能有能够攻击BIOS的病毒;然而,随着闪存(FlashMemory)价格的下跌, 奔腾机器上BIOS普遍采用PROM(可编程只读存储器),它可以在12伏以下的电压下利用软件的方式,从BIOS端口中读出和写入数据。

  在CIH发作时,会试图向BIOS中写入垃圾信息,BIOS中的内容会被彻底洗去。这时,补救办法只有更换BIOS,或是向固定在主板上的BIOS中重新写入原来版本的程序。现在市面上常见的BIOS多达30种以上,有时直接更换主板反而是更为简便、经济的选择。从这个角度上,CIH病毒被称为是首例直接攻击和破坏计算机硬件系统的病毒。

  必须指出的是,从理论上CIH只能对少数类型的主板BIOS构成威胁。这是因为, BIOS的软件更新是通过直接写端口实现的,而不同主板的BIOS端口地址各不相同。现在出现的CIH只有1K,程序量太小,还不可能存储大量的主板和BIOS端口数据,以实现对不同主板的自动识别,因此病毒制造者设计CIH时,必然只会根据某类主板的参数编写。实际上,据网上有关资料看,目前已发作的CIH病毒,确实只对某一类主板生效。

  2.覆盖硬盘

  向硬盘写入垃圾内容也是CIH的破坏性之一,从实际的影响看,覆盖硬盘所带来的损失至少不逊于对BIOS的攻击。据Ontrack国际数据公司统计,7月26日遭病毒袭击的硬盘,平均修复费用为400到1000美元。CIH发作时,调用IOSμSendCommand直接对硬盘进行存取,将垃圾代码以2048个扇区为单位,循环写入硬盘,直到所有硬盘(含逻辑盘)的数据均被破坏为止。

  3.打入Windows内核

  无论是要攻击BIOS,还是设法驻留内存来为病毒传播创造条件,对CIH这类Windows 95/98病毒而言,关键是要打入Windows内核,取得核心级控制权。例如,只有在Ring0 (核心级)状态下运行,程序才有权调用PageAllocate,把病毒体驻留在内存中;也只 有在此时,才能调用IFSMgrμInstallFileSystemApiHook,来截获系统的IFSAPI,从 而当系统打开文件时,病毒能够通过调用IFSMgrμRing0μFileIO,感染其他Windows 95/98执行程序。

  这说明,CIH病毒与Windows 95/98系统有紧密的相关性,正因如此,CIH病毒目前 在Windows NT平台上无法传播。

   就技巧而言,其原理主要是使用Windows的VxD(虚拟设备驱动程序)编程方法,使用这一方法的目的是获取高的CPU权限,CIH病毒使用的方法是首先使用SIDT取得IDTbase address(中断描述符表基地址),然后把IDT的INT 3 的入口地址改为指向CIH自己的INT3程序入口部分,再利用自己产生一个INT 3指令运行至此CIH自身的INT 3入口程序出,这样CIH病毒就可以获得最高级别的权限(即权限0),接着病毒将检查DR0寄存器的值是否为0,用以判断先前是否有CIH病毒已经驻留。如DR0的值不为0,则表示CIH病毒程式已驻留,则此CIH副本将恢复原先的INT 3入口,然后正常退出(这一特点也可以被我们利用来欺骗CIH程序,以防止它驻留在内存中,但是应当防止其可能的后继派生版本)。如果判断DR0值为0,则CIH病毒将尝试进行驻留,其首先将当前EBX寄存器的值赋给DR0寄存器,以生成驻留标记,然后调用INT 20中断,使用VxD call Page Allocate系统调用,要求分配Windows系统内存(system memory),Windows系统内存地址范围为C0000000h~FFFFFFFFh,它是用来存放所有的虚拟驱动程序的内存区域,如果程序想长期驻留在内存中,则必须申请到此区段内的内存,即申请到影射地址空间在C0000000h以上的内存。

  如果内存申请成功,则接着将从被感染文件中将原先分成多段的病毒代码收集起来,并进行组合后放到申请到的内存空间中,完成组合、放置过程后,CIH病毒将再次调用INT 3中断进入CIH病毒体的INT 3入口程序,接着调用INT20来完成调用一个IFSMgr_I nstallFileSystemApiHook的子程序,用来在文件系统处理函数中挂接钩子,以截取文件调用的操作,接着修改IFSMgr_InstallFileSystemApiHook的入口,这样就完成了挂接钩子的工作,同时Windows默IFSMgr_Ring0_FileIO(InstallableFileSystemManager, IFSMgr)。服务程序的入口地址将被保留,以便于CIH病毒调用,这样,一旦出现要求开启文件的调用,则CIH将在第一时间截获此文件,并判断此文件是否为PE格式的可执行文件,如果是,则感染,如果不是,则放过去,将调用转接给正常的Windows IFSMgr_IO服务程序。CIH不会重复多次地感染PE格式文件,同时可执行文件的只读属性是否有效,不影响感染过程,感染文件后,文件的日期与时间信息将保持不变。对于绝大多数的PE程序,其被感染后,程序的长度也将保持不变,CIH将会把自身分成多段,插入到程序的空域中。完成驻留工作后的CIH病毒将把原先的IDT中断表中的INT 3入口恢复成原样。

   主板Flash ROM中的BIOS程序怎会被破坏的?

   PC机上常用来保存PC BIOS程序的Flash ROM包含两个电压接口,其中+12V一般用Boot Block的改写,Boot Block为一特殊的区块,它主要用于保存一个最小的BIOS,用以启动最基本的系统之用,当Flash ROM中的其它区块内的数据被破坏时,只要Boot Block内的程序还处于可用状态,则可以利用这一基本的PC BIOS程序来启动一个最小化的系统,一般情况下,起码应当支持软盘的读写以及键盘的输入,这样我们就有机会使用软盘来重新构建整个Flash ROM中的数据。一般的主板上均包含有一个专门的跳线,用来确定是否给此Flash ROM芯片提供+12V电压,只有我们需要修改Flash ROM中的Boot Block区域内的数据时,才需要短接此跳线,以提供+12V电压。

   另外一路电压为+5V电压,它可以用于维持芯片工作,同时为更新Flasm ROM中非Boot Block区域提供写入电压。

   就以上的理论,可以得出:主板上的+12V跳线是为了防止更新Flash ROM中的Boot Block区域而设置的,如果想升级BIOS,同时此升级程序只需要更新Boot Block区域以外的BIOS程序,则主板上的跳线根本没必要去跳,因为更新Boot Block区域以外的数据并不需要+12V电压,这样,即使升级失败,我们也还存在着一个Boot Block中的最基本BIOS可以使用,这样就可以使用软盘来恢复原先的BIOS数据(一般在升级的时候后,都提示用户保存当前的BIOS数据)。

  以上的理论是非常美好的,可为什么还是有拥护的BIOS程序在CIH病毒的魔爪下被彻底摧毁了呢?

  第一种情况是主板上的跳线处于短接状态,即Flash ROM芯片已经有+12V电压了,这一情况是由于用户不小心造成的,或者干脆是根本不知道。这就得怪你自己了。

  第二种情况不是由用户造成的,而是由厂家造成的,这里涉及到一个比较复杂的问题,由于上面美好的Boot Block概念是建立在Intel的基础之上的,也就是说,Intel公司拥有此项专利,这就导致使用此类技术的一般都是Intel公司出的Flash ROM芯片,如常见的 Intel 28F0 芯片,当然,世界上并不是只有InteL一家公司会生产Flash ROM,象Atmel、MXIC、SST、Winbond等公司也能生产,而且可以保证管脚兼容,但是某些芯片在+5V的电压下就可以进行改写,这些单5V的芯片便是造成BIOS数据被彻底破坏的原应。就本人所知,SST、Winboard、Atmel公司出的这些芯片都是具有单5V可改特性的。以下是一些参考信息:

  写入电压 5 Volt 12 Volt

  Atmel AT29LC010 -

  Intel -- 28F001BX-T

  MXIC -- MX28F1000

  SST 29EE010 --

  Winbond W29EE011 --

  (主板厂家为什么不使用如Intel公司的带"Boot Block"保护的芯片呢?道理很简单,其他公司的产品更便宜!)

  技巧:对于这些单5V可写芯片的保护措施是将其WE (Write Enable)管脚设为无效,例如Atmel AT29C10A芯片的31脚为WE引脚,属性为低电平有效,则只要将此引脚与VCC(+5V)相连,将其电平拉高即可。一般情况下如果使用插座的Flash ROM芯片,则可考虑不将此脚插入,另外焊条线与VCC连接即可。

(乐亿阳,2000-04-24)