SharpPcap - 从数据包

时间:2016-01-27 05:21:15

标签: c# hex packet-sniffers sharppcap packetdotnet

我试图从数据包中获取信息,例如使用SharpPcap和PacketDotNet的GET / POST请求。我在stackoverflow上看了不同的信息,但我有编码问题。来自数据包的信息在每个采用的编码系统中都没有正确显示。

我的代码如下:

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);
            }
        }
    }
}

结果显示在屏幕截图中:Screenshot

0 个答案:

没有答案