DOS病毒的感染方法,防治及清除方法(技术类文章)
DOS下的执行文件有三种,一种事COM文件,另一种是EXE文件,还有一种是批处理文件(.bat)大部分的病毒只感染前两种文件,也有极少数的病毒感染批处理文件,但是此种病毒比较少。要想了解如何防治病毒就要先了解一下病毒的常用的感染方法,下面先简单的介绍一下病毒的常用感染方法。
病毒的常用的感染方法主要有三种,第一种是直接在硬盘上查找文件,第二种是驻留内存,第三种是通过引导区和驻留内存配合感染。
第一种感染方法程序实现时比较简单,因此很多的病毒都是这样感染文件的,具体方法就是利用中断21 的4e和4f功能对EXE,COM文件进行搜索,当搜索到文件时就进行感染,此方法的坏处就是隐蔽性低,因为感染时要大量的进行读盘搜索文件,硬盘的灯会闪个不停很容易被发现,因此有的病毒为了提高隐蔽性每次运行时只感染几个文件,但是这样的话就降低了传播的速度。
第二种方法隐蔽性较强,在感染时基本上不会被发现,但是在程序实现时难度比较大。具体的方法是将病毒体驻留内存,然后将21的中断向量入口改为病毒体的入口,当某一个程序调用21中断时就会去执行病毒体,病毒体判断当前的调用是否是文件操作,如果是就将被读写的文件感染。此种方法之所以隐蔽性高是因为不用去搜索文件,因为程序在调用文件操作时要将文件的路径及文件名存入CPU的寄存器中,病毒直接从积存器中就可以取得文件的路径和名称。
第三种感染方法破坏性极强,传播速度也非常快,此种病毒非常顽固往往要花费很多的时间才能清除。此种病毒的感染方法是文件及引导区都感染。当引导区被感染后,计算机启动时在引导区的病毒体就会驻留内存,然后利用第二种感染方法感染文件而且还会利用和第二种方法相同的原理来拦截13中断(磁盘操作中断),当有软盘读写操作时就将软盘的引导区感染,当利用被感染的软盘引导其它计算机时就会感染该计算机的引导区,当发现当前的硬盘引导区没有被感染时就感染硬盘的引导区。清除此种病毒时一定要将引导区和文件同时清除,如果只清除一种的话另一种又会继续感染。如果只清除文件的话,当计算机从新启动时,在引导区的病毒又会驻留内存从新感染文件。如果只清除引导区的话,文件上的病毒又会从新感染引导区。还有一种病毒是感染批处理文件方法是将一些清除数据的命令写入批处理文件中 ,比如将Autoexec.bat文件感染,在文件的最后加上format c:/u命令,这样的话当计算机启动时就会将C盘格式化。
通过以上的介绍不难看出病毒的防治方法,下面将病毒的防治方法总结一下:
1. 在用来历不明的软盘时一定要先将软盘格式化。
2. 自己的引导盘一定要写保护,以免被感染病毒。
3. 当发现硬盘灯经常常么名奇妙的闪烁时,就有可能被感染病毒,一定要用杀毒软件查一下。
4. 查看内存的使用情况,如果被程序占用的内存总量小于内存实际被占用的总量时就有可能是被病毒驻留了内存。
5. 可以利用Debug.exe 查看中断13,21的入口,如果与正常的不符就有可能是被病毒更改。
6. 很多病毒的首选感染目标是command.com,要定期的检查command.com 的大小,如果变大了就是被病毒感染了 。
7. 要经常备份重要的数据和引导区。
8. 现在已经很少有人用DOS了,但是DOS下的病毒在WINDOWS95/98/me上还是可以运行的,但是大部分的病毒对windows已经不具备破坏性了,但是引导区病毒的破坏性却丝毫没有减弱,因此一定要时刻警惕引导区病毒。如果想百分之百的杜绝DOS病毒的话就请运行Windows NT。
如果发现某个文件被病毒感染而且一时又找不到杀毒软件的话我们就要自己动手将病毒清除,对于清除一些比较简单的病毒并不需要有太深的理论基础,只要对汇编语言了解就可以。计算机病毒就是一段程序它可以将自身拷贝到其它执行文件上,大部分都是尾部,然后将正常文件某些数据改掉已使执行文件一启动就先执行病毒体。
要想恢复被感染的文件就要对被感染的文件进行反汇编然后分析,主要的分析方法有两种,静态分析和动态分析。静态分析就是反汇编出染毒文件然后分析程序的流程,由于有些病毒自身是加密的所以静态分析是无法看到正确的病毒程序的,加密就是病毒体将自身感染到文件后要将自身的指令与某一个特定的数进行一次运算,已使自身的代码变得面目全非,当运行时在进行一次相反的解密运算,这样就可以防止被别人静态的分析。对于此类病毒我们就要进行动态分析,就是利用调试工具去动态的执行染毒文件并分析。静态分析DOS病毒所需的常用工具有IDA ,及16进制编辑器WINHEX, HEX,WORKSHOP和UltraEdit等。动态分析DOS病毒所需的常用工具有DOS下的DEBUG.EXE ,TR.EXE等。
下面分别介绍一下COM和EXE 文件的清除方法。
COM文件的结构比较简单所以现介绍一下简单的COM文件的清除方法:
其实COM文件就是一个由计算机指令的二进制码顺序排列成的二进制文件,当被操作系统装载到内存时,整个文件被装载在代码段偏移为100(在本文章中所有的偏移,和数值都是十六进制)的地方,然后就开始执行。大部分的COM病毒都是感染文件尾部的,病毒在感染文件时要将程序的入口(偏移为100处)改成一条JMP指令,通过此条指令跳到病毒体中,已达到让程序在启动时先去执行病毒体的目的。病毒为了保证自己的隐蔽性,都是要把本身执行完以后再去执行正确的程序部分,因此感染文件尾部的病毒都要将它改掉的程序入口部分(偏移为100处)的数据事先保存的病毒体内,在执行病毒体时将程序入口(偏移为100处)数据恢复,当病毒执行完了以后再跳到100处去执行正确的程序,我们为了恢复被病毒感染的文件就要确定此段数据在病毒体内的偏移和长度,并将它恢复,然后再确定病毒体的长度并将其从文件中删除。在分析时如果发现病毒体向100处写了几个字节的数据的话那么就是说明病毒在恢复100处的正确指令,例如:以下几条指令
MOV DI,0100
MOV SI,4300
MOV CX,0005
REP MOVSB
从以上的指令可以看出病毒将在4300处的五个字节的数据恢复到程序入口,4300处在文件中相对于文件头的偏移是4200(因为文件在内存中是从100处开始加载的),我们就可以利用十六进制编辑器将文件中的4200处开始的五个字节拷贝到文件头部。这些做完后病毒体就变成了一段永远不会被运行的僵尸程序,被恢复的文件就可以正常运行了,但是无论做么事我们都要尽善尽美,下面我们在将病毒体清除。在分析病毒时如果发现有写文件的指令时就说明是病毒用这些指令感染文件,在这里就可以发现病毒的长度,例如文件写操作的指令
MOV AH,40
MOV CX,38E
INT 21
从 MOV CX,38E 这条指令就可以看出病毒的长度为38e,然后我们将文件尾部的38e个字节清掉。到此我们已经成功的清除了一个COM病毒。下面讲一下如何清除EXE文件的病毒。
EXE文件的清除方法比较复杂,这是因为EXE文件结构比较复杂,由于篇幅的限制我不能太详细的讲解EXE文件的结构,只能简单的介绍一下和清除简单的EXE病毒有关的那部分,有兴趣的读者可以查阅一下有关EXE文件结构的资料。EXE文件在装载时并不是向COM那样简单,EXE文件装载后的CS和IP,SS和SP是由EXE文件头部的数据决定的。具体如下:
在文件头部起始0E,0F是:在装载时的SS段的偏移。
在文件头部起始10,11是:装载后的SP。
在文件头部起始14,15是:装载后的 IP。
在文件头部起始16,17是:在装载时的CS段的偏移。
在这里的 0E,0F和16,17并不是SS,CS装载后的值,真正的值要通过计算才能得到,具体的计算方法如下:
CS = 在装载时的CS段的偏移+DS和ES+10;
SS = 计算得到的CS+10;
之所以要介绍这些是因为大部分的病毒要将以上的值改掉,使程序装载后的CS:IP指向病毒体的第一条指令,已达到让程序在启动时先去执行病毒体的目的。同COM病毒一样EXE病毒为了保证自己的隐蔽性,也是要把本身执行完以后再去执行正确的程序部分,病毒利用事先保存的以上的四组数据和以上的算法将当前的 CS, IP 修改到正确的程序入口。我们为了恢复被病毒感染的文件就要确定这些数据在病毒体内的偏移,然后将它恢复。确定被病毒保存的数据的方法就是在病毒体中找到以上的算法的指令,在这些指令中就能得到别保存的数据的位置。例如:
mov ax,es
add ax,10
add cs:[bp+00b7],ax
mov sp,cs:[bp+00b9]
add ax,cs:[bp+00bb]
mov ss,ax
jmp 0345:0038
以上的指令中[bp+00b7]就是jmp 0345:0038中0345的地址,0345,0038就是病毒保存的CS,IP。说道这大家应该知道如何恢复这个文件了吧!
确定病毒长度地方法和COM病毒相同,就不重复了。