Laden...

Nach Angabe eines SharpPcap-Filters die Werte anzeigen lassen

Erstellt von Hurricane_One vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.688 Views
H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren
Nach Angabe eines SharpPcap-Filters die Werte anzeigen lassen

Hallo Gemeinde,

ich beschäftige mich momentan mit Netzwerkanalyse und dem SharpPcap Framework.
Dazu gibt es genügend Lektüre im Internet und man versteht eigentlich recht schnell worum es geht. Ein Problem tritt beim Filtering auf, bzw. kann ich mir nach Angabe des Filters die Werte nicht anzeigen lassen.
Woran könnte das liegen?

Quellcode:


 ICaptureDevice device = Devices[0];
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds); 
string filter = "ip and tcp";                                               
device.Filter = filter;                                          
device.Capture(); 
Console.WriteLine("-- Abhören von Schnittstelle {0}: ",device.Description);
Console.ReadLine();
device.Close();

Vielen Dank für die Hilfe

Gruß, Hurri

D
985 Beiträge seit 2014
vor 7 Jahren

Was soll denn passieren, wenn da etwas aufgefangen wird?

Ich sehe da im Code keinerlei Hinweis

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Ich wollte mir zuerst nur anschauen ob da Pakete sind die diesem Filter entsprechen.

D
985 Beiträge seit 2014
vor 7 Jahren

Anschauen geht aber nur dann, wenn etwas angezeigt wird.

Wo hast du definiert wann, wie und was er anzeigen soll?

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Achso...

Ich dachte die Ausgabe findet über die Methode statt, über welche auch die normale Anzeige aller Daten stattfindet.

 
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
            DateTime time = packet.Packet.Timeval.Date;
            int len = packet.Packet.Data.Length;
            Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
            time.Hour, time.Minute, time.Second, time.Millisecond, len);
}

Dazu habe ich etwas weiter oben den EventHandler implementiert.


device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);

D
985 Beiträge seit 2014
vor 7 Jahren

Schau dir den Code aus deinem ersten Beitrag an. Dort hängst du dich an keinen Event dran.

Ich kann ja nur zu dem Code den ich sehe etwas sagen und nichts zu dem, der nicht da ist.

Also, wie sieht denn dein Code komplett aus, wo du nichts siehst?

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Der komplette Code sieht so aus:



#region  Adapter anlegen und Pakete erfassen
            ICaptureDevice device = Devices[0];                                                         // Erstellen eines Gerätes aus der Liste           
            device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);  // EventHandler
            int readTimeoutMilliseconds = 1000;
            device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);                               // Öffnet Geräteschnittstelle
            Console.WriteLine("-- Gerät {0} auslesen",device.Description);
            device.StartCapture();                                                                      // Prozess Start
            Console.ReadLine();
            Console.Clear();
            device.StopCapture();                                                                       // Prozess Stop
            device.Close();                                                                             // Schließt Geräteschnittstelle
#endregion

#region Pakete mit Filter 
            // device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_FilterPacket);  // EventHandler
            device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);                               // Öffnet Schnittstelle                                                                                                     
            string filter = "ip and tcp";                                                               // Filter für IP und TCP
            device.Filter = filter;                                                                     // Filter dem Gerät zuweisen
            device.Capture();                                                                           // Start Paketerfassung
            Console.WriteLine("-- Angewendeter Filter \"{0}\"",filter);
            Console.WriteLine("-- Abhören von Schnittstelle {0}: ",device.Description);
            Console.ReadLine();
            device.Close();
#endregion

Zusätzlich die Event-Methode für Fall 1 (region Adapter anlegen und Pakete erfassen)


private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
            DateTime time = packet.Packet.Timeval.Date;
            int len = packet.Packet.Data.Length;
            Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
            time.Hour, time.Minute, time.Second, time.Millisecond, len);
}

Ich benötige wohl auch eine Event-Methode für den unteren Teil.

