vb截包,发包知识及三大利器的使用

目录

第一章:截包知识,本章主要介绍用HttpWatch软件截取网络数据包的方法及技巧

第二章:发包知识,本章主要介绍数据包的构成

第三章:三大利器的使用,本章主要介绍vb使用xmlhttp对象、webbrowser控件、inet控件进行Post发包、Get发包的方法

第一章

本文要用到的截包工具是HttpWatch,其他软件使用方法都差不多这里不再阐述。
软件下载地址: http://pan.baidu.com/s/1269w8
下载后请注意压缩包内的httpwatch.lic为授权文件,安装完成后把httpwatch.lic复制到安装目录里面>
安装完成后打开IE-工具-HttpWatch(IE6的直接能在主界面看到不用进工具里了),打开该软件,如图所示:

vb截包,发包知识及三大利器的使用

点击右上角的vb截包,发包知识及三大利器的使用,软件界面会分离出另外一个窗口

vb截包,发包知识及三大利器的使用

 

我来介绍下按钮的功能, 平常用到的就3个按钮,代表开始截取、停止截取、清除截取的数据

 

vb截包,发包知识及三大利器的使用

再来介绍下面的界面:

vb截包,发包知识及三大利器的使用

 

平常用到的是Qverview、Content、Stream,Qverview的可以查看Post过去的详细目标地址,Content查看请求回来的返回值,Stream查看数据包信息!

vb截包,发包知识及三大利器的使用

第二章

先发一段数据,我们来分析它<登陆百度的包>

  1. POST /?login HTTP/1.1
  2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
  3. Referer: https://passport.baidu.com/?login&amp;tpl=mn
  4. Accept-Language: zh-cn
  5. Content-Type: application/x-www-form-urlencoded
  6. Accept-Encoding: gzip, deflate
  7. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 663; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
  8. Host: passport.baidu.com
  9. Content-Length: 236
  10. Connection: Keep-Alive
  11. Cache-Control: no-cache
  12. Cookie:
  13. tpl_ok=&amp;next_target=&amp;tpl=mn&amp;skip_ok=&amp;aid=&amp;need_pay=&amp;need_coin=&amp;pay_method=&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;return_method=get&amp;more_param=&amp;return_type=&amp;psp_tt=0&amp;password=123465&amp;safeflg=0&amp;username=sunshinebean&amp;verifycode=&amp;mem_pass=on

关于Http头的构成我不阐述,详见:

http://hi.baidu.com/absky_cxb/blog/item/f28065017032760a738da5cb.html

这里主要讲Post包的构成及比较重要的Http头参数

  1. Http头里的Referer参数,简单的说就是来路,然后目标服务器能知道你这个Http请求是哪个页面请求过去的,有些服务器就是判断来路的所以这个参数比较重要
  2. Http头里的Content-Type参数,提交的是网页信息可以是application/x-www-form-urlencoded,假如提交图片信息这个参数也会随之变成data
  3. Post的包参数全部用&符号隔开的,=号后面的是参数的值。有些参数是固定不变的有些却是随机改变的,这些参数80%能在网页源码里找到,10%能在cookie里找到,10%能在JS里构造(这个比较麻烦要会分析JS),在上面这段数据里变动的就帐号跟密码,别的参数都是固定的,当然这个结论要多次分析获得。比如这里的包, username=sunshinebean,password=123465就对应百度的帐号跟密码

 

第三章

一:VB创建Xmlhttp对象

  1. Private Function GetHtmlStr$(StrUrl$, switch%) '获取源码
  2. Dim XmlHttp
  3. Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
  4. XmlHttp.Open "GET", StrUrl, True
  5. XmlHttp.send
  6. stime = Now '获取当前时间
  7. While XmlHttp.ReadyState &lt;&gt; 4
  8. DoEvents
  9. ntime = Now '获取循环时间
  10. If DateDiff("s", stime, ntime) &gt; 3 Then GetHtmlStr = "": Exit Function '判断超出3秒即超时退出过程
  11. Wend
  12. GetHtmlStr = StrConv(XmlHttp.ResponseBody, vbUnicode)
  13. Set XmlHttp = Nothing
  14. End Function

