Pregunta

He estado siguiendo la guía en http://www.codeproject.com/KB/IP/sharppcap.aspx para implementar un simple rastreador de paquetes para automatizar las autenticaciones para mí, logré llegar a la sección de Filtrado y tuve que hacer algunos ajustes en el código del tutorial hasta ahora.a trabajar, pero ahora estoy perplejo.

El error que recibo es;

La mejor coincidencia de 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 PacketDotNet (todo hasta ahora ha sido SharpPcap).

Se incluye todo el código que tengo hasta ahora, 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);
         }
     }
 }
¿Fue útil?

Solución

Se utiliza un SharpPcap.RawPacket para almacenar los datos sin procesar capturados a través del adaptador de red, pero PacketDotNet necesita que el paquete sea analizado antes de que funcionen los métodos GetEncapsulated ().El paso que necesita se verá así:

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

Luego puede extraer el TcpPacket encapsulado a través del método GetEncapsulated() pasándolo packet.

Ejemplo 12 en la descarga de fuentes de SharpPcap en https://sourceforge.net/projects/sharppcap/ muestra la sintaxis y cómo se pueden modificar los paquetes.

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

Otros consejos

Alternativamente, puede usar Pcap.Net , que solo tiene una clase de paquete que puede analizar dinámicamente para obtener lo que seapuede contener sin hacer ningún envío de paquetes.

Solo obtiene un objeto Packet y hace (por ejemplo):

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

No es necesario enviarlo o saber qué tipo de paquete es de antemano, todo el análisis se realiza de forma dinámica.

Como actualización de la respuesta de Chris Morgan (porque me encuentro haciendo esto hoy), getEncapsulated() ahora está obsoleto, en su lugar debería usar packet.Extract() para extraer el paquete encapsulado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top