6 Stimmen

Konvertierung von SharpPcap.RawCapture nach PacketDotNet.Packet nicht möglich

Ich habe den Leitfaden auf der Seite http://www.codeproject.com/KB/IP/sharppcap.aspx für die Implementierung eines einfachen Paket-Sniffers, um Authentifizierungen für mich zu automatisieren, habe ich es geschafft, zum Abschnitt Filtering zu gelangen, und musste bisher einige Anpassungen am Code des Tutorials vornehmen, damit es funktioniert, aber jetzt bin ich ratlos.

Der Fehler, den ich erhalte, lautet;

Die beste überladene Methode für 'PacketDotNet.TcpPacket.GetEncapsulated(PacketDotNet.Packet)' hat einige ungültige Argumente

Argument 1: kann nicht von 'SharpPcap.RawCapture' nach 'PacketDotNet.Packet' konvertieren

Aber ich selbst habe noch keine Verweise auf PacketDotNet gemacht (bisher war alles 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);
         }
     }
 }

6voto

Chris Morgan Punkte 1155

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

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

Dann können Sie die gekapselte TcpPacket über die GetEncapsulated() Methode durch Übergabe von packet .

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

Bitte beachten Sie, dass PacketType.GetEncapsulated() gibt einen Verweis auf diesen Teil des Pakets zurück, so dass eine Änderung des Pakets das ursprüngliche Paket verändert.

1voto

Hyperfine Punkte 91

Als Update zu Chris Morgans Antwort (weil ich mich heute dabei ertappe), getEncapsulated() ist jetzt veraltet, stattdessen sollten Sie packet.Extract() um das eingekapselte Paket zu extrahieren.

0voto

brickner Punkte 6447

Alternativ können Sie auch Pcap.Net die nur eine Paketklasse hat, die Sie dynamisch parsen können, um alles zu erhalten, was sie enthalten kann, ohne einen Paket-Cast durchzuführen.

Man holt sich einfach ein Packet-Objekt und macht (zum Beispiel):

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

Es ist nicht notwendig, das Paket im Voraus zu analysieren oder zu wissen, um welche Art von Paket es sich handelt, da das Parsing dynamisch erfolgt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X