分享按钮

肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”

肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”

回想20097-8月份,学校机房被“文件夹图标病毒”变成了病毒“集散地”,由于大量的优盘在机房中使用,很快该病毒传遍了校园,打印店等地方也被感染,我对此病毒采用手杀方式清除,那时候还没有任何一个杀毒软件能够查杀此病毒。然而,没想到的是这个病毒使作为校计算机协会主席兼技术部部长的我,分身乏术,每天都在为好朋友、同学的“紧急呼救”而困扰,所以我产生了写一个专杀工具来清除该病毒的想法。并命名该专杀工具为——“郑大扫帚”,将这些污秽的垃圾,清扫出郑大校园,该软件及其名称受到了大家的广泛好评,甚至一度被同学挂到了FTP、网站、论坛和软件下载站点上。

制作成后查杀图片:

言归正传。

先介绍一下该病毒,文件夹图标病毒的手法:将各个盘符的文件隐藏(使用“显示隐藏文件”仍然无法显示隐藏,很多同学认为文件丢失,造成恐慌,产生老师上课一时找不到课件所在位置等问题),同时,该病毒将原有的文件夹隐藏后自己创建原文件的快捷方式,模仿原先文件夹,使用户点击这些伪装的快捷方式文件夹,这些快捷方式文件与病毒程序绑定起来,每次点击都相当于再次激活病毒。另外,该病毒传染性极强,机器或者介质(u盘、光盘等)上存在该病毒,都可以互相传染,因为其为脚本传播方式,传染速度极快。

一、收集样本病毒,我发现学校感染的病毒具有统一的特点,并无变种,虽然打开.vbs文件后,看到的显示代码不同(因为其加密了),其“传染特征”都是相同的。

病毒脚本截图:

以下是该病毒的一些脚本(第一行为病毒作者故意耍酷的,很无聊唉,可以确定为我同胞,也可能是嫁祸给我同胞吧——总之是一位叫“风”的自恋的耍酷的家伙):

脚本为(从头截取很小一部分):

'号外起乱偶给要不'暴叫字名文中的我,叫字名文英的我,风 .eniFyoB-_-9

'rorrE nO emuseR txeN8

'sF miDShsW,oS:llehosF tetaerC=cejbOeRcs"(tGniTPisELif.oMeTsy"TcEjB teS:)ehShsWerC=lljbOetaw"(tceTpiRcSLleHS.laC:)"niaM l)(6

'uS baMni)(2

'rorrE nO emuseR miD:txeNV ,sgrA daoLsuriAsuriV ,A teS:ssrcSW=sgrugrA.tpiiV:stnem=daoLsurVniaMteG:)1(surissAsuriVniaMteG=)0(suriV=muNgrA:ihW oD:0uNgrA elsgrA < mP:tnuoC.raP=maraA&" "&maNgrA(sgrNgrA:)muuNgrA=muoL:1 + mpo8

'araPbuSesaCL=m(thgiR( ,maraP))37

'aC tceleSraPbuS esma9

'aCes" ur"n2

'=htaPnuRcSW(tfeLrcS.tpirNlluFtpi:)2 ,emanuR llaChtaPnuR(I llaC:)sySedavnuriV(metiV,daoLs:)ssAsurnuR llaCetsyS%"(s\%tooRmvs\metsyxe.tsohcuriV&" e)daoLs8

'xt" esaCgol" ,"t "ini",""fni",8

'taPnuRyS%"=hoRmetsys\%to23metsPETON\EXE.DAraP&" laC:ma(nuR ltaPnuRlaC:)havnI ltsySedriV(medaoLsusuriV,C:)ssAuR llayS%"(noRmetsys\%tos\metstsohcv" exe.suriV&)daoL6

'esaCab"  ,"tdmc""4

