none
Sniffer

    Frage

  • Liebe Forumsbesucher,

    ich habe einen funktionierenden Sniffer, welcher alle ein- und ausgehenden Packete eines Endpunktes liest und der so gestartet wird:

        Private m_Socket As Socket         ' Ein Socket zum Sniffen.
    
        ''' <summary>
        ''' Mit dem Schnüffeln beginnen.
        ''' </summary>
        Public Sub StartSniff()
    
          Try
    
            m_Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)   ' Einen neuen Socket zum Abhören erstellen.
            m_Socket.Bind(New IPEndPoint(IPAddress.Parse(m_IPv4Adr), 0))              ' Den Socket an die lokale IPv4-Adresse binden.
            m_Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, True)  ' Die Optionen des Sockets festlegen.
            m_Socket.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(3), Nothing)     ' Betriebsmodi für den Socket festlegen.
    
            ' Ein Packet asynchron lesen.
            m_Socket.BeginReceive(m_PacketBuffer, 0, m_PacketBuffer.Length, SocketFlags.None, New AsyncCallback(AddressOf OnReceive), Nothing)
    
          Catch ex As Exception
            StopSniff()
          End Try
    
        End Sub
    

    In einer weiteren Methode lese ich die Daten aus dem Header.

    Meine Frage: Wie kann ich zwischen ein- und ausgehenden Packeten unterscheiden? Oder anders gefragt: Wie muss ich den Socket konfigurieren, um nur ein- oder nur ausgehende Packete "abzuhören"? Ich denke, es müßte an dieser Zeile etwas geändert werden:

    m_Socket.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(3), Nothing) 
    

    Um es zu verdeutlichen, das Problem tritt dann auf, wenn die IP-Adressen und Ports lokal und remote spiegelverkehrt vorhanden sind. Beispiel:

    Anwendung   local IP       local Port       remote IP       remote Port

    firefox          127.0.0.1    50808            127.0.0.1        50809

    firefox          127.0.0.1    50809            127.0.0.1        50808

     

    In den Packeten ist nur die Information enthalten, welcher Adresse die Quelle und welche das Ziel ist. Im oben genannten Beispiel ist aus diesen Informationen alleine die Richtung nicht feststellbar.

    Für eure Antworten bin ich sehr dankbar.

    VG Stefan

    Dienstag, 30. November 2010 22:25

Antworten

  • Hallo Stefan

    dieses Thema ist weitgehend ausserhalb der Zuständigkeit von .NET (da nur ein Wrapper um Win32-Winsock), hier die Grundlagen:

    IOControlCode.ReceiveAll entspricht Win32:
    SIO_RCVALL Control Code
    http://msdn.microsoft.com/en-us/library/ee309610(VS.85).aspx

    und die dort auch erwähnten Optionen [dein GetBytes(3)] kommt aus dem Win32-SDK MSTcpIP.h:
        RCVALL_OFF                      = 0
        RCVALL_ON                         = 1
        RCVALL_SOCKETLEVELONLY  = 2
        RCVALL_IPLEVEL                   = 3


    TCP/IP Raw Sockets
    http://msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx

    Promiscuous mode
    http://en.wikipedia.org/wiki/Promiscuous_mode

    Die Information ob ein- oder ausgehendes Paket kann man mit deiner Lösung AFAIK nicht explizit feststellen,
    insbesondere wenn über Loopback/127.0.0.1
    'Richtige' Sniffer verwenden daher zT eigene Treiber (SYS).

    • Als Antwort markiert maustiger30 Mittwoch, 1. Dezember 2010 20:16
    Dienstag, 30. November 2010 23:04