2009-12-07 13 views
7

Me gustaría capturar todos los paquetes HTTP entrantes de mi máquina. Para hacer eso estoy usando SharpPcap, que es un contenedor WinPcap.Cómo capturar paquetes HTTP con SharpPcap

SharpPcap funciona muy bien pero captura paquetes TCP y este es un nivel demasiado bajo para hacer lo que quiero. ¿Alguien sabe cómo puedo obtener fácilmente solicitudes/respuestas HTTP completas de todos estos paquetes TCP?

Gracias

Respuesta

8

SharpPcap ya es capaz de capturar paquetes de la misma manera que wireshark (solo en código en lugar de GUI). Y puede analizarlos directamente o puede volcarlos en el disco en el formato de archivo .pcap común.

Los pasos de analizar una captura son:

  • elegir una interfaz
  • Abra una conexión en modo promiscuo
  • iniciar la captura, ya sea usando un bucle while o un callback evento
  • analizar el crudo paquete al tipo que desee

Si está leyendo archivos de volcado .pcap, el proceso es casi el mismo e xcepto que llame a un lector de captura fuera de línea, no necesita seleccionar una interfaz, y no necesita configurar el modo promiscuo. Todos los filtros estándar que wireshark, tcpdump y la mayoría de los demás marcos Pcap utilizan son compatibles con SharpPcap. Para una referencia a estos verifique el tcpdump man.

Actualmente no hay soporte para analizar HTTP directamente, pero el análisis de paquetes TCP es realmente sencillo.

Al recibir el paquete sin procesar (no analizada) hacer esto:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

el paquete.El analizador de red (un componente separado e incluido de SharpPcap) es capaz de extraer directamente la porción de TCP incluso si la comunicación está encapsulada mediante VPN, PPoE o PPP.

Una vez que haya analizado el TCPPacket simplemente tome el paquete.PayloadBytes para la carga en una matriz de bytes que debe contener el encabezado HTTP en bytes sin procesar que se pueden convertir al formato de texto correcto (no estoy seguro de si cabeceras HTTP use codificación UTF-8 o ASCII en ese nivel). Debería haber muchas herramientas/librerías disponibles libremente para analizar los encabezados HTTP.


para extraer el paquete HTTP de TCP:

Usted necesita recoger los paquetes TCP de la conexión ya que vienen en y si se fragmenta los datos (mayor de 1500 bytes) que necesita para vuelva a ensamblar las partes en la memoria. Para descubrir qué partes van en qué orden, debe seguir cuidadosamente los números de secuencia/reconocimiento.

Esto no es algo trivial para lograr con SharpPcap porque estás trabajando con una parte mucho más baja de la pila y volviendo a ensamblar la conexión manualmente.

Wireshark tiene un interesante artículo sobre cómo lograr esto en C.

A partir de ahora, SharpPcap no soporta la carga útil TCP análisis.


Si lo que buscas es fácil de seguir ejemplos de cómo utilizar SharpPcap descargar el árbol de fuentes y observe el ejemplo proyectos incluidos. También hay un tutorial for SharpPcap on codeproject.

Si tiene más preguntas y/o desea realizar alguna solicitud de funciones al proyecto, siéntase libre de publicar en el proyecto de SourceForge. Está lejos de estar muerto y continúa en desarrollo activo.

Nota: Chris Morgan es el líder del proyecto y soy uno de los desarrolladores de SharpPcap/Packet.Net.

Actualización: El proyecto del tutorial sobre el proyecto de código está ahora actualizado para coincidir con la API actual.

+0

'GetEncapsulated' es igual a' Packet.ParsePacket (e.Packet.LinkLayerType, e.Packet.Data); '¿correcto? – C4u

0

creo que está cerca de la solución: si tiene los paquetes TCP del tráfico HTTP, es suficiente para extraer la carga útil TCP con el fin de reconstruir la petición/respuesta HTTP. Consulte esto SO entry en una posible forma de hacerlo.

2

La decodificación de una secuencia TCP en pares de solicitud/respuesta HTTP no es trivial. Herramientas como WireShark hacen esto con un esfuerzo considerable.

Escribí un contenedor WireShark para Ruby (no es que eso te ayude), pero antes de escribirlo intenté usar tshark (la versión de línea de comandos de WireShark). Eso no resolvió mi problema pero puede funcionar para usted. Aquí se explica cómo:

Captura los paquetes y los escribe en un archivo pcap (SharpPcap probablemente tenga una forma de hacerlo). En algún momento, cierre el archivo de límite e inicie otro, luego en el antiguo ejecute tshark con un filtro para tráfico HTTP y un indicador que indique que desea el resultado en formato PDML. Encontrará que se trata de un formato XML, fácil de analizar con las herramientas System.Xml, que contiene el valor de cada campo HTTP en una variedad de formatos. Puede escribir el código C# para engendrar tshark y canalizar su flujo StdOut en un lector XML para que pueda obtener los paquetes de tshark a medida que aparecen. No recomiendo usar el analizador DOM ya que la salida PDML para un archivo de captura grande puede volverse loco muy rápidamente.

A menos que sus requisitos sean complejos (como el mío), esto puede ser todo lo que necesita.

+0

Es interesante saber que PDML es un formato estándar bien conocido o específico de una aplicación. El límite en SharpPcap se puede hacer de 2 maneras: para tráfico bajo/moderado es posible capturar/analizar paquetes en vivo; para capturas de alto tráfico (como una transferencia ftp) la mejor opción es volcar el límite sin formato a archivos .pcap y posprocesar después. SharpPcap es básicamente un framework multiplataforma para construir capturas tipo wireshark en aplicaciones C#. En este momento, SharpPcap es el contenedor de pcap y Packet.Net es la biblioteca del analizador. –

+0

¿Tiene el código publicado en alguna parte (por ejemplo, GitHub)? Si es así, me gustaría echarle un vistazo en algún momento. Me gustaría ver cuánto código/esfuerzo se necesitó para administrar el paso de reensamblaje de TCP. –

+0

No sé si PDML es un estándar o algo específico para wireshark; en cualquier caso, es fácil de procesar. – anelson

Cuestiones relacionadas