Не удается преобразовать из SharpPcap.RawCapture в PacketDotNet.Packet - PullRequest
6 голосов
/ 11 сентября 2011

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

Я получаю ошибку:

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

Аргумент 1: невозможно преобразовать из 'SharpPcap.RawCapture' в 'PacketDotNet.Packet'

Но я еще ни разу не упомянул 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 ]

6 голосов
/ 11 сентября 2011

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() возвращает ссылку на эту часть пакета, поэтому изменение его приведет к изменению исходного пакета.

0 голосов
/ 10 марта 2016

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

0 голосов
/ 08 октября 2011

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

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

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

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

...