2011-09-11 20 views
6

He estado siguiendo la guía en http://www.codeproject.com/KB/IP/sharppcap.aspx para implementar un simple sniffer de paquetes para automatizar las autenticaciones, he logrado acceder a la sección de Filtrado y he tenido que hacer algunos ajustes al código del tutorial hasta ahora para que funcione, pero ahora estoy perplejo.No se puede convertir de SharpPcap.RawCapture a PacketDotNet.Packet

El error que estoy recibiendo es;

El partido mejor método sobrecargado para 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet)' tiene algunos argumentos no válidos

Argumento 1: no se puede convertir de 'SharpPcap.RawCapture' a 'PacketDotNet.Packet'

Pero todavía no he hecho ninguna referencia a mi propio PacketDotNet (todo hasta ahora ha sido SharpPcap).

Todo el código que tengo hasta ahora se incluye, el problema está en la función 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); 
     } 
    } 
} 

Respuesta

6

A SharpPcap.RawPacket se utiliza para mantener los datos en bruto capturados sobre el adaptador de red pero PacketDotNet necesita el paquete analizado antes de que los métodos GetEncapsulated() va a funcionar. El paso que debe se verá así:

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

A continuación, se puede extraer el TcpPacket encapsulado mediante el método GetEncapsulated() pasándolo packet.

Ejemplo 12 en la descarga fuente SharpPcap en https://sourceforge.net/projects/sharppcap/ muestra la sintaxis y cómo los paquetes puede ser modificado.

Tenga en cuenta que PacketType.GetEncapsulated() está devolviendo una referencia a esa parte del paquete por lo que modificarlo alterará el paquete original.

+0

Parece que no tengo la clase .Packet.Parse, la más cercana a Parse es TcpPacket.ParsePacket(), pero no estoy seguro de dónde sacaste LinkLayer (¿cuál es la referencia de rawPacket en esta situación? , yo esperaría que sea e.Packet pero no estoy 100% seguro) – Clorith

+0

actualizado mi respuesta con el nombre del método correcto. –

+0

haciendo referencia al ejemplo 12 ahora, y solo tienen 1 argumento, pero sigo recibiendo un error; "Sin sobrecarga para el método 'ParsePacket' toma 1 argumento", todo esto es muy confuso en este momento. – Clorith

0

O bien, puede usar Pcap.Net, que solo tiene una clase de paquete que puede analizar dinámicamente para obtener todo lo que pueda contener sin hacer ningún lanzamiento de paquete.

Usted acaba de obtener un objeto de paquete y hacer (por ejemplo):

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

No hay necesidad de echarlo o saber qué tipo de paquete es por adelantado, todo el análisis se realiza de forma dinámica.

0

como una actualización de la respuesta de Chris Morgan (porque me encuentro haciendo esto hoy en día), getEncapsulated() es ahora obsoleto, en su lugar debe usar packet.Extract() para extraer el paquete encapsulado.

Cuestiones relacionadas