CIH病毒的运作原理及防范

Author: 王应兵 Date: 2001年 16期

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