CIH病毒的运作原理及防范 王应兵 2001年 16期 #1认识CIH病毒   CIH病毒是公认的破坏性最强的电脑病毒之一。它是一种Windows95/98系统下、只感染PE格式的文件的32位文件型恶性病毒。由于使用了 Windows下的VxD(虚拟设备驱动程序)技术,使得这种病毒在Windows环境下传播的破坏性、实时性和隐蔽性都特别强。   CIH 病毒的"原体"加"变种"一共有五种之多,包括V1.0、V1.1、V1.2、V1.3、V1.4总共五个版本,其中最流行的是V1.2版本,即每年4月26日发作的CIH病毒,V1.3版本的发作日期为每年的6月26日;而CIH病毒V1.4版本的发作日期则被修改为每月的26日,这一改变大大缩短了发作期限,增加了它的破坏性和危险性。   #1CIH的运作原理   通常,CIH病毒的传染方式是通过修改文件头部的程序入口地址,使其指向病毒的引导代码,在这一点上,CIH病毒和以前DOS环境中的多数病毒是类似的。下面是CIH病毒的一部分代码:   ……   YYY:010202A5 mov ecx, dr0   YYY:010202A8 jcxz short loc_10202BA ;CIH工作代码   YYY:010202AA add dword ptr [esp],15h   YYY:010202AE   YYY:010202AE loc_10202AE:   YYY:010202AE mov [ebx-4], bp   YYY:010202B2 shr ebp, 10h   YYY:010202B5 mov [ebx+2], bp   YYY:010202B9 iret   ……   由这部分我们可以看出,是CIH工作在Ring0的部分代码,注意黑体字标出的部分,即为CIH判断自身是否已经进驻内存的指令,可以看出,如果dr0寄存器非零,CIH没有做更多的判断即直接退出了。因此我们很容易得到一种免疫CIH的方法,就是仿照CIH所采取的方法,直接修改掉dr0寄存器的值,改为非零即可。   这里需要简单介绍一下dr0寄存器,它属于Intel系列80386以上CPU的调试寄存器组中的一个地址控制寄存器,工作于Ring3级别(应用程序工作特权环)的程序是不能直接访问调试寄存器组的(我们一般编写的程序,都将处在Ring3级别),只有获得系统工作特权环的特权级别Ring0,才可以直接操作调试寄存器组。CIH病毒采用了一种比较巧妙的方法从Ring3环切入了Ring0环,在下面是CIH从Ring3切入Ring0的一段代码。   ……   YYY:01020256 sidt qword ptr [esp-2];取出中断描述符表地址   YYY:0102025B pop ebx;获得中断描述符表地址首地址   YYY:0102025C add [ebx] 1Ch ;修改ebx值,使指向int 3描述项地址   YYY:0102025F cli   YYY:01020260 mov ebp [ebx]   YYY:01020262 mov bp [ebx-4] ;保存原始int 3的入口地址   YYY:01020266 lea esi,[ecx+12h]   YYY:01020269 push esi   YYY:0102026A mov [ebx-4], si   YYY:0102026E shr esi, 10h   YYY:01020271 mov [ebx+2],si;修改int 3入口地址,使指向自身代码   YYY:01020275 pop esi   YYY:01020276 int 3;切入Ring0环运行自身代码   ……   #1如何对CIH免疫   知道了CIH的运作原理,我们就可以相应地编出它的免疫器,无须进驻内存,只需同样切入Ring0,修改掉dr0寄存器的值就可以了,但是,不能直接就把dr0寄存器值修改掉。因为运行免疫程序时,内存中已经驻留了CIH,它会将dr0中置入原始的系统的文件系统API的钩子地址,如果我们贸然将dr0修改掉,带来的直接后果就是系统立刻瘫痪。因此,我们必须在切入Ring0准备修改dr0寄存器的值之前取出dr0的值,判断其并非上述地址才可以修改。   至此,我们已经可以看出CIH免疫器完整免疫CIH的工作原理了,由于每次机器启动都会复位CPU环境。因此,我们必须在每次Windows启动之前抢先运行我们的免疫程序,这样每次打开电脑时,就可以保护电脑不会被CIH感染,CIH永远不会驻留内存.