1
124 Beiträge seit 2012
vor 7 Jahren

Da fehlt immer noch etwas Code.

Die Frage ist wann wird der erste Code Ausschnitt aufgerufen/verarbeitet?

Gruß

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Guten Morgen.

Da es sich um erste Tests handelt, erfolgt momentan keine Weiterverarbeitung der Daten.
Eine normale Konsolenanwendung mit einer Kommandozeilenausgabe die hintereinander implementiert ist.
Vom oberen Bsp. (region Adapter anlegen und Pakete erfassen) werden die Daten nur in der Event-Methode ausgegeben.
Ich möchte jetzt gerne Filter für diese Pakete anwenden und mir nur bestimmte Typen (ip und tcp) anzeigen lassen.

1
124 Beiträge seit 2012
vor 7 Jahren

Hallo,

ich glaube du verstehst uns nicht ganz. Schaut dein Code so aus?

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            #region  Adapter anlegen und Pakete erfassen
            ICaptureDevice device = Devices[0];                                                         // Erstellen eines Gerätes aus der Liste          
            device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);  // EventHandler
            int readTimeoutMilliseconds = 1000;
            device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);                               // Öffnet Geräteschnittstelle
            Console.WriteLine("-- Gerät {0} auslesen",device.Description);
            device.StartCapture();                                                                      // Prozess Start
            Console.ReadLine();
            Console.Clear();
            device.StopCapture();                                                                       // Prozess Stop
            device.Close();                                                                             // Schließt Geräteschnittstelle
            #endregion

            #region Pakete mit Filter
            // device.OnPacketArrival += new SharpPcap.PacketArrivalEventHandler(device_FilterPacket);  // EventHandler
            device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);                               // Öffnet Schnittstelle                                                                                                    
            string filter = "ip and tcp";                                                               // Filter für IP und TCP
            device.Filter = filter;                                                                     // Filter dem Gerät zuweisen
            device.Capture();                                                                           // Start Paketerfassung
            Console.WriteLine("-- Angewendeter Filter \"{0}\"",filter);
            Console.WriteLine("-- Abhören von Schnittstelle {0}: ",device.Description);
            Console.ReadLine();
            device.Close();
            #endregion

       }

        private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
        {
            DateTime time = packet.Packet.Timeval.Date;
            int len = packet.Packet.Data.Length;
            Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
            time.Hour, time.Minute, time.Second, time.Millisecond, len);
         }
    }
}
H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Ja, genau so.

1
124 Beiträge seit 2012
vor 7 Jahren

Okay also haben wir das schonmal geklärt.

Jetzt die nächste Frage. Dein aktuelles Problem ist, dass das Event "device_OnPacketArrival" nicht ausgeführt wird?

Wenn ja dann könntest du schauen, ob du das korrekte Device ausgewählt hast mit "Devices[0]", dass du abhören möchtest.

Oder funktioniert nur die Filterung nicht?

Gruß

H
Hurricane_One Themenstarter:in
89 Beiträge seit 2015
vor 7 Jahren

Das Device ist in Ordnung und es funktioniert nur die Filterung nicht.

Der erste Teil wird auch einwandfrei ausgeführt/dargestellt/angezeigt.

1
124 Beiträge seit 2012
vor 7 Jahren

Ich kenne jetzt SharpPcap leider nicht.

Aber der Teil in der Main wird ja nur einmal ausgeführt zur Laufzeit. Du willst vermutlich das er dauerhaft abhört, dann müsste das doch auch ein Event sein, dass immer wenn er Pakete empfängt abfragt, ob es zu dem Filter passt und dann ggf. ausgibt. bzw. in dem bestehenden Event mit integrieren.

Gruß

P
441 Beiträge seit 2014
vor 7 Jahren

Werden überhaupt Pakete empfangen?
Also kommt etwas in deinem Programm an, wenn du den Filter weglässt?

Läuft WinPcap? Den Treiber brauchst du um überhaupt etwas zu empfangen.