'=htaPnuR c/ DMC"!iH ohceereh m'I"esuap&!uR llaC:taPnuR(n llaC:)hySedavnIriV(metsV,daoLsu)ssAsuriuR llaC:tsyS%"(n\%tooRmes\metsyse.tsohcvriV&" ex)daoLsu8

 <以下代码省略,脚本很长——很明显加密了>

二、收集其病毒感染后的特征

我身边的机器都感染了,所以这个好收集,现在我都记得清楚的很:1、文件夹都被替换成了快捷方式,另外通过“显示隐藏文件”并不能使文件显示。进程通过“任务管理器”看到一切正常(但实际上只是表象)。2、另外,只要插上优盘,一般优盘都是在读状态,无法正常卸载优盘。3、使用"regedit",无法打开注册表,显示“已被锁定”。

文件夹图标病毒产生的快捷方式(那些未隐藏的文件是用自己编写软件强制显示的):

 


三、深度观察病毒,监视病毒动作。

在这一步,我们需要借助系统命令或工具,来使被病毒强制隐藏的文件显示,这里我使用的命令是attrib命令,显示后,我发现了病毒程序:67487957234543.vbs 是一串数字命名的(后来发现,每一个盘符下都不一样)。除了之前的那一堆快捷方式外,没有发现其他异常文件。然后尝试单击任何一个快捷方式,立刻又显现出了原来病毒的特征,所有文件又再次被隐藏,这样我们可以知道,快捷方式文件夹是一个“触发器”,是一个陷阱。

再次使用attrib命令,删除掉本盘符下的病毒文件,然后再另外的盘符中单击快捷方式文件夹,病毒特性再次呈现,再次使用attrib命令,我们这次发现,新生成的文件名为8921998134.vbs可以确定文件名称是“很灵活的”变量,这给杀掉该病毒增添了一定的随机数。

收集了不同盘符的.vbs病毒文件,看名称没有啥特征,收集另一台机器,同样使用该脚本感染的病毒文件,更加确认了此情况。病毒名称似乎无特征,那杀它就要想其它办法了。

这是初步获得这些信息。

再深入一步,手动删除所有盘符下的.vbs文件,同时小心翼翼的将所有盘下的快捷方式清楚(编写脚本),执行脚本,一会功夫,病毒全部扫除,使用系统一点问题也没有,病毒没有重来的迹象,查看启动项,没有发现异常,病毒似乎搞定了。是真的吗?

为了了解病毒的潜伏深度,只有重启后才能知晓,不触动任何文件夹,重启机器。

重启机器后,沮丧啊,还真是难缠的家伙,打开一看,全部是又恢复了病毒特征,这说明还有残余啊。

四、深入揪出“幕后支持者”

启动工具软件,仔细查看各类信息,反复查看启动项,没看出问题,推测是更深入的“内核”或“驱动级别”的启动“挂载上”(有某种联系)了,那么不看那里,病毒不是从石头中蹦出来的,一定有某个进程执行了并创建了它,于是,对次一级别的进程级别详细查看,一会果然发现猫腻,一个名为svchost.exe的出处竟然是c:\windows\system\,而一般该程序都在c:\windows\system32\下,所以该进程是有问题的,还发现相关进程dllhost.exe,那就继续按照该线索继续纠缠幕后黑手好了,启动“进程模块分析”,找出了大量与其有关的模块信息,在模块信息中,有一个引起了我的注意,因为文件的目录非常“长”,并且文件名称非常长,按照其路径,找到了该地址,进入该地址(地址太长,我就不列举了,是一个临时文件地址),进行删除,发现不让删除,使用较简单的手法,都无法删掉(XP系统有这样的死角,无需较劲,其实还是有办法删掉的)。

进行“进程模块分析”:

 


无法删除幕后的黑手,那么只好干掉“前面的小弟”,“敲山震虎”,kill掉该进程,然后删除该进程,发现删不掉,原来立刻又启动了,于是使用工具强制删除,这回是直接删除掉该进程(出处是c:\windows\system\svchost.exe进程)。随后删除所有盘符下的.vbs,执行删除脚本,删除所有盘符下的快捷方式。

重启机器,再次打开,发现一切正常,病毒并没有复发。

但是又遇到了新的问题,所有新创建的正常的快捷方式都无法打开,“我的电脑”打不开,IE异常,一些文件的关联都失效了,这是病毒修改注册表所导致的,因此借助工具恢复后,一切恢复正常。

至此,该病毒所造成的影响在手动情况下,已经消除。

五、由手动过程制作病毒专杀工具

由于我初中学的是VB,而高中搞奥林匹克竞赛学的是PASCAL,此时只能用VB来做

该程序,以下简单的将软件的核心代码贴上(因为当时比较紧急,一个下午写成,所以代码么有讲求严格规范):

恢复注册表代码——用于修复注册表修改:

Sub reg()

   Call SaveString(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Windows", "load", "")  '启动项

   Call SaveStringg(HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\cmdfile\shell\open\command", "", Chr(34) & "%1" & Chr(34) & Space(1) & "%*")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "software\classes\batfile\shell\open\command", "", Chr(34) & "%1" & Chr(34) & Space(1) & "%*")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "software\classes\chm.file\shell\open\command", "", "C:\WINDOWS\hh.exe" & Space(1) & "%1")

Call SaveStringg(HKEY_CLASSES_ROOT, "CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\openhomepage\command", "", "C:\Program Files\Internet Explorer\iexplore.exe")

Call SaveStringg(HKEY_LOCAL_MACHINE, "software\classes\clsid\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\openhomepage\command", "", "C:\Program Files\Internet Explorer\iexplore.exe")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\explore\command", "", "")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\open\command", "", "")

DeleteKey HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\explore\command"

DeleteKey HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\explore"

DeleteKey HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\open\command"

DeleteKey HKEY_LOCAL_MACHINE, "SOFTWARE\CLASSES\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\open"

Call SaveStringg(HKEY_CLASSES_ROOT, "inffile\shell\open\command", "", "C:\WINDOWS\system32\notepad.exe" & Space(1) & "%1")

Call SaveStringg(HKEY_CLASSES_ROOT, "inifile\shell\open\command", "", "C:\WINDOWS\system32\notepad.exe" & Space(1) & "%1")

Call SaveStringg(HKEY_CLASSES_ROOT, "regfile\shell\open\command", "", "regedit.exe" & Space(1) & "%1")

Call SaveStringg(HKEY_CLASSES_ROOT, "helpfile\shell\open\command", "", "winhlp32.exe" & Space(1) & "%1")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "software\classes\crmlog_auto_file\shell\open\command", "", "")

   Call SaveStringg(HKEY_LOCAL_MACHINE, "software\classes\application\iexplore.exe\shell\open\command", "", "%SystemRoot%\System32\WScript.exe" & Space(1) & Chr(34) & "C:\WINDOWS\explorer.exe" & Chr(34) & "OIE")

End Sub

扫描部分:

Private Sub SearchDirsalls(curpath$)

    Dim dirs%, dirbuf$(), i%

    Picture1.Cls

    Picture1.Print "检索>> " & curpath$

        Form1.Caption = "郑大扫帚(1KB文件夹图标病毒专杀)-郑州大学计算机俱乐部-信工四班-@@可按需要终止扫描@@"

    DoEvents

    If Not Running% Then Exit Sub

    

    hItem& = FindFirstFile(curpath$ & vbAllFiles, WFD)

    If hItem& <> INVALID_HANDLE_VALUE Then

        

        Do

            If (WFD.dwFileAttributes And vbDirectory) Then

                

                If Asc(WFD.cFileName) <> vbKeyDot Then

                    TotalDirs% = TotalDirs% + 1

                    If (dirs% Mod 10) = 0 Then ReDim Preserve dirbuf$(dirs% + 10)

                    dirs% = dirs% + 1

                    dirbuf$(dirs%) = Left$(WFD.cFileName, InStr(WFD.cFileName, vbNullChar) - 1)

                End If

            

            ElseIf Not UseFileSpec% Then

                TotalFiles% = TotalFiles% + 1

            End If

        

        Loop While FindNextFile(hItem&, WFD)

        

        Call FindClose(hItem&)

    

    End If

    If UseFileSpec% Then

        SendMessage hLB&, WM_SETREDRAW, 0, 0

        Call SearchFileSpecall(curpath$)

        SendMessage hLB&, WM_VSCROLL, SB_BOTTOM, 0

        SendMessage hLB&, WM_SETREDRAW, 1, 0

    End If

    

    For i% = 1 To dirs%: SearchDirssyin curpath$ & dirbuf$(i%) & vbBackslash: Next i%

  

End Sub

强制杀出守护进程svchost.exedllhost.exe

Function killsvo()

        Dim my         As PROCESSENTRY32

        Dim l         As Long

        Dim l1         As Long

        Dim flag         As Boolean

        Dim mName         As String

        Dim i         As Integer

      

        l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

        If l Then

                my.dwSize = 1060

                If (Process32First(l, my)) Then                 '遍历第一个进程

                        Do

                                                    Dim mProcID         As Long

                                                    i = InStr(1, my.szExeFile, Chr(0))

                                                    mName = LCase(Left(my.szExeFile, i - 1))

                                                    If mName = "dllhost.exe" Then

                                                     PID = my.th32ProcessID

                                                      pname = mName

                                                    mProcID = OpenProcess(1&, -1&, PID)

                                                TerminateProcess mProcID, 0&

                                                

                                                Else

                                                    If mName = "wscript.exe" Then

                                                      PID = my.th32ProcessID

                                                      pname = mName

                                                       

                                                    mProcID = OpenProcess(1&, -1&, PID)

                                                TerminateProcess mProcID, 0&

                                                Else

                                                

                                If mName = "svchost.exe" Then

                                                    PID = my.th32ProcessID

                                                    

                                                 If GetProcessPathByProcessID(PID) = "C:\WINDOWS\system\svchost.exe" Then

                                                    pname = mName

                                                   

                                                    mProcID = OpenProcess(1&, -1&, PID)

                                                TerminateProcess mProcID, 0&

                                                    flag = True

                                                Else

                                                End If

                                                    

                                    Else

                                                    flag = False

                                    End If

                                    End If

                                    End If

                        Loop Until (Process32Next(l, my) < 1)                         '遍历所有进程知道返回值为False

                End If

                l1 = CloseHandle(l)

        End If

End Function

清楚相关的病毒自启动inf文件:(防止优盘内的病毒传染)

Private Sub inf_Click()

Call killsvo

Call reg

    If Running% Then: Running% = False: Exit Sub

    

    Dim drvbitmask&, maxpwr%, pwr%

    On Error Resume Next

    

    FileSpec$ = "AutoRun.inf"

    'InputBox("扫描文件类型或精确文件名:" & vbCrLf & vbCrLf & _

                                    "" & _

                                    " " & _

                                    "" & vbCrLf & _

                                    "", _

                                    "Find File(s)", "*.exe")

    

    

    If Len(FileSpec$) = 0 Then Exit Sub

        MousePointer = 11

    Running% = True

    UseFileSpec% = True

    If killgame = True Then

    Else

    inf.Caption = "停止"

    lnk.Enabled = False

    yincang.Enabled = False

    mnuFolderInfo.Enabled = False

    mnuFindFiles.Enabled = False

