Не удается преобразовать из SharpPcap.RawCapture для PacketDotNet.Пакет

я следовал за гидом в http://www.codeproject.com/KB/IP/sharppcap.aspx для реализации простого сниффера пакетов для автоматизации аутентификации для меня мне удалось добраться до раздела фильтрации, и мне пришлось внести некоторые коррективы в код учебника до сих пор, чтобы он работал, но теперь я в тупике.

ошибка, которую я получаю;

лучшие перегруженный метод матч для 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Пакет)' имеет некоторые недопустимые аргументы

Аргумент 1: не удается конвертировать из 'SharpPcap.RawCapture в PacketDotNet.Пакет'

но я еще не сделал каких-либо ссылок на PacketDotNet себя (все до сих пор было SharpPcap).

весь код у меня до сих пор включен, проблема в 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);
         }
     }
 }

3 ответов


В SharpPcap.RawPacket используется для хранения необработанных данных, захваченных через сетевой адаптер, но PacketDotNet нуждается в анализе пакета, прежде чем методы GetEncapsulated() будут работать. Шаге вам нужно будет выглядеть так:

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

затем вы можете извлечь инкапсулированный TcpPacket через GetEncapsulated() метод, передав его packet.

пример 12 в исходнике SharpPcap скачать вhttps://sourceforge.net/projects/sharppcap/ показывает синтаксис и как пакеты может быть изменен.

имейте в виду, что PacketType.GetEncapsulated() возвращает ссылку на эту часть пакета, поэтому ее изменение изменит исходный пакет.


кроме того, вы можете использовать Pcap.Net, который имеет только один класс пакета, который вы можете динамически анализировать, чтобы получить все, что он может содержать, не делая никакого приведения пакета.

вы просто получаете объект пакета и делаете (например):

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

нет необходимости бросать его или знать, какой пакет это заранее, весь разбор выполняется динамически.


в качестве обновления к ответу Криса Моргана (потому что я обнаружил, что делаю это сегодня),getEncapsulated() теперь устарел, вместо этого вы должны использовать packet.Extract() для извлечения инкапсулированных пакетов.