Question

Je voudrais capturer tous les paquets HTTP entrants de ma machine. Pour ce faire, que j'utilise SharpPcap qui est un wrapper WinPcap.

SharpPcap fonctionne très bien, mais il capture les paquets TCP et c'est le niveau trop bas pour faire ce que je veux. Est-ce que quelqu'un sait comment puis-je obtenir easly demandes / réponses complètes HTTP de tous ces paquets TCP?

Merci

Était-ce utile?

La solution

SharpPcap est déjà en mesure de capturer des paquets de la même manière que Wireshark ne (juste dans le code plutôt que d'une interface graphique). Et vous pouvez les analyser directement ou vous pouvez les jeter sur le lecteur dans le format de fichier .pcap commun.

Les étapes pour analyser une capture sont:

  • Choisissez une interface
  • Ouvrir une connexion en mode promiscuous
  • Lancer la capture soit en utilisant une boucle while ou un rappel d'événement
  • Parse le paquet brut du type que vous voulez

Si vous lisez dump .pcap fichiers le processus est presque le même, sauf que vous appelez un lecteur de capture en ligne, ne pas besoin de choisir une interface, et ne pas besoin de définir le mode promiscuous. Tous les filtres standard qui Wireshark, tcpdump, et la plupart des autres cadres Pcap utilisation sont pris en charge dans SharpPcap. Pour une référence à ces vérifier l'homme tcpdump.

À l'heure actuelle il n'y a pas de support pour l'analyse HTTP directement, mais l'analyse des paquets TCP est vraiment facile.

Lorsque vous recevez le paquet brut (non analysables) faire ceci:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

Le Packet.Net (un composant séparé et inclus de SharpPcap) analyseur est capable de tirer sur la partie de TCP directement, même si la communication est encapsulé par VPN, PPoE, ou PPP.

Une fois que vous avez le TCPPacket analysables il suffit de prendre packet.PayloadBytes pour la charge utile dans un tableau d'octets qui doit contenir l'en-tête HTTP en octets bruts qui peuvent être convertis au format texte proprement dit (je ne suis pas sûr que les en-têtes HTTP utilisent l'encodage UTF-8 ou ASCII à ce niveau). Il devrait y avoir beaucoup d'outils / bibliothèques disponibles librement pour analyser les en-têtes HTTP.


Pour extraire le paquet HTTP de TCP:

Vous devez collecter les paquets tcp de la connexion comme ils viennent et si les données sont fragmentées (plus de 1500 octets), vous devez ré-assembler les pièces en mémoire. Pour découvrir quelles parties vont dans quel ordre vous devez suivre attentivement les numéros de séquence / d'accusé de réception.

Ceci est une chose non négligeable à accomplir avec SharpPcap parce que vous travaillez avec une partie beaucoup plus faible de la pile et réassembler la connexion manuellement.

Wireshark a un article intéressant sur la façon d'y parvenir en C.

En ce moment, SharpPcap ne supporte pas l'analyse de la charge utile TCP.


Si vous cherchez des exemples faciles à suivre de la façon d'utiliser SharpPcap télécharger l'arbre source et regardez l'exemple des projets inclus. Il y a aussi un CodeProject.

Si vous avez des questions et / ou si vous voulez faire des demandes de fonctionnalités au projet, ne hésitez pas à poster sur le projet SourceForge. Il est loin d'être mort et continue d'être en cours de développement.

Note: Chris Morgan est le chef de projet et je suis l'un des développeurs pour SharpPcap / Packet.Net.

Mise à jour:. Le projet tutoriel sur le projet de code est maintenant à jour pour correspondre à l'API actuelle

Autres conseils

décoder un flux TCP en paires demande HTTP / réponse est non triviale. Des outils tels que WireShark font un effort considérable.

J'ai écrit un emballage WireShark pour Ruby (pas que cela vous aidera), mais avant je l'ai écrit j'essayé d'utiliser tshark (la version ligne de commande de Wireshark). Cela n'a pas résolu mon problème, mais il peut travailler pour vous. Voici comment:

Vous capturer les paquets et les écrire dans un fichier pcap (SharpPcap a probablement une façon de le faire). À un certain moment fermer le fichier de cap et lancer une autre un, puis sur l'ancien parcours tshark avec un filtre pour le trafic HTTP, et un drapeau indiquant que vous voulez que la sortie au format PDML. Vous trouverez c'est un format XML, facilement analysé avec les outils System.XML, qui contient la valeur de chaque champ HTTP dans une variété de formats. Vous pouvez écrire du code C # pour frayer tshark et conduit son flux StdOut dans un lecteur XML afin que vous obteniez les paquets de tshark comme ils émergent. Je ne recommande pas d'utiliser l'analyseur DOM comme la sortie PDML pour un grand fichier de capture peut devenir fou très rapidement.

À moins que vos besoins sont complexes (comme les miens), cela peut être tout ce que vous avez besoin.

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