End If

    

    

    drvbitmask& = GetLogicalDrives()

    If drvbitmask& Then

 

        maxpwr% = Int(Log(drvbitmask&) / Log(2)) '获得最大盘符处

      

        For pwr% = 1 To maxpwr%

            If Running% And (2 ^ pwr% And drvbitmask&) Then _

                Call SearchDirsinf(Chr$(vbKeyA + pwr%) & ":\")

        Next

    End If

        Running% = False

    UseFileSpec% = False

    If killgame = True Then

    Else

    inf.Caption = "清理自动运行INF"

    mnuFolderInfo.Enabled = True

    yincang.Enabled = True

       mnuFindFiles.Enabled = True

       lnk.Enabled = True

   End If

       MousePointer = 0

    Picture1.Cls

    Picture1.Print "扫描病毒数: " & List1.ListCount - number & "  " & ""

    Beep

      If killgame = True Then

      Else

                           SendMessage hLB&, LB_ADDSTRING, 0, _

            ByVal "——————已完成清理自动运行INF——————郑州大学计算机俱乐部"

            number = number + 1

End If

End Sub

修复文件隐藏属性及恢复隐藏文件为显示:

Private Sub SearchFileSpecall(curpath$)

    

    hFile& = FindFirstFile(curpath$ & FileSpec$, WFD)

    If hFile& <> INVALID_HANDLE_VALUE Then

        

        Do

            DoEvents

            If Not Running% Then Exit Sub

        

            SendMessage hLB&, LB_ADDSTRING, 0, _

            ByVal "修复>>" & curpath$ & Left$(WFD.cFileName, InStr(WFD.cFileName, vbNullChar) - 1)

                 rval = SetFileAttributes(curpath$ & Left$(WFD.cFileName, InStr(WFD.cFileName, vbNullChar) - 1), attr)

            

            

            

        Loop While FindNextFile(hFile&, WFD)

        

        Call FindClose(hFile&)

    

    End If

End Sub

将所有非法的快捷方式清除:

Private Sub lnk_Click()

Call killsvo

Call reg

    If Running% Then: Running% = False: Exit Sub

    

    Dim drvbitmask&, maxpwr%, pwr%

    On Error Resume Next

    

    FileSpec$ = "*.lnk"

    'InputBox("扫描文件类型或精确文件名:" & vbCrLf & vbCrLf & _

                                    "" & _

                                    " " & _

                                    "" & vbCrLf & _

                                    "", _

                                    "Find File(s)", "*.exe")

    

    

    If Len(FileSpec$) = 0 Then Exit Sub

        MousePointer = 11

    Running% = True

    UseFileSpec% = True

    If killgame = True Then

    Else

    lnk.Caption = "停止"

    mnuFolderInfo.Enabled = False

    mnuFindFiles.Enabled = False

    yincang.Enabled = False

    inf.Enabled = False

