U盘病毒之文件夹杀手的分析与查杀

前几天在学校机房里面上课回来的时候,自己在机房里面用过的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');

由于注册表启动键值不定,故用手动清除比较好。