zoukankan      html  css  js  c++  java
  • 肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”

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

    回想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文件夹图标病毒专杀:



    欢迎转载,转载请注明出处。本文出自:http://www.cnblogs.com/zdcaolei
    0
  • 相关阅读:
    国产化硬件设备性能追踪
    遇到的 超时重传
    系统加载
    nginx 全景图 转载
    引擎国产化适配&重构笔记
    记录一次syn后只收到ack的情况 --timewait
    PCIe网卡查看工具
    短说 反向代理&透传代理如何关闭connect
    XDP/AF_XDP ? eBPF
    ipvs--eBPF转载
  • 原文地址:https://www.cnblogs.com/zdcaolei/p/2406952.html
Copyright © 2011-2022 走看看