SharpPcap - получение информации из пакета

Я пытаюсь получить информацию из пакетов, таких как запросы GET/POST, используя SharpPcap и PacketDotNet. Я посмотрел другую информацию здесь на stackru, но у меня есть проблемы с кодированием. Информация из пакетов не отображается должным образом в каждой принятой системе кодирования.

Мой код ниже:

using System.Text;
using System.Threading;
using PacketDotNet;
using SharpPcap;
using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ver = SharpPcap.Version.VersionString;
            Console.WriteLine("SharpPcap {0}", ver);

            // Retrieve the device list
            CaptureDeviceList devices = CaptureDeviceList.Instance;

            ICaptureDevice myDevice = devices[3];
            myDevice.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
            myDevice.Open(DeviceMode.Promiscuous, 1000);
            //Console.WriteLine("trst = {0}", myDevice.MacAddress);
            //myDevice.Filter = "tcp and dst host 10.11.16.80";


            Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
                          myDevice.Description);
            myDevice.StartCapture();
            Console.ReadLine();
            myDevice.StopCapture();
            myDevice.Close();

        }

        private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
        {
        // парсинг всего пакета
            Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
        // получение только TCP пакета из всего фрейма
            var tcpPacket = TcpPacket.GetEncapsulated(packet);
        // получение только IP пакета из всего фрейма
            var ipPacket = IpPacket.GetEncapsulated(packet);
            if (tcpPacket != null && ipPacket != null)
            {
                DateTime time = e.Packet.Timeval.Date;
                int len = e.Packet.Data.Length;

            // IP адрес отправителя
                var srcIp = ipPacket.SourceAddress.ToString();
            // IP адрес получателя
                var dstIp = ipPacket.DestinationAddress.ToString();

            // порт отправителя
                var srcPort = tcpPacket.SourcePort.ToString();
            // порт получателя
                var dstPort = tcpPacket.DestinationPort.ToString();
            // данные пакета
                var hex = BitConverter.ToString(tcpPacket.PayloadData);

                hex = hex.Replace("-", "");
                byte[] raw = new byte[hex.Length / 2];
                for (int i = 0; i < raw.Length; i++)
                {
                    raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
                }

                string data = Encoding.ASCII.GetString(raw);

                Console.WriteLine("{0}:{1}:{2}",srcPort,dstPort, data);
                Thread.Sleep(1000);
            }
        }
    }
}

Результат показан на скриншоте: Скриншот

0 ответов

Другие вопросы по тегам