这个是我自己写的一个函数,主要作用是获取指定网页的源码
XmlHttp.Open "GET", StrUrl, True
"GET"是数据的请求方式,还有种就是POST提交数据写成"POST"
StrUrl是指定的网址,GET请求时写要GET的目的网址,POST时写提交的目的地址
True是异步,False是同步,区别就是同步是等待数据全部获取后再显示,所以会卡,而异步则不会卡,所以推荐用异步比较好
XmlHttp.setRequestHeader "Referer", RefUrl
指定来路,上章已经提到过Referer参数的重要性了, RefUrl就写截包截来的那个来路
XmlHttp.setRequestHeader "CONTENT-TYPE", "application/x-www-form-urlencoded"
这个上章也提到过,是类型,一般都是按截的包里面的写,网页的话直接写成这样就好:"application/x-www-form-urlencoded"
XmlHttp.send "XXX"
这里的XXX就是post的包内容,Get的话这个是空的,POST的话把包的内容写在这里
然后该函数返回POST的返回信息,我们一般可以在返回值里提取出特定的东西来判断执行某样东西是否成功

二:webbrowser
先看段代码:

  1. Private Sub Command1_Click()
  2. Dim URL$, Flags&amp;, TargetFrame$, PostData() As Byte, Headers$
  3. URL = "https://passport.baidu.com/?login"
  4. Flags = 0
  5. TargetFrame = ""
  6. PostData = "tpl_ok=&amp;next_target=&amp;tpl=mn&amp;skip_ok=&amp;aid=&amp;need_pay=&amp;need_coin=&amp;pay_method=&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;return_method=get&amp;more_param=&amp;return_type=&amp;psp_tt=0&amp;password=123456&amp;safeflg=0&amp;username=sunshinebean&amp;verifycode="
  7. PostData = StrConv(PostData, vbFromUnicode)
  8. Headers = "Content-Type: application/x-www-form-urlencoded" &amp; vbCrLf
  9. WebBrowser1.Navigate URL, Flags, TargetFrame, PostData, Headers
  10. End Sub
  11.  
  12. Private Sub Form_Load()
  13. WebBrowser1.Navigate "http://baidu.com"
  14. End Sub

Webbrowser有个Navigate方法,参数是这样的:
object.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers]
拿出MSDN,查之,如下

  1. URL:
  2. Required. A string expression that evaluates to the URL, full path, or Universal Naming Convention (UNC) location and name of the resource to display.
  3.  
  4. Flags:
  5. Optional. A constant or value that specifies whether to add the resource to the history list, whether to read from or write to the cache, and whether to display the resource in a new window. It can be a combination of the following constants or values. Constant Value Meaning
  6. navOpenInNewWindow 1 Open the resource or file in a new window.
  7. navNoHistory 2 Do not add the resource or file to the history list. The new page replaces the current page in the list.
  8. navNoReadFromCache 4 Do not read from the disk cache for this navigation.
  9. navNoWriteToCache 8 Do not write the results of this navigation to the disk cache.
  10.  
  11. TargetFrameName:
  12. Optional. String expression that evaluates to the name of an HTML frame in URL to display in the browser window. The possible values for this parameter are: _blank Load the link into a new unnamed window.
  13. _parent Load the link into the immediate parent of the document the link is in.
  14. _self Load the link into the same window the link was clicked in.
  15. _top Load the link into the full body of the current window.
  16. &lt;window_name&gt; A named HTML frame. If no frame or window exists that matches the specified target name, a new window is opened for the specified link.
  17.  
  18. PostData:
  19. Optional. Data to send to the server during the HTTP POST transaction. For example, the POST transaction is used to send data gathered by an HTML form to a program or script. If this parameter does not specify any post data, the Navigate method issues an HTTP GET transaction. This parameter is ignored if URL is not an HTTP URL.
  20. Headers
  21. Optional. A value that specifies additional HTTP headers to send to the server. These headers are added to the default Internet Explorer headers. The headers can specify things like the action required of the server, the type of data being passed to the server, or a status code. This parameter is ignored if URL is not an HTTP URL.

URL 指定需要使用的网页。
flags 指定是否将该资源添加到历史列表、或通过高速缓存读写,将该资源显示在一个新窗口中、或这些方式的组合。
targetframename 指定目标显示区的名称。
postdata 指定需要发送到 HTTP的Post的数据。
headers 指定需要发送的 HTTP 标题。
整合了下就是这样。PostData构造方法一样,就是要特别注意的是数据要转成vbFromUnicode才能提交

三,INET控件

