前几天在学校机房里面上课回来的时候,自己在机房里面用过的U盘从里面带回了一个病毒,这个病毒正是本文题目所说的,是个U盘病毒的一个新变种—文件夹杀手。
先说说我对这个病毒的分析。中毒之后,我发现我的电脑每个硬盘根目录下面的文件夹都打不开了,双击文件夹之后一点反应都没有,当时我就知道多半是中了病毒了。然后我细心一看,原来现在我们看到的根目录下面的文件夹根本不是一个文件夹,而是一个exe文件,由于我电脑设置的是不显示文件的后缀名,所以当时还没有看出来,当我设置显示后缀名时才看出来。这些exe文件和我们原来的文件夹的名字是一样的,也就是原来有多少个文件夹这里就对应有多少个与之同名的exe文件,当然这些exe文件是和文件夹的图标是一样的,不然一下子就让你看出来了。
现在我们看到的是exe文件,那么,我们原来的那些文件夹呢,到哪儿去了?因为每个文件夹里面都是有非常多的东西,所以我推断这些文件夹不可能是被病毒删掉了,因为这么多文件夹里面又有那么多的文件,想全部删掉可不是一时半会就能完成的,再说了,系统文件夹也不见了,而我系统功能没什么异样,说明这些文件夹并没有删。既然没有被删,那就极有可能是被隐藏起来了,于是我就设置系统显示所有隐藏文件和系统文件。果然不出我所料,我们的文件夹原形毕露。
既然是从U盘里面传过来的病毒,那么U盘里面肯定有病毒的母体喽。于是我打开我的U盘,果然,U盘里面的文件夹也中招了,在U盘根目录下面我看到了一个隐藏exe文件,名字叫Notepad.exe,这个不就是我们系统记事本的名字吗?好端端的干嘛要冒充记事本的名字呢,肯定有鬼!后来经我测试,这个文件就是那个病毒。另外,在U盘时面也看到了一个autorun.inf文件,呵呵,典型的autorun病毒,看看里面的内容:
[AutoRun] open=Notepad.exe shell\1=打开(&O) shell\1\Command=Notepad.exe shell\2\=浏览(&B) shell\2\Command=Notepad.exe shellexecute=Notepad.exe
以上这些代码功能就是使你的U盘在打开的时候自动运行。无论在双击还是用资源管理器打开,还是浏览都会自动运行U盘里面的Notepad.exe文件,即是运行病毒。这就是U盘病毒自动运行和传播原理之一(不过现在已经过时了,呵呵)。
找到了病毒,接着当然就是除之而后快啊,我以迅雷不及掩耳之势删掉那个病毒和那些没有用的exe文件夹,再把原来文件夹的属性恢复过来。清除完毕,原以为就这样就完了,就可以摆脱那个病毒了,但是……
当我重启电脑后,发现那个病毒又回来了,那些exe文件夹也回来了,郁闷,又中毒了!这一次我确病毒就在我电脑里面,因为我这一次并没有插上U盘。既然重启之后还能再中毒,那说明这个病毒复制本身到我们硬盘里面,然后添加了一个随机启动的方式,以便在你电脑启动时病毒又能再次发作。
想到随机启动方式,可多呢,有注册表方法,注册表里面又有好几个地方都可以写值,还可以利用系统服务启动等等。我就先从注册表入手,一个一个地找那些可以自启动的键值,终于在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]这下面找到了一个叫Notepad.exe的启动键值,这不就是那个病毒吗?然后再看一个键值里面的这个文件的启动路径,路径为C:\WINDOWS\system32\381310,于是立马找到这个文件夹,是一个系统属性的文件夹,里面有一个名叫DEA925.EXE的隐藏文件,看一下大小,和先前的那介病毒一样大,那就说明这就是那个被复制到硬盘上的病毒的“后代”了。删掉注册表键值,再删掉那个DEA925.EXE,这个病毒就算是除清完毕了。
再说说这个病毒的查杀。手动查杀当然是可以,但是既然我们已经知道了这个病毒的性质,我们就可以写一个专杀工具。这里我就用Delphi来写,用作演示。
如何建立一个工程我就不说了,值得说明一下的是,为了使程序体积尽可能的小,我们不能窗体,直接移掉窗体,只添加Windows,Sysutils这两个单元就行了。
首先写一个查找中毒目录并杀毒的过程,代码如下:
procedure SearchAndKill(path:string); var sr:TSearchRec; begin if FindFirst(path+'*.*',faDirectory or faHidden,sr)=0 then begin if((sr.Name<>'.') and (sr.Name<>'..')) then begin if FileExists(path+sr.Name+'.exe') then begin DeleteFile(path+sr.Name+'.exe'); if sr.Attr and faHidden <>0 then FileSetAttr(path+sr.Name,sr.Attr-faHidden); if sr.Attr and faSysFile <>0 then FileSetAttr(path+sr.Name,sr.Attr-faSysFile); if sr.Attr and faReadOnly <>0 then FileSetAttr(path+sr.Name,sr.Attr-faReadOnly); end; end; while (FindNext(sr)=0) do //循环查找 begin if((sr.Name<>'.') and (sr.Name<>'..')) then begin if FileExists(path+sr.Name+'.exe') then begin //中毒后的处理 DeleteFile(path+sr.Name+'.exe'); if sr.Attr and faHidden <>0 then FileSetAttr(path+sr.Name,sr.Attr-faHidden); if sr.Attr and faSysFile <>0 then FileSetAttr(path+sr.Name,sr.Attr-faSysFile); if sr.Attr and faReadOnly <>0 then FileSetAttr(path+sr.Name,sr.Attr-faReadOnly); end; end; end; end; FindClose(sr);//关闭查找 end;
这个过程的作用就是搜索传过来的目录参数Path目录下面的文件夹,判断是否中毒,如果中毒则进行中毒后的处理。
再写一个获取驱动器并杀毒的过程,代码如下:
procedure FindDrivers; const Drivers:array[0..25] of string=('A:\','B:\','C:\','D:\','E:\','F:\','G:\','H:\','I:\','J:\','K:\','L:\','M:\','N:\','O:\','P:\','Q:\','R:\','S:\','T:\','U:\','V:\','W:\','X:\','Y:\','Z:\'); var i,result:integer; begin for i:=0 to 25 do begin result:=GetDriveType(pchar(Drivers[i])); //这里调用了API函数 if (result=DRIVE_REMOVABLE) OR (result=DRIVE_FIXED) then SearchAndKill(drivers[i]); //调用我们刚才写的查杀的过程 end; end;
最后在程序的主体上写代码,调用我们刚才写的那两个过程,代码如下:
begin FindDrivers; //获取驱动器并查杀 MessageBox(0,'姓名:陈明'+#13+'学院:测绘学院'+#13+'学号:200731610384'+#13+'------------------敬上','清除完毕',MB_ICONINFORMATION);//杀完后的提示信息 end.
还有,我们得删掉电脑上的病毒体,在程序主体里面加上代码:
DeleteFile('C:\WINDOWS\system32\381310\DEA925.EXE');
由于注册表启动键值不定,故用手动清除比较好。