??近年来,新的计算机病毒发展十分猖獗,而且这些新病毒更加隐蔽、复杂,某些新病毒所具有的破坏性更大,所带来的损失无法估量。这表明计算机病毒的防治尤为重要,同时所面临的形势也更加严峻。本文就在带毒环境下检测清除病毒的方法问题提出一点体会与看法。
??
??一、带毒环境下检测清除病毒的意义
??
??目前在我国流行的病毒一般可分为引导型病毒、文件型病毒和混合型病毒。引导型病毒的特点是它寄生在软盘的DOS引导扇区和硬盘的主引导记录或DOS引导区中,开机时由计算机自动读入内存中执行。文件型病毒则将自身附加在可执行文件上,在执行被感染程序时,病毒首先获得控制权,进行驻留或破坏等活动。混合型病毒既能感染引导区也能感染可执行文件,具有更强的传染性。常用的杀毒软件有KV300、公安部的KILL、美国McAfee公司的SCAN和CLEAN等,这些软件各有自身的优点。但是在一个带毒的环境下,也即在病毒已经驻留在内存中的情况下,这些杀毒软件都存在不足并可能带来一些不良的后果。
??
??当系统感染一种已知病毒时,KILL和SCAN发现内存中有病毒后,一般是拒绝继续执行,并要求用干净的盘重新启动。KV300发出类似的警告信息,但提供给用户一个选择的机会,以确定是否继续执行,很显然,若用户选择继续,所带来的后果是不可预期的。
??
??当系统感染一种未知病毒时,三种软件在未发现内存中有已知病毒后,都假设系统中无病毒,忠实地执行检测或清除功能。事实上,这个未知病毒可能会在检测时传染盘中所有的可执行文件。
??
??由上面的讨论可知,清查病毒时只有从绝对干净的盘启动,而且要求杀毒软件自身无毒,才能够保证万无一失。然而,由于人们相互拷贝各种软件,很大程度上帮助了病毒的传播,在许多情况下,要获得一张干净的启动盘很不容易,并且对于一些对计算机系统了解不是很多的使用者来说,他们根本无法断定一张启动盘是不是干净的。因此,探讨在带毒环境下进行病毒检测和清除的方法是很有意义的。
??
??二、带毒环境下检测清除病毒的原理
??
??对于一个驻留内存伺机进行传染和破坏的病毒来说,一般都要截取某些中断向量,当其他程序调用这些中断时,病毒重新取得控制权,判断是否满足特定的条件,满足则激活传染或破坏部分,在条件不满足的情况下一般是调用原中断服务程序,实现正常的系统功能。
??
??引导型病毒常接管INT13H、08H、10H等中断;文件型病毒则常接管INT21H、24H、25H、26H、1CH、13H、10H等中断。
??
??既然病毒是通过接管中断来获取传染和破坏的机会,那么我们是否有办法找回被病毒接管的中断服务程序的地址,从而杀毒软件可以直接调用原中断,避免激活病毒?笔者认为这是可能的,因为病毒在接管中断后,一般只对读写操作、文件操作和执行等子功能调用感兴趣,对于其他一些功能调用,病毒只是简单地调用原中断服务程序进行处理,并通常使用下列指令进行调用:
??jmp xxxx:xxxx
??call xxxx:xxxx
??jmp far ptr cs:[xxxx]
??call far ptr cs:[xxxx]
??
??以INT21H为例,我们可以调用取DOS版本号的子功能3306H,对整个调用过程进行单步跟踪,并假设病毒驻留的段地址与INT21H原中断段地址是不同的,如果调用过程中CS发生改变,我们把每次CS改变后执行的第一条指令的地址都记录下来,那么INT21H原来的中断地址也必定在其中。
??
??但记录的地址不止一个,究竟哪个是我们所要找的呢?这里我们可以假设病毒在调原中断服务程序时把各个寄存器(指AX、BX、CX、DX、SI、DI、DS、ES)都设置成我们调用时所设置的值,同时真正的中断服务程序返回时又会改变寄存器的值,这个假设在绝大多数情况下都是正确的,从该假设出发,只需在各个寄存器值没有改变的情况下,记录下每次CS改变后的第一条指令的地址,那么在中断返回后,记录中的最近一个地址就是所需找的原中断地址。需要指出的是,如果内存中还有其他驻留程序也接管了INT21H,所找到的地址同样绕过了这些驻留程序。