我想这个控件大家应该不陌生吧,很多VB写的程序啊软件都用到了这个控件,这家伙封装了Http和Ftp协议使用起来很方便所以用的人很多。代码也很简洁呵呵~~

  1. Dim PostDate As String
  2. If Inet1.StillExecuting = True Then Exit Sub
  3. PostDate = "tpl_ok=&amp;next_target=&amp;tpl=mn&amp;skip_ok=&amp;aid=&amp;need_pay=&amp;need_coin=&amp;pay_method=&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;return_method=get&amp;more_param=&amp;return_type=&amp;psp_tt=0&amp;password=123456&amp;safeflg=0&amp;username=sunshinebean&amp;verifycode="
  4. Inet1.Execute "https://passport.baidu.com/?login", "POST", PostDate, "Referer: https://passport.baidu.com/?login&amp;tpl=mn" &amp; vbCrLf &amp; "Content-Type: application/x-www-form-urlencoded"

Inet和xmlhttp的好处就是能提交Referer
URL是Post的目标地址, operation是Get方法或者Post方法,data 是Post的数据, requestHeader是Referer来路和Content-Type

下面讲下数据的返回:

  1. 在inet的StateChanged事件里返回数据,判断state是不是12,原因:
  2. 0 未报告状态icHostResolvingHost
  3. 1 控件正在寻找指定主机的IP地址icHostResolved
  4. 2 控件已成功找到指定主机的IP地址icConnecting
  5. 3 控件正在与指定主机进行连接icConnected
  6. 4 控件已成功与指定主机连接icRequesting
  7. 5 控件正在向主机发出请求icRequestSent
  8. 6 控件已成功向主机发出请求icReceivingResponse
  9. 7 控件正在从主机接收反馈信息icResponseReceived
  10. 8 控件已成功从主机接受反馈信息icDisconnecting
  11. 9 控件正在与主机断开icDisconnected
  12. 10 控件已与主机断开icError
  13. 11 在与主机通信的过程中发生了错误icResponseCompleted
  14. 12 请求结束且数据已经接收到
  1. Dim strData$
  2. Dim bDone As Boolean: bDone = False
  3. vtData = Inet1.GetChunk(1024, icString)
  4. Do While Not bDone
  5. strData = strData &amp; vtData
  6. DoEvents
  7. vtData = Inet1.GetChunk(1024, icString)
  8. If Len(vtData) = 0 Then
  9. bDone = True
  10. End If
  11. Loop

这里返回string类型的源码。。要是二进制或者UTF8的话还要简单
定义一个byte数组就行了
Dim Buff() As Byte
Buff = Inet1.GetChunk(0, icByteArray)
获取到的图图保存在路径下面再用picture加载就是图图了。UTF8的源码用解码函数进行解码即可解决乱码的问题,UTF8解码函数:

  1. Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
  2. Private Const CP_UTF8 = 65001
  3. Function Utf8ToUnicode(ByRef Utf() As Byte) As String
  4. Dim lRet As Long
  5. Dim lLength As Long
  6. Dim lBufferSize As Long
  7. lLength = UBound(Utf) - LBound(Utf) + 1
  8. If lLength &lt;= 0 Then Exit Function
  9. lBufferSize = lLength * 2
  10. Utf8ToUnicode = String$(lBufferSize, Chr(0))
  11. lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf(0)), lLength, StrPtr(Utf8ToUnicode), lBufferSize)
  12. If lRet &lt;&gt; 0 Then
  13. Utf8ToUnicode = Left(Utf8ToUnicode, lRet)
  14. Else
  15. Utf8ToUnicode = ""
  16. End If
  17. End Function
  18. 调用Utf8ToUnicode(Buff)即可!

4条评论

  1. vb截包,发包知识及三大利器的使用
    avatar

    其实。。。如果只是看GET或者是POST。。。用火狐的Live HTTP Headers就够了。。。

    • vb截包,发包知识及三大利器的使用
      avatar
      Lv.6 1楼-1

      没装火狐。。。

  2. vb截包,发包知识及三大利器的使用
    avatar

    另外,我觉得把重写去掉应该好些。写完评论,总是习惯直接点最右边的按钮。。。在这儿几次直接重写。。。

    • vb截包,发包知识及三大利器的使用
      avatar
      Lv.6 2楼-1

      OK~

    发表评论

  1. 😉
  2. 😐
  3. 😡
  4. 😈
  5. 😯
  6. 😛
  7. 😳
  8. 😮
  9. 😆
  10. 💡
  11. 😀
  12. 👿
  13. 😥
  14. 😎
  15. 😕