Impossibile convertire da SharpPcap.RawCapture a PacketDotNet.Packet
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);
}
}
}
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.