2010-04-24 11 views
6

¿Qué dirección debo ir en (bibliotecas, documentos)?Cómo secuestrar toda la solicitud http local y extraer la url usando c?

ACTUALIZACIÓN

Puede alguien ilustrar cómo utilizar winpcap para hacer el trabajo?

ACTUALIZACIÓN 2

¿Cómo puedo verificar si un paquete es una HTTP?

+2

No necesita escribir ningún software para hacer esto. Use un [proxy] (http://www.squid-cache.org/) que tenga [logging] (http://www.squid-cache.org/Doc/config/access_log/). –

+0

Tenga en cuenta que las respuestas proporcionadas le permiten registrar o monitorear las URL, pero ciertamente no secuestrar: "Cambiar la configuración del software sin el conocimiento del usuario para obligar a ese usuario a visitar un determinado sitio web" (wiktionary). Es posible que haya utilizado mal el término o haya querido decir otro. –

+0

Lamento disputarle a Matt, pero el calamar efectivamente "secuestra". Con eso quiero decir que le permite sustituir una url diferente por la que el usuario ingresó (si eso es lo que quiere hacer como programador). La función principal es almacenar cosas en caché, pero puede hacer más que si lo desea. – Hotei

Respuesta

15

Si por "secuestrar" que quería decir oler los paquetes a continuación, lo que debe hacer para hacerlo con WinPcap es la siguiente:

  1. Encuentre el dispositivo que desea utilizar - See WinPcap tutorial.

  2. Abrir un dispositivo que utiliza pcap_open

    // Open the device 
    char errorBuffer[PCAP_ERRBUF_SIZE]; 
    pcap_t *pcapDescriptor = pcap_open(source,    // name of the device 
                snapshotLength,  // portion of the packet to capture 
                      // 65536 guarantees that the whole packet will be captured on all the link layers 
                attributes,   // 0 for no flags, 1 for promiscuous 
                readTimeout,   // read timeout 
                NULL,     // authentication on the remote machine 
                errorBuffer);   // error buffer 
    
  3. utilizar una función que lee los paquetes desde el descriptor como pcap_loop

    int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL); 
    

    Este bucle hasta que algo malo ha sucedido o el bucle se rompió usando una llamada a un método especial. Llamará al puntero de función para cada paquete.

  4. En la función señaló poner en práctica algo que analiza los paquetes, debe verse como un pcap_handler:

    typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, 
         const u_char *); 
    
  5. Ahora todo lo que queda es para analizar los paquetes que su memoria intermedia se encuentra en el const u_char* y su la longitud está en el campo pcap_pkthdr estructura caplen.

    suponiendo que tiene GET HTTP a través de TCP sobre IPv4 sobre los paquetes de Ethernet, puede:

    • Saltar 14 bytes de la cabecera Ethernet.
    • Omita 20 bytes del encabezado IPv4 (suponiendo que no hay opciones de IPv4, si sospecha que las opciones IPv4 son posibles, puede leer los 5-8 bits del encabezado IPv4, multiplique eso por 4 y este sería el número de bytes toma el encabezado IPv4).
    • Omita 20 bytes del encabezado TCP (suponiendo que no hay opciones TCP, si sospecha que las opciones TCP son posibles, puede leer los 96-99 bits del encabezado TCP, multiplique eso por 4 y este sería el número de bytes toma el encabezado TCP).
    • El resto del paquete debe ser el texto HTTP. El texto entre el primer y el segundo espacio debe ser el URI. Si es demasiado largo, es posible que deba realizar alguna reconstrucción de TCP, pero la mayoría de los URI son lo suficientemente pequeños como para caber en un paquete.

      ACTUALIZACIÓN: En el código se vería así (lo escribí sin probarlo):

      int tcp_len, url_length; 
      uchar *url, *end_url, *final_url, *tcp_payload; 
      
      ... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */ 
      
      /* retireve the position of the tcp header */ 
      ip_len = (ih->ver_ihl & 0xf) * 4; 
      
      /* retireve the position of the tcp payload */ 
      tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4; 
      tcpPayload = (uchar*)ih + ip_len + tcp_len; 
      
      /* start of url - skip "GET " */ 
      url = tcpPayload + 4; 
      
      /* length of url - lookfor space */ 
      end_url = strchr((char*)url, ' '); 
      url_length = end_url - url; 
      
      /* copy the url to a null terminated c string */ 
      final_url = (uchar*)malloc(url_length + 1); 
      strncpy((char*)final_url, (char*)url, url_length); 
      final_url[url_length] = '\0'; 
      

También puede filtrar sólo el tráfico HTTP mediante la creación y el establecimiento de una BPF. See WinPcap tutorial. Probablemente deberías usar el filtro "tcp and dst port 80" que solo te daría la solicitud que tu computadora envía al servidor.

Si no le molesta usar C#, puede intentar usar Pcap.Net, lo cual haría mucho más fácil para usted, incluido el análisis de las partes Ethernet, IPv4 y TCP del paquete.

+1

¿Es posible automatizar el paso 1? Parece que el tutorial requiere especificar un dispositivo manualmente. – Gtker

+0

Por supuesto, todavía tiene que elegir uno o simplemente hacerlo para todos los dispositivos. Muchas veces solo tendrá un dispositivo, por lo que simplemente puede elegir el primero. También puede automatizar la elección utilizando sus propiedades (como su IP). Vea otra parte del tutorial de WinPcap: http://www.winpcap.org/docs/docs_411/html/group__wpcap__tut2.html – brickner

+0

@ brickner, ¿puede también explicar cómo verificar si un paquete es un paquete HTTP dentro de 'pcap_handler' ? – Gtker

0

Es posible que desee mirar el código fuente de tcpdump para ver cómo funciona. tcpdump es una utilidad de línea de comandos de Linux que supervisa e imprime la actividad de la red. Sin embargo, necesita acceso raíz a la máquina para usarlo.

+0

¿Funciona también para Windows? – Gtker

+0

@Runner: si le interesan las soluciones solo de Windows, puede agregar una etiqueta [windows]. –

+0

No solo windows, pero tanto windows como linux. – Gtker

1

Puede parecer exagerado, pero el servidor de proxy/caché web Squid hace exactamente eso. Hace unos años, mi empresa lo usó y tuve que ajustar el código localmente para proporcionar algunas advertencias especiales cuando se accedía a ciertas URL, así que sé que puede hacer lo que quiera. Solo necesita encontrar el código que desea y sacarlo para su proyecto. Usé la versión 2.X y veo que ahora están en 3.X, pero sospecho que ese aspecto del código no ha cambiado mucho internamente.

No dijo si Windows es un "requisito" o una "preferencia", pero según el sitio: http://www.squid-cache.org/ pueden hacer ambas cosas.

+0

No, quiero implementarlo yo mismo. – Gtker

+2

No quiero iniciar una guerra de llamas, pero el hecho de que le hayas preguntado a alguien más cómo hacerlo por ti en el comentario de winpcap me hace preguntarme ... – Hotei

Cuestiones relacionadas