2011-09-11 17 views
6

Ho seguito la guida su http://www.codeproject.com/KB/IP/sharppcap.aspx per implementare un semplice sniffer di pacchetti per automatizzare le autenticazioni per me, sono riuscito ad accedere alla sezione Filtro e ho dovuto apportare alcune modifiche al codice tutorial finora per farlo funzionare, ma ora sono perplesso.Impossibile convertire da SharpPcap.RawCapture a PacketDotNet.Packet

L'errore che sto ricevendo è;

La partita metodo migliore overload per 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet)' ha alcuni argomenti non validi

Argomento 1: non può convertire da 'SharpPcap.RawCapture' a 'PacketDotNet.Packet'

Ma devo ancora fare riferimenti a PacketDotNet (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); 
     } 
    } 
} 

risposta

6

Uno SharpPcap.RawPacket viene utilizzato per contenere i dati grezzi acquisiti sulla scheda di rete, ma necessita PacketDotNet pacchetto analizzato prima metodi GetEncapsulated() funzionerà. Il passo è necessario sarà simile:

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

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

L'esempio 12 nel download della sorgente SharpPcap in https://sourceforge.net/projects/sharppcap/ mostra la sintassi e la modalità di modifica dei pacchetti.

Ricordare che PacketType.GetEncapsulated() restituisce un riferimento a quella parte del pacchetto in modo che la modifica altera il pacchetto originale.

+0

Sembra che non abbia la classe .Packet.Parse, il più vicino a Parse è TcpPacket.ParsePacket(), ma sono un po 'insicuro da dove hai ottenuto LinkLayer (qual è il riferimento rawPacket in questa situazione , Mi aspetto che sia e.Packet ma non sono sicuro al 100%) – Clorith

+0

Ho aggiornato la mia risposta con il nome del metodo corretto. –

+0

Fare riferimento all'esempio 12 ora e hanno solo 1 argomento, ma sto ancora ricevendo un errore; "Nessun sovraccarico per il metodo 'ParsePacket' richiede 1 argomento", questo è tutto molto confuso al momento. – Clorith

0

In alternativa, è possibile utilizzare Pcap.Net, che ha solo una classe Packet che è possibile analizzare in modo dinamico per ottenere tutto ciò che può contenere senza eseguire alcuna trasmissione di pacchetti.

Devi solo avere un oggetto pacchetto e fare (per esempio):

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

Non c'è bisogno di lanciare o sapere che tipo di pacchetto è in anticipo, tutte le analisi è fatto in modo dinamico.

0

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

Problemi correlati