2010-03-24 6 views
0

J'essaie de capturer des paquets en utilisant la bibliothèque SharpPcap. Je suis en mesure de retourner les détails des paquets mais j'ai un problème pour obtenir ce que le contenu du message à l'intérieur du paquet.SharpPcap - Une capture de paquets avec un problème de messesge

le paquet en utilisant .Data pour retourner le message et quand je l'utilise, il renvoie (System.Byte []).

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


        } 


       } 
      } 

Répondre

2

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

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

Convert.ToString(tcp.Data); 

Je devrais utilisation:

BitConverter.ToString(tcp.Data) 
0

L'analyseur est pas complexe ...

J'ai regardé le code Packet.Net (qui est l'analyse syntaxique pour SharpPcap) et tous les champs sont stockés dans couramment formats utilisés. Les adresses IP sont stockées au format System.Net.IPAddress. Vous pouvez donc appeler .ToString pour obtenir une chaîne de texte qui inclut correctement les marques de point.

Les numéros de port sont stockés sous la forme ushort qui peut être imprimé comme n'importe quel autre nombre entier.

La seule partie qui doit être interprétée sous sa forme binaire est le champ de données car cela change en fonction du protocole utilisé pour la couche suivante. SharpPcap/Packet.Net fait déjà la plupart du travail pour vous et les champs sont stockés sous les formes les plus pratiques ou identiques à celles trouvées dans la spécification du protocole. Utilisez juste intellisense pour vérifier le type de champ et si ce n'est pas celui que vous connaissez (comme System.Net.IPAddress ou System.NetworkInformation.PhysicalAddress (pour les adresses MAC)) il suffit de google it.

Questions connexes