Question

J'essaie de capturer des paquets à l'aide de la bibliothèque SharpPcap. Je suis en mesure de retourner les détails des paquets, mais je vais avoir problème pour obtenir ce que le contenu du message à l'intérieur du paquet.

le paquet à l'aide .Data pour renvoyer le message et quand je l'utilise, il revient (System.Byte []).

ici est le site de la bibliothèque: http://www.codeproject.com/KB/IP/sharppcap.aspx

voici mon code:

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


                    }


                }
            }
Était-ce utile?

La solution

J'ai trouvé la réponse ...

données est un tableau d'octets, alors je dois utiliser le convertisseur de bits et au lieu d'utiliser:

Convert.ToString(tcp.Data);

Je devrais utiliser:

BitConverter.ToString(tcp.Data)

Autres conseils

L'analyseur est pas complexe ...

Je regardais le code Packet.Net (qui est l'analyse syntaxique pour SharpPcap) et tous les champs sont stockés dans des formats couramment utilisés.

Les adresses IP sont stockées au format System.Net.IPAddress de sorte que vous pouvez simplement appeler .ToString sur eux pour obtenir une chaîne de texte qui comprend correctement les marques de points.

Les numéros de port sont stockés en tant ushort qui peut être imprimé de la même façon que tout autre nombre entier.

La seule partie qui doit être interprété dans sa forme binaire est le champ de données parce que les changements basés sur ce protocole est utilisé sur la couche suivante vers le haut. SharpPcap / Packet.Net fait la plupart du travail que vous avez déjà et les champs sont stockés dans les formes les plus commodes ou identiques à ceux qu'on trouve dans la spécification du protocole. Il suffit d'utiliser IntelliSense pour vérifier le type de champ et si ce n'est pas celui que vous êtes familier avec (tels que System.Net.IPAddress ou System.NetworkInformation.PhysicalAddress (pour les adresses MAC)) il suffit de Google.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top