Frage

Ich möchte alle eingehenden HTTP-Pakete von meiner Maschine erfassen. Zu tun, dass ich SharpPcap bin mit der ein WinPcap Wrapper ist.

SharpPcap funktioniert sehr gut, aber es fängt TCP-Pakete und das ist zu niedrigem Niveau zu tun, was ich will. Wer weiß, wie kann ich easly vollständige HTTP-Anfragen / Antworten von all diesen TCP-Paketen bekommen?

Danke

War es hilfreich?

Lösung

SharpPcap ist bereits in der Lage Pakete in der gleichen Weise zu erfassen, dass wireshark tut (nur in Code statt einer GUI). Und Sie können entweder analysieren sie direkt oder Sie können sie auf das Laufwerk in dem gemeinsamen .pcap Dateiformat auszugeben.

Die Schritte, um eine Aufnahme zu analysieren sind:

  • Wählen Sie eine Schnittstelle
  • Öffnen Sie eine Verbindung im Promiscuous-Modus
  • Starten Sie Capture entweder eine while-Schleife oder ein Ereignis Rückruf mit
  • Parse das rohe Paket auf die Art, die Sie wollen

Wenn Sie .pcap Dump gerade liest Dateien der Prozess ist fast das gleiche, außer Sie eine Offline-Capture-Leser aufrufen, müssen nicht über eine Schnittstelle holen, und müssen nicht Promiscuous-Modus setzen. Alle Standard-Filter, die wireshark, tcpdump und die meisten anderen Pcap Verwendung Frameworks sind in SharpPcap unterstützt. Für einen Verweis auf diese überprüfen Sie die tcpdump Mann.

Zur Zeit gibt es keine Unterstützung HTTP direkt zum Parsen aber TCP-Pakete Parsen ist wirklich einfach.

Wenn Sie das rohe Paket (nicht analysiert) tut dies erhalten:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

Die Packet.Net (A getrennt und enthalten Komponente SharpPcap) Parser in der Lage ist, selbst direkt ziehen den TCP Teil aus, wenn die Kommunikation durch VPN, PPoE oder PPP eingekapselt ist.

Sobald Sie die TCPPacket nur packet.PayloadBytes für die Nutzlast in einem Byte-Array greifen analysiert, die die HTTP-Header in rohem Bytes enthalten sollen, die auf das richtige Text-Format umgewandelt werden können (ich bin nicht wirklich sicher, ob HTTP-Header verwenden UTF-8 oder ASCII-Codierung auf diesem Niveau). Es sollte frei verfügbaren Tools / Bibliotheken viel zu HTTP-Header zu analysieren.


Um das HTTP-Paket von TCP zu extrahieren:

Sie müssen die TCP-Pakete der Verbindung sammeln, wie sie kommen und wenn die Daten fragmentiert ist (größer als 1500 Bytes) können Sie die Teile im Speicher wieder zusammenbauen müssen. Um herauszufinden, welche Teile gehen in welcher Reihenfolge Sie müssen sorgfältig die Sequenz / Bestätigungsnummern verfolgen.

Dies ist eine nicht-triviale Sache mit SharpPcap zu erreichen, weil Sie mit einem viel geringeren Teil des Stapels und Wiederzusammensetzen die Verbindung manuell arbeiten.

Wireshark hat einen interessanten Artikel darüber, wie dies in C zu erreichen.

Ab jetzt, nicht SharpPcap nicht TCP-Payload-Analyse unterstützen.


Wenn Sie suchen einfach zu folgen Beispiele dafür, wie die Quellbaum verwenden SharpPcap herunterladen und sehen Sie die Beispielprojekte enthalten. Es gibt auch eine Tutorial für SharpPcap auf Codeproject .

Wenn Sie weitere Fragen haben und / oder möchten Sie das Projekt alle Feature-Requests machen, fühlen Sie sich frei auf der Sourceforge-Projekt zu veröffentlichen. Es ist noch lange nicht tot und setzt sich aktiv weiterentwickelt werden.

Hinweis: Chris Morgan ist die Projektleitung und ich bin einer der Entwickler für SharpPcap / Packet.Net.

Update:. Das Tutorial-Projekt auf Projekt-Code ist jetzt up-to-date der aktuelle API entsprechen

Andere Tipps

Dekodieren eines TCP Strom in HTTP-Anforderung / Antwort-Paare ist nicht trivial. Tools wie Wireshark tun dies mit erheblichen Aufwand.

Ich schrieb einen Wrapper für Ruby Wireshark (nicht, dass das wird Ihnen helfen), aber bevor ich es geschrieben habe ich versucht, mit tshark (die Kommandozeilen-Version von Wireshark). Das löste nicht mein Problem, aber es kann für Sie arbeiten. Hier ist, wie:

Sie die Pakete erfassen und schreibt sie in eine pcap-Datei (SharpPcap hat wahrscheinlich eine Möglichkeit, dies zu tun). An einem gewissen Punkt die Kappe Datei schließen und ein anderes starten, dann auf dem alten Lauf tshark mit einem Filter für HTTP-Verkehr, und ein Flag, das angibt Sie die Ausgabe im PDML Format. Sie finden das ist ein XML-Format, leicht mit den System.Xml-Tools analysiert, die den Wert jedes HTTP Bereich der Formate in einer Vielzahl enthält. Sie können C # -Code schreiben tshark zum Laichen und Rohr seine StdOut Strom in einen XML-Reader, so dass Sie die Pakete aus tshark bekommen, wie sie entstehen. Ich empfehle, nicht den DOM-Parser als PDML Ausgang für eine große Capture-Datei kann sehr schnell verrückt.

Es sei denn, Ihre Anforderungen komplex sind (wie meine waren), das alles sein kann, was Sie brauchen.

Ich glaube, Sie zur Lösung der Nähe sind: Wenn Sie die TCP-Pakete aus dem HTTP-Datenverkehr haben, müssen Sie nur die TCP-Nutzlast um extrahieren müssen, um die HTTP-Anforderung / Antwort auf neu aufzubauen. Sehen Sie diese SO Eintrag auf eine Art und Weise, es zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top