SharpPcap - проблема с захватом пакетов - PullRequest
0 голосов
/ 24 марта 2010

Я пытаюсь перехватить пакеты, используя библиотеку SharpPcap. Я могу вернуть информацию о пакетах, но у меня проблема с получением содержимого сообщения внутри пакета.

пакет, использующий .Data для возврата сообщения, и когда я его использую, он возвращается (System.Byte []).

вот сайт библиотеки: http://www.codeproject.com/KB/IP/sharppcap.aspx

вот мой код:

string packetData;
        private void packetCapturingThreadMethod()
            {

            Packet packet = null;
           int countOfPacketCaptures = 0;

            while ((packet = device.GetNextPacket()) != null)
                {

                packet = device.GetNextPacket();
                if (packet is TCPPacket)
                    {
                    TCPPacket tcp = (TCPPacket)packet;
                    myPacket tempPacket = new myPacket();

                    tempPacket.packetType = "TCP";
                    tempPacket.sourceAddress = Convert.ToString(tcp.SourceAddress);
                    tempPacket.destinationAddress = Convert.ToString(tcp.DestinationAddress);
                    tempPacket.sourcePort = Convert.ToString(tcp.SourcePort);
                    tempPacket.destinationPort = Convert.ToString(tcp.DestinationPort);
                    tempPacket.packetMessage = Convert.ToString(tcp.Data);
                    packetsList.Add(tempPacket);

                     packetData = 
                        "Type= TCP" +
                        "   Source Address = "+  Convert.ToString(tcp.SourceAddress)+
                       "   Destination Address =" +Convert.ToString(tcp.DestinationAddress)+
                       "   SourcePort =" +    Convert.ToString(tcp.SourcePort)+
                       "   SourcePort =" +Convert.ToString(tcp.DestinationPort)+
                       "   Messeage =" + Convert.ToString(tcp.Data);
                    txtpackets.Invoke(new UpdatetxtpacketsCallback(this.Updatetxtpackets),
            new object[] { packetData });


                    string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage };
                    try { //dgwPacketInfo.Rows.Add(row); countOfPacketCaptures++;
                    //lblCapturesLabels.Text = Convert.ToString(countOfPacketCaptures);
                    }
                    catch (Exception e) { }

                    }
                else if (packet is UDPPacket)
                    {

                    UDPPacket udp = (UDPPacket)packet;


                    myPacket tempPacket = new myPacket();

                    tempPacket.packetType = "UDP";
                    tempPacket.sourceAddress = Convert.ToString(udp.SourceAddress);
                    tempPacket.destinationAddress = Convert.ToString(udp.DestinationAddress);
                    tempPacket.sourcePort = Convert.ToString(udp.SourcePort);
                    tempPacket.destinationPort = Convert.ToString(udp.DestinationPort);
                    tempPacket.packetMessage = udp.Data.ToArray() + "\n";
                    packetsList.Add(tempPacket);

                    packetData = 
                        "Type= UDP" +
                        "   Source Address = "+  Convert.ToString(udp.SourceAddress)+
                       "   Destination Address =" +Convert.ToString(udp.DestinationAddress)+
                       "   SourcePort =" +    Convert.ToString(udp.SourcePort)+
                       "   SourcePort =" +Convert.ToString(udp.DestinationPort)+
                       "   Messeage =" + udp.Data.ToArray() + "\n";
                    string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage };
                    try {
                        //dgwPacketInfo.Rows.Add(row);
                    //countOfPacketCaptures++;
                    //lblCapturesLabels.Text = Convert.ToString(countOfPacketCaptures);
                        txtpackets.Invoke(new UpdatetxtpacketsCallback(this.Updatetxtpackets),
               new object[] { packetData });

                    }
                    catch (Exception e) { }


                    }


                }
            }

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Я нашел ответ ...

Данные - это байтовый массив, поэтому мне нужно использовать битовый преобразователь, а не использовать:

Convert.ToString(tcp.Data);

Я должен использовать:

BitConverter.ToString(tcp.Data)
0 голосов
/ 10 ноября 2010

Парсер не так уж сложен ...

Я посмотрел код Packet.Net (который является синтаксическим анализом для SharpPcap), и все поля хранятся в широко используемых форматах.

IP-адреса хранятся в формате System.Net.IPAddress, так что вы можете просто вызвать .ToString для них, чтобы получить текстовую строку, которая правильно включает в себя точки.

Номера портов хранятся в формате ushort, которые могут быть напечатаны так же, как и любое другое целое число.

Единственная часть, которую необходимо интерпретировать в двоичной форме, - это поле данных, поскольку оно изменяется в зависимости от того, какой протокол используется на следующем уровне. SharpPcap / Packet.Net уже выполняет большую часть работы за вас, и поля хранятся в наиболее удобных или идентичных формах, которые указаны в спецификации протокола. Просто используйте intellisense, чтобы проверить тип поля, и если он не знаком с вами (например, System.Net.IPAddress или System.NetworkInformation.PhysicalAddress (для MAC-адресов)), просто введите его в Google.

...