肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”
回想2009年7-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.exe和dllhost.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文件夹图标病毒专杀: