none
請問要如何攔截所有封包程式 RRS feed

  • 問題

  • 請問各位大大,不知道要怎麼做才能攔截所有進出本機電腦的封包,請問有沒有什麼範例可供參考?

    先謝謝各位大大

     

    2006年12月12日 下午 12:14

解答

  • Winpcap 本身不是有釋出 source code 可以看嗎:
    http://www.winpcap.org/devel.htm
    2006年12月14日 上午 09:08
    版主
  • 其實我覺得你一開始的態度就有點激將法,這樣會讓看的人有點不爽,會當作沒看到,不想回。

    我是認為你根本關鍵字就用錯了,找不到滿正常的。你應該用 Sniffer 作關鍵字。

    例如這是一個著名的原始碼網站,以此關鍵字搜尋到的結果。

    http://www.pscode.com/vb/scripts/BrowseCategoryOrSearchResults.asp?txtCriteria=Sniffer&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&lngWId=10&optSort=Alphabetical

    你可以抓 2006 年的那個範例:

    http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=4519&lngWId=10

    在我電腦上以 VB2005 執行結果:

    這個範例完全沒有呼叫任何外部函式庫,完全用 VB.NET 構成,注意,這個範例是 VB2003 的範例,在 VB2005 必須自己把原始碼改為委派,否則會因為控制項不是產生執行緒的控制項而無法顯示抓到封包的結果。

    圖上被遮罩的是我的電腦 IP 位置,左右兩邊都有,就表示上下傳都有,從圖上可以看到有抓到 MSN / HTTP 兩個協定。(因為我這邊虛擬網路有保護,沒啥多餘流量可看),封包內容則由跳出式視窗顯示,若你要顯示內容,建議你修改跳出視窗,用下拉式選單 5 種編碼選 1 解看看,ANSI、Big5、Unicode、UTF7、UTF8。

    2006年12月14日 下午 12:09
    版主
  • 觀念可參考:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1440.entry

    VB2005 需修改 frmMain.vb

    ' 新增

      Delegate Sub DelegatePacketListAdd(ByVal lstItem As ListViewItem)

      Public Sub PacketListAdd(ByVal lstItem As ListViewItem)
       PacketList.Items.Add(lstItem)
       StatusBar.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize)
      End Sub

      Private Sub OnNewPacket(ByVal m As Monitor, ByVal p As Packet)
       Dim iP As IPlugin

       For Each iP In Plugins
        If Not iP.OnPacketArrive(m.IP, p) Then Exit Sub
       Next

       Dim lstItem As ListViewItem = New ListViewItem
       m_Packets.Add(p)
       m_PacketsSize += p.TotalLength
       Try
        With lstItem
         .Text = p.Time.ToString
         .SubItems.Add(p.Protocol.ToString)
         .SubItems.Add(p.Source.ToString)
         .SubItems.Add(p.Destination.ToString)
         .SubItems.Add(p.TotalLength.ToString)
        End With
       Catch ex As Exception
        MsgBox(ex.Message)
       End Try

    ' 修改

       'PacketList.Items.Add(lstItem)
       'StatusBar.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize)

       Me.BeginInvoke(New DelegatePacketListAdd(AddressOf PacketListAdd), New Object() {lstItem})

      End Sub

    2006年12月15日 上午 09:04
    版主
  • 如果有漏在說,我不太確定有沒有漏。加個下拉式選單:

    Private Sub cboEncoding_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboEncoding.SelectedIndexChanged

         If Not IsNothing(m_Packet) Then

              Select Case sender.Text

                   Case "Hex"

                        RawText.Text = m_Packet.ToString()

                   Case Else

                        Dim strDecode As System.Text.Encoding

                        Select Case sender.Text

                             Case "ASCII"

                                  strDecode = System.Text.Encoding.ASCII

                             Case "Default"

                                  strDecode = System.Text.Encoding.Default

                             Case "Unicode"

                                  strDecode = System.Text.Encoding.Unicode

                             Case Else

                                  strDecode = System.Text.Encoding.GetEncoding(sender.Text)

                        End Select

                        Dim rowBytes() As Byte = m_Packet.GetBytes()

                        Dim offsetLoc As Integer

                        Select Case m_Packet.Protocol

                             Case Protocol.Tcp

                                  offsetLoc = (rowBytes(20 + 13 - 1) \ 16) * 4 + 20

                             Case Protocol.Udp

                                  offsetLoc = 8 + 20

                        End Select

                        Dim nLen As Integer = m_Packet.TotalLength - offsetLoc

                        If nLen > 0 Then

                             Dim arrBytes(nLen - 1) As Byte

                             Array.Copy(rowBytes, offsetLoc, arrBytes, 0, nLen)

                             RawText.Text = strDecode.GetString(arrBytes)

                        Else

                             RawText.Text = "(無資料)"

                        End If

              End Select

         End If

    End Sub

    2007年2月7日 上午 03:12
    版主

所有回覆

  • 剛剛在網站上找到一個攔截的範例,是把socket改成rcvall的,但我試完的結果發現,雖可以用,但很多封包都沒完整攔截(上傳就沒攔到),不知道有沒有人知道其他的方式可以用來攔封包?
    2006年12月13日 上午 07:51
  • HI,

    您可以利用搜尋引擎搜尋 TCP TRACE, HTTP TRACE, 或是TCP LISTEN, HTTP LISTEN, 就可以找到一堆工具, 甚至原始碼可供參考

    tihs

    2006年12月13日 上午 11:05
  • 我在google和雅虎等,都找過了,沒找到什麼"真正"能攔截"所有"封包的範例程式,請知道的人可否直接告知我,thanks
    2006年12月14日 上午 02:15
  • 如果你要攔截 "所有" 封包,那只有撰寫系統層級的程式(NDIS Driver API),並放在網路卡的資料連結層來截取封包(和 Sniffer 相同的作法),並且自己要撰寫封包處理和解析機制。

    但這方面的資訊,你要查閱 DDK 才會有資料 ...。

    2006年12月14日 上午 03:11
    版主
  • 難道真的只能用winpcap作而已嗎?試過winpacp是能做沒錯,但我不想用別人寫好的dll,因為這樣就不知道原理了
    2006年12月14日 上午 08:30
  • Winpcap 本身不是有釋出 source code 可以看嗎:
    http://www.winpcap.org/devel.htm
    2006年12月14日 上午 09:08
    版主
  • 其實我覺得你一開始的態度就有點激將法,這樣會讓看的人有點不爽,會當作沒看到,不想回。

    我是認為你根本關鍵字就用錯了,找不到滿正常的。你應該用 Sniffer 作關鍵字。

    例如這是一個著名的原始碼網站,以此關鍵字搜尋到的結果。

    http://www.pscode.com/vb/scripts/BrowseCategoryOrSearchResults.asp?txtCriteria=Sniffer&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&lngWId=10&optSort=Alphabetical

    你可以抓 2006 年的那個範例:

    http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=4519&lngWId=10

    在我電腦上以 VB2005 執行結果:

    這個範例完全沒有呼叫任何外部函式庫,完全用 VB.NET 構成,注意,這個範例是 VB2003 的範例,在 VB2005 必須自己把原始碼改為委派,否則會因為控制項不是產生執行緒的控制項而無法顯示抓到封包的結果。

    圖上被遮罩的是我的電腦 IP 位置,左右兩邊都有,就表示上下傳都有,從圖上可以看到有抓到 MSN / HTTP 兩個協定。(因為我這邊虛擬網路有保護,沒啥多餘流量可看),封包內容則由跳出式視窗顯示,若你要顯示內容,建議你修改跳出視窗,用下拉式選單 5 種編碼選 1 解看看,ANSI、Big5、Unicode、UTF7、UTF8。

    2006年12月14日 下午 12:09
    版主
  • 感謝小朱大大和璉大的說明,沒注意看原來winpcap有釋出src code那就問題決解了,還有可否請問璉大,我也是用2005的,但vb.net我不熟,可否能直接告訴我要如何改範例裡的那些地方呢,謝謝各位大大們
    2006年12月15日 上午 02:45
  • 觀念可參考:http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1440.entry

    VB2005 需修改 frmMain.vb

    ' 新增

      Delegate Sub DelegatePacketListAdd(ByVal lstItem As ListViewItem)

      Public Sub PacketListAdd(ByVal lstItem As ListViewItem)
       PacketList.Items.Add(lstItem)
       StatusBar.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize)
      End Sub

      Private Sub OnNewPacket(ByVal m As Monitor, ByVal p As Packet)
       Dim iP As IPlugin

       For Each iP In Plugins
        If Not iP.OnPacketArrive(m.IP, p) Then Exit Sub
       Next

       Dim lstItem As ListViewItem = New ListViewItem
       m_Packets.Add(p)
       m_PacketsSize += p.TotalLength
       Try
        With lstItem
         .Text = p.Time.ToString
         .SubItems.Add(p.Protocol.ToString)
         .SubItems.Add(p.Source.ToString)
         .SubItems.Add(p.Destination.ToString)
         .SubItems.Add(p.TotalLength.ToString)
        End With
       Catch ex As Exception
        MsgBox(ex.Message)
       End Try

    ' 修改

       'PacketList.Items.Add(lstItem)
       'StatusBar.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", m_Packets.Count, m_PacketsSize)

       Me.BeginInvoke(New DelegatePacketListAdd(AddressOf PacketListAdd), New Object() {lstItem})

      End Sub

    2006年12月15日 上午 09:04
    版主
  • 超感謝璉大的解說,但我剛剛試過著把1個大小約400k的檔案,直接傳到yahoo的信箱裡,但該程式郤只能顯示n個40btye(剛好為ip頭和tcp頭的大小),算句話說這個程式和我之前寫的改成rcvall的一樣,無法真正的攔下所有封包,不知道是不是我作業系統的問題?還是說這程式不能Capture到封包的問題,可否請大大們幫我試試看,謝謝

    ps:作業系統是xp  sp2

     

    2006年12月15日 上午 10:53
  • 我目前沒有可上傳的 ftp 位置,拿個可下載的試,抓得到上傳列示目錄及回傳的目錄內容。

    網頁也可以正常抓到上下傳,以瀏覽這篇為例,上傳:

    下傳:

    2006年12月15日 下午 02:18
    版主
  • 我試過用ftp傳東西,但發現還是沒有上傳攔截,僅有下載攔截而已

    ,http的也是這樣,可以說都沒看到上傳的攔截,

    想說不知道是不是因為我是用軟體播接的(netvoyager)

    但是下傳看的到上傳郤沒攔到這個......不知道有沒有大大和我有一樣的情形?謝謝璉大的回應

    ps:我是用adsl非固定ip的,不過我想那應該沒關係才對

    2006年12月16日 上午 03:18
  • 璉大您好,

    這個範例我有抓下來使用,但是在frmPacket.vb的這個檔案中一直無法將16進位的碼順利編碼

    我試過的幾個方法有

                Dim aa As String = System.Text.Encoding.UTF8.GetString(m_Packet.GetBytes())
                Dim bb As String = System.Text.Encoding.Unicode.GetString(m_Packet.GetBytes())
                Dim cc As String = System.Text.Encoding.ASCII.GetString(m_Packet.GetBytes())
                Dim dd As String = System.Text.Encoding.Default.GetString(m_Packet.GetBytes())
                Dim ee As String = System.Text.Encoding.GetEncoding(950).GetString(m_Packet.GetBytes())

    但是抓出來的都不是像上圖所示的編碼

    可否請大大指點一下,謝謝。

    2007年2月7日 上午 02:59
  • 如果有漏在說,我不太確定有沒有漏。加個下拉式選單:

    Private Sub cboEncoding_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboEncoding.SelectedIndexChanged

         If Not IsNothing(m_Packet) Then

              Select Case sender.Text

                   Case "Hex"

                        RawText.Text = m_Packet.ToString()

                   Case Else

                        Dim strDecode As System.Text.Encoding

                        Select Case sender.Text

                             Case "ASCII"

                                  strDecode = System.Text.Encoding.ASCII

                             Case "Default"

                                  strDecode = System.Text.Encoding.Default

                             Case "Unicode"

                                  strDecode = System.Text.Encoding.Unicode

                             Case Else

                                  strDecode = System.Text.Encoding.GetEncoding(sender.Text)

                        End Select

                        Dim rowBytes() As Byte = m_Packet.GetBytes()

                        Dim offsetLoc As Integer

                        Select Case m_Packet.Protocol

                             Case Protocol.Tcp

                                  offsetLoc = (rowBytes(20 + 13 - 1) \ 16) * 4 + 20

                             Case Protocol.Udp

                                  offsetLoc = 8 + 20

                        End Select

                        Dim nLen As Integer = m_Packet.TotalLength - offsetLoc

                        If nLen > 0 Then

                             Dim arrBytes(nLen - 1) As Byte

                             Array.Copy(rowBytes, offsetLoc, arrBytes, 0, nLen)

                             RawText.Text = strDecode.GetString(arrBytes)

                        Else

                             RawText.Text = "(無資料)"

                        End If

              End Select

         End If

    End Sub

    2007年2月7日 上午 03:12
    版主
  • 原來如此,難怪我解碼都只解出一個E字。

    謝謝!  璉大的協助。

    2007年2月7日 上午 05:02
  • 璉大、艾大
    是否能提示一下,最後解答是如何呢?
    此範例我已依照範例修改
    不過如上述幾個問題發生的一樣
    使用各程encoding以及950,還是無法解析出這篇討論的內容
    另,也是只有擷取到下載,沒有看見任何上傳的封包

    還另有地方需要再次修改的嗎?

    感激...

    2009年7月13日 下午 04:21
  • 你可以先看 Tcp 的封包大小,一般來說,60 bytes 以下的通常沒內容。
    另外,你可以先選擇是使用文字模式傳輸的協定,非文字模式傳輸的協定,解碼是沒意義的。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月14日 上午 05:05
  • 謝謝心冷的回應
    在別的網頁內,有取到內容過

    但在抓取這篇的上傳及下載,根據璉大的截圖
    是可以解析的

    可是不論在哪裡抓取,一律都只有上傳

    另外,協定要如何判別呢?
    2009年7月15日 下午 12:06
  • 詳讀 RFC 文件。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月15日 下午 12:37