Question

J'ai suivi le guide à http://www.codeproject.com/kb/ip/sharppcap.aspx Pour implémenter un sniffer de paquets simples pour automatiser les authentifications pour moi, j'ai réussi à accéder à la section Filtrage, et j'ai dû faire quelques ajustements au code du didacticiel jusqu'à présent pour que cela fonctionne, mais je suis maintenant perplexe.

L'erreur que je reçois est;

La meilleure correspondance de méthode surchargée pour 'PacketDotNet.TcppAcket.GetEncapsuled (PacketDotNet.Packet)' a des arguments non valides

Argument 1: Impossible de se convertir de 'sharppcap.rawcapture' en 'paquetdotnet.packet'

Mais je n'ai pas encore fait de références à PacketDotNet moi-même (tout a jusqu'à présent été SharPPCAP).

Le code entier que j'ai jusqu'à présent est inclus, le problème est dans la fonction device_onpacketarrival ().

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using PacketDotNet;
 using SharpPcap;

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

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

             // If no devices were found print an error
             if (devices.Count < 1)
             {
                 Console.WriteLine("No devices were found on this machine");
                 return;
             }

             // Extract a device from the list
             ICaptureDevice device = devices[0];

             // Register our handler function to the
             // 'packet arrival' event
             device.OnPacketArrival +=
                 new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);

             // Open the device for capturing
             int readTimeoutMilliseconds = 1000;
             device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

             // tcpdump filter to capture only TCP/IP packets
             string filter = "ip and tcp";
             device.Filter = filter;

             Console.WriteLine();
             Console.WriteLine("-- The following tcpdump filter will be applied: \"{0}\"",
                 filter);
             Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
                 device.Description);

             // Start capturing packets indefinitely
             device.Capture();

             // Close the pcap device
             // (Note: this line will never be called since
             // we're capturing indefinitely
             device.Close();
         }
         private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
         {
             var tcp = TcpPacket.GetEncapsulated(e.Packet);
         }
     }
 }
Était-ce utile?

La solution

Un sharppcap.rawpacket est utilisé pour maintenir les données brutes capturées sur l'adaptateur réseau, mais PacketDotNet a besoin du paquet analysé avant que les méthodes GetEncapsuled () ne fonctionneront. L'étape dont vous avez besoin ressemblera:

var packet = PacketDotNet.Packet.ParsePacket(rawPacket.LinkLayerType, rawPacket.Data);

Alors vous pouvez extraire le encapsulé TcpPacket via le GetEncapsulated() Méthode en la passant packet.

Exemple 12 dans le téléchargement de la source SharppCap à https://sourceforge.net/projects/sharppcap/ montre la syntaxe et comment les paquets peuvent être modifiés.

Garde en tête que PacketType.GetEncapsulated() Renvoie une référence à cette partie du paquet, donc la modification altera le paquet d'origine.

Autres conseils

Alternativement, vous pouvez utiliser Pcap.net, qui n'a qu'une seule classe de paquets que vous pouvez analyser dynamiquement pour obtenir tout ce qu'il peut contenir sans faire de paquet.

Vous obtenez simplement un objet de paquet et faites (par exemple):

uint sequenceNumber = packet.Ethernet.IpV4.Tcp.SequenceNumber;

Pas besoin de le lancer ou de savoir quel type de paquet il est à l'avance, tout l'analyse est effectué dynamiquement.

Comme mise à jour de la réponse de Chris Morgan (parce que je me retrouve à faire cela aujourd'hui), getEncapsulated() est maintenant obsolète, vous devriez plutôt utiliser packet.Extract() pour extraire le paquet encapsulé.

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