Não é possível converter de SharpPcap.RawCapture para PacketDotNet.Packet
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);
}
}
}
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.