Domanda

Ho seguito la guida su http://www.codeproject.com/KB/IP/sharppcap.aspx per l'implementazione di un semplice sniffer di pacchetti per automatizzare le autenticazioni per me, sono riuscito ad arrivare alla sezione Filtraggio e finora ho dovuto apportare alcune modifiche al codice del tutorial per questoper lavorare, ma ora sono perplesso.

L'errore che ricevo è;

La migliore corrispondenza del metodo sovraccarico per "PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet)" ha alcuni argomenti non validi

Argomento 1: impossibile convertire da "SharpPcap.RawCapture" a "PacketDotNet.Packet"

Ma devo ancora fare riferimento a PacketDotNet da solo (tutto finora è stato SharpPcap).

L'intero codice che ho finora è incluso, il problema è nella funzione 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);
         }
     }
 }
È stato utile?

Soluzione

Un SharpPcap.RawPacket viene utilizzato per contenere i dati grezzi acquisiti tramite l'adattatore di rete, ma PacketDotNet necessita dell'analisi del pacchetto prima che i metodi GetEncapsulated () funzionino.Il passaggio di cui hai bisogno sarà simile a:

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

Quindi puoi estrarre il TcpPacket incapsulato tramite il metodo GetEncapsulated() passandolo packet.

Esempio 12 nel download del codice sorgente di SharpPcap all'indirizzo https://sourceforge.net/projects/sharppcap/ mostra la sintassi e come possono essere modificati i pacchetti.

Tieni presente che PacketType.GetEncapsulated() restituisce un riferimento a quella parte del pacchetto, quindi modificarlo altererà il pacchetto originale.

Altri suggerimenti

In alternativa, puoi utilizzare Pcap.Net , che ha solo una classe Packet che puoi analizzare dinamicamente per ottenere qualunque cosapuò contenere senza eseguire alcun cast di pacchetti.

Ottieni solo un oggetto Packet e fai (ad esempio):

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

Non è necessario trasmetterlo o sapere che tipo di pacchetto è in anticipo, tutta l'analisi viene eseguita dinamicamente.

Come aggiornamento alla risposta di Chris Morgan (perché mi ritrovo a farlo oggi), getEncapsulated() è ora obsoleto, invece dovresti usare packet.Extract() per estrarre il pacchetto incapsulato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top