Pergunta

Tenho seguido o guia em http://www.codeproject.com/KB/IP/sharppcap.aspx por implementar um sniffer de pacote simples para automatizar as autenticações para mim, consegui chegar à seção Filtragem e tive que fazer alguns ajustes no código do tutorial até agora para issopara trabalhar, mas agora estou perplexo.

O erro que estou recebendo é;

A melhor correspondência de método sobrecarregado para 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet)' tem alguns argumentos inválidos

Argumento 1: não é possível converter de 'SharpPcap.RawCapture' para 'PacketDotNet.Packet'

Mas eu ainda não fiz nenhuma referência ao PacketDotNet (tudo até agora foi SharpPcap).

Todo o código que tenho até agora está incluído, o problema está na função 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);
         }
     }
 }
Foi útil?

Solução

Um SharpPcap.RawPacket é usado para manter os dados brutos capturados pelo adaptador de rede, mas o PacketDotNet precisa que o pacote seja analisado antes que os métodos GetEncapsulated () funcionem.A etapa de que você precisa será semelhante a:

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

Em seguida, você pode extrair o TcpPacket encapsulado por meio do método GetEncapsulated(), passando-o packet.

Exemplo 12 no download da fonte SharpPcap em https://sourceforge.net/projects/sharppcap/ mostra a sintaxe e como os pacotes podem ser modificados.

Lembre-se de que PacketType.GetEncapsulated() está retornando uma referência a essa parte do pacote, portanto, modificá-lo alterará o pacote original.

Outras dicas

Alternativamente, você pode usar Pcap.Net , que tem apenas uma classe de pacote que você pode analisar dinamicamente para obter qualquer coisapode conter sem fazer qualquer elenco de pacote.

Você apenas pega um objeto Pacote e faz (por exemplo):

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

Não há necessidade de lançá-lo ou saber que tipo de pacote é com antecedência, toda a análise é feita dinamicamente.

Como uma atualização para a resposta de Chris Morgan (porque me vejo fazendo isso hoje), getEncapsulated() agora está obsoleto. Em vez disso, você deve usar packet.Extract() para extrair o pacote encapsulado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top