监听代码如下(VB6):
Dim AllData As String
Private Sub Command1_Click()
Command1.Enabled = False
Winsock1.LocalPort = "80"
Winsock1.Listen
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim gDate() As Byte
ReDim gData(bytesTotal) As Byte
Winsock1.GetData gData
For i = 0 To bytesTotal - 1
AllData = AllData & Chr(gData(i))
Next
Text1.Text = AllData
End Sub
这样一来,只要有信息向本地80端口提交,就能将其截获。
当我在浏览器中提交form的时候,截获到如下信息:
POST /Test HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322)
Host: localhost
Content-Length: 21
Connection: Keep-Alive
Cache-Control: no-cache
value1=123&value2=456
这就是标准的以POST方式发送的HTTP头了(我当初太笨,怎么不早点想到-_-!)
其中,第一行的/Test就是发送目标地址的路径,也就是<form action="http://localhost/Test"> 中的"/Test"
Host:LocalHost就是你的目标主机,这里我设的是本地主机
最后一行的value1=123&value2=456就是发送的表单内容及其的值。
用HTML描述的话就是:
<input type="text" name="value1" value="123">
<input type="text" name="value2" value="456">
这两项就是最主要的信息(要发送的目标和要发送的内容)。
要注意的一点就是,在写HTTP头的时候,在"Cache-Control:no-cache"和"value1=123&value2=456"这两行之间一定要留一个空行,而"value1=123&value2=456"之后就什么也不要留了,一个空格都不能留,不然就会发送失败!(为什么要这样做?这个要问W3C了,他们就是这样规定的,这个就是传说中的“标准”~_~)
好了,既然HTTP的格式搞好了,那就可以自己写个头来发送了~~~
见下面代码(VB6):
Private Sub Command1_Click()
Winsock1.RemoteHost = RemoteHost.Text
Winsock1.RemotePort = "80"
Winsock1.Connect
End Sub
Private Sub Command2_Click()
Winsock1.Close
End Sub
Private Sub Label2_Click()
End Sub
Private Sub Winsock1_Connect()
Dim sData
sData = ""
sData = sData & "POST " & Action.Text & " HTTP/1.1" & vbCrLf
sData = sData & "Accept: */*" & vbCrLf
sData = sData & "Accept-Language: zh-cn" & vbCrLf
sData = sData & "Content-Type: application/x-www-form-urlencoded" & vbCrLf
sData = sData & "Accept-Encoding: gzip, deflate" & vbCrLf
sData = sData & "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322)" & vbCrLf
sData = sData & "Host: " & Winsock1.RemoteHost & vbCrLf
sData = sData & "Content-Length: " & Len(Value) & vbCrLf
sData = sData & "Connection: Keep-Alive" & vbCrLf
sData = sData & "Cache-Control: no-cache" & vbCrLf & vbCrLf
sData = sData & Value.Text
Winsock1.SendData sData
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim gDate() As Byte
ReDim gData(bytesTotal) As Byte
Winsock1.GetData gData
For i = 0 To bytesTotal - 1
AllData = AllData & Chr(gData(i))
Next
Text2.Text = AllData
End Sub
其中,
Private Sub Winsock1_Connect()
Dim sData
sData = ""
sData = sData & "POST " & Action.Text & " HTTP/1.1" & vbCrLf
sData = sData & "Accept: */*" & vbCrLf
sData = sData & "Accept-Language: zh-cn" & vbCrLf
sData = sData & "Content-Type: application/x-www-form-urlencoded" & vbCrLf
sData = sData & "Accept-Encoding: gzip, deflate" & vbCrLf
sData = sData & "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322)" & vbCrLf
sData = sData & "Host: " & Winsock1.RemoteHost & vbCrLf
sData = sData & "Content-Length: " & Len(Value) & vbCrLf
sData = sData & "Connection: Keep-Alive" & vbCrLf
sData = sData & "Cache-Control: no-cache" & vbCrLf & vbCrLf
sData = sData & Value.Text
Winsock1.SendData sData
End Sub
这段代码是向目标主机发送HTTP头。
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim gDate() As Byte
ReDim gData(bytesTotal) As Byte
Winsock1.GetData gData
For i = 0 To bytesTotal - 1
AllData = AllData & Chr(gData(i))
Next
Text2.Text = AllData
End Sub
这段代码就用来获得从目标返回的数据信息,
这样一来,就可以模拟浏览器向服务器发送表单信息发,其实其原理还是多简单的。。。。