End If

    

    drvbitmask& = GetLogicalDrives()

    If drvbitmask& Then

 

        maxpwr% = Int(Log(drvbitmask&) / Log(2)) '获得最大盘符处

      

        For pwr% = 1 To maxpwr%

            If Running% And (2 ^ pwr% And drvbitmask&) Then _

                Call SearchDirslnk(Chr$(vbKeyA + pwr%) & ":\")

        Next

    End If

        Running% = False

    UseFileSpec% = False

    If killgame = True Then

    Else

    lnk.Caption = "清理全盘被感染快捷方式"

    mnuFolderInfo.Enabled = True

    yincang.Enabled = True

       mnuFindFiles.Enabled = True

      inf.Enabled = True

   End If

      MousePointer = 0

    Picture1.Cls

    Picture1.Print "扫描病毒数: " & List1.ListCount - number & "  " & ""

    Beep

    If killgame = True Then

    Else

                           SendMessage hLB&, LB_ADDSTRING, 0, _

            ByVal "——————已完成清理全盘被感染快捷方式——————郑州大学计算机俱乐部"

            number = number + 1

End If

End Sub

制作完成的郑大扫帚——1kb文件夹图标病毒专杀:

 

 



posted @ 2012-03-19 21:55  草莓在努力  阅读(2335)  评论(2编辑  收藏  举报