Frage

Ich habe den Leitfaden unter http://www.codeproject.com befolgt/KB/IP/sharppcap.aspx für die Implementierung eines einfachen Paket-Sniffers zur Automatisierung der Authentifizierung für mich habe ich es geschafft, zum Abschnitt Filterung zu gelangen, und musste bisher einige Anpassungen am Tutorial-Code vornehmenzu arbeiten, aber ich bin jetzt ratlos.

Der Fehler, den ich erhalte, ist:

Die beste überladene Methodenübereinstimmung für 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet)' enthält einige ungültige Argumente

Argument 1: Konvertierung von 'SharpPcap.RawCapture' in 'PacketDotNet.Packet' nicht möglich

Aber ich muss noch selbst auf PacketDotNet verweisen (alles war bisher SharpPcap).

Der gesamte Code, den ich bisher habe, ist enthalten. Das Problem liegt in der Funktion device_OnPacketArrival ().

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using PacketDotNet;
 using SharpPcap;

 namespace ConsoleApplication1
 {
     class Program
     {
         static void Main(string[] args)
         {
             string ver = SharpPcap.Version.VersionString;
             Console.WriteLine("SharpPcap {0}, Example1.IfList.cs", ver);

             // Retrieve the device list
             CaptureDeviceList devices = CaptureDeviceList.Instance;

             // If no devices were found print an error
             if (devices.Count < 1)
             {
                 Console.WriteLine("No devices were found on this machine");
                 return;
             }

             // Extract a device from the list
             ICaptureDevice device = devices[0];

             // Register our handler function to the
             // 'packet arrival' event
             device.OnPacketArrival +=
                 new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);

             // Open the device for capturing
             int readTimeoutMilliseconds = 1000;
             device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

             // tcpdump filter to capture only TCP/IP packets
             string filter = "ip and tcp";
             device.Filter = filter;

             Console.WriteLine();
             Console.WriteLine("-- The following tcpdump filter will be applied: \"{0}\"",
                 filter);
             Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
                 device.Description);

             // Start capturing packets indefinitely
             device.Capture();

             // Close the pcap device
             // (Note: this line will never be called since
             // we're capturing indefinitely
             device.Close();
         }
         private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
         {
             var tcp = TcpPacket.GetEncapsulated(e.Packet);
         }
     }
 }

War es hilfreich?

Lösung

Ein SharpPcap.RawPacket wird verwendet, um die über den Netzwerkadapter erfassten Rohdaten zu speichern. PacketDotNet benötigt jedoch das analysierte Paket, bevor die GetEncapsulated () -Methoden funktionieren.Der Schritt, den Sie benötigen, sieht folgendermaßen aus:

var packet = PacketDotNet.Packet.ParsePacket(rawPacket.LinkLayerType, rawPacket.Data);

Anschließend können Sie den gekapselten TcpPacket über die GetEncapsulated()-Methode extrahieren, indem Sie ihn packet übergeben.

Beispiel 12 im SharpPcap-Quellendownload unter https://sourceforge.net/projects/sharppcap/ zeigt die Syntax und wie Pakete geändert werden können.

Beachten Sie, dass PacketType.GetEncapsulated() einen Verweis auf diesen Teil des Pakets zurückgibt, sodass durch Ändern des ursprünglichen Pakets das ursprüngliche Paket geändert wird.

Andere Tipps

Alternativ können Sie Pcap.Net verwenden, das nur eine Paketklasse enthält, die Sie dynamisch analysieren können, um alles zu erhaltenkann enthalten, ohne eine Paketumwandlung durchzuführen.

Sie erhalten nur ein Paketobjekt und führen (zum Beispiel) Folgendes aus:

uint sequenceNumber = packet.Ethernet.IpV4.Tcp.SequenceNumber;

Sie müssen es nicht umwandeln oder wissen, um welche Art von Paket es sich im Voraus handelt. Alle Analysen werden dynamisch durchgeführt.

Als Update zu Chris Morgans Antwort (weil ich dies heute tue) ist getEncapsulated() jetzt veraltet. Stattdessen sollten Sie packet.Extract() verwenden, um das gekapselte Paket zu extrahieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top