2010-04-24 6 views
6

In welche Richtung soll ich gehen (Bibliotheken, Dokumente)?Wie alle lokalen HTTP-Anfrage zu hijack und extrahieren Sie die URL mit c?

UPDATE

Kann jemand zeigen, wie winpcap verwenden, um den Job zu tun?

UPDATE 2

Wie kann ich überprüfen, ob ein Paket ein ein HTTP ist?

+2

Sie brauchen dazu keine Software zu schreiben. Verwende einen [proxy] (http://www.squid-cache.org/), der [logging] hat (http://www.squid-cache.org/Doc/config/access_log/). –

+0

Beachten Sie, dass die Antworten Ihnen erlauben, die URLs zu loggen oder zu überwachen, aber sicherlich nicht kaputt gehen: "Softwareeinstellungen ohne Wissen des Benutzers ändern, um diesen Benutzer zum Besuch einer bestimmten Website zu zwingen" (wiktionary). Vielleicht haben Sie den Begriff missbraucht oder einen anderen gemeint. –

+0

Sorry, Matt zu bestreiten, aber Tintenfisch tatsächlich "entführt". Damit meine ich, dass Sie eine andere URL für die Eingabe durch den Benutzer eingeben können (wenn Sie das als Programmierer machen möchten). Die Hauptfunktion ist, Dinge zu cachen, aber es kann mehr als, wenn Sie es wünschen. – Hotei

Antwort

15

Wenn von „kapern“ Sie meinten, die Pakete schnüffeln dann, was Sie sollten es mit WinPcap zu tun tun, ist die folgende:

  1. Finden Sie das Gerät, das Sie verwenden möchten - See WinPcap tutorial.

  2. Öffnen Sie ein Gerät 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. Verwendung mit einer Funktion, die Pakete aus dem Descriptor liest sich wie pcap_loop

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

    Diese Schleife wird bis etwas falsch geschehen ist oder die Schleife war gebrochen mit ein spezieller Methodenaufruf Es ruft den functionPointer für jedes Paket auf.

  4. In der Funktion zeigte etwas implementieren, die die Pakete analysiert, es wie ein pcap_handler aussehen sollte:

    typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, 
         const u_char *); 
    
  5. Alles was Sie jetzt verlassen haben, ist die Pakete zu analysieren, die ihre Puffer in der const u_char* ist und ihre Länge ist in der pcap_pkthdr Struktur caplen Feld.

    Angenommen, Sie haben HTTP GET über TCP über IPv4 over Ethernet-Pakete können Sie:

    • Überspringen 14 Bytes der Ethernet-Header.
    • Überspringen Sie 20 Bytes des IPv4-Headers (vorausgesetzt, es gibt keine IPv4-Optionen, wenn Sie vermuten, dass IPv4-Optionen möglich sind, können Sie die 5-8 Bits des IPv4-Headers lesen, multiplizieren Sie diese mit 4 und dies wäre die Zahl von Bytes der IPv4-Header dauert).
    • Überspringen Sie 20 Bytes des TCP-Headers (vorausgesetzt, es gibt keine TCP-Optionen, wenn Sie vermuten, dass TCP-Optionen möglich sind, können Sie die 96-99 Bits des TCP-Headers lesen, multiplizieren Sie diese mit 4 und dies wäre die Zahl von Bytes, die der TCP-Header benötigt).
    • Der Rest des Pakets sollte der HTTP-Text sein. Der Text zwischen dem ersten und zweiten Leerzeichen sollte der URI sein. Wenn es zu lang ist, müssen Sie möglicherweise eine TCP-Rekonstruktion durchführen, aber die meisten URIs sind klein genug, um in ein Paket zu passen.

      UPDATE: Im Code dies so aussehen würde (ich es geschrieben habe, ohne es zu testen):

      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'; 
      

Sie auch nur HTTP-Datenverkehr durch die Verwendung Erstellen und Einstellen filtern BPF. See WinPcap tutorial. Sie sollten wahrscheinlich den Filter "tcp and dst port 80" verwenden, der Ihnen nur die Anforderung geben würde, die Ihr Computer an den Server sendet.

Wenn es Ihnen nichts ausmacht, C# zu verwenden, können Sie versuchen, Pcap.Net zu verwenden, was all das viel einfacher für Sie tun würde, einschließlich der Analyse der Ethernet-, IPv4- und TCP-Teile des Pakets.

+1

Ist es möglich, Schritt 1 zu automatisieren? Es scheint, dass das Tutorial erfordert, ein Gerät manuell anzugeben. – Gtker

+0

Natürlich müssen Sie immer noch eines wählen oder es einfach für alle Geräte tun. Oft haben Sie nur ein Gerät, also können Sie einfach das erste auswählen. Sie können die Auswahl auch automatisieren, indem Sie ihre Eigenschaften (wie ihre IP) verwenden. Sehen Sie sich einen anderen Teil des WinPcap-Tutorials an: http://www.winpcap.org/docs/docs_411/html/group__wpcap__tut2.html – brickner

+0

@ brickner, können Sie auch erläutern, wie überprüft werden kann, ob ein Paket ein HTTP-Paket in 'pcap_handler' ist ? – Gtker

0

Sie können auf den Quellcode von tcpdump aussehen wollen, um zu sehen, wie es funktioniert. tcpdump ist ein Linux-Befehlszeilenprogramm, das Netzwerkaktivitäten überwacht und druckt. Sie benötigen jedoch Root-Zugriff auf den Computer, um ihn zu verwenden.

+0

Funktioniert es auch für Windows? – Gtker

+0

@Runner: Wenn Sie an Windows-Lösungen interessiert sind, können Sie ein [Windows] -Tag hinzufügen. –

+0

Nicht nur Windows, sondern sowohl Windows als auch Linux. – Gtker

1

Es mag wie Overkill klingen, aber der Web-Proxy/Cache-Server Squid tut genau das. Vor ein paar Jahren hat meine Firma es benutzt und ich musste den Code lokal anpassen, um einige spezielle Warnungen zu geben, wenn bestimmte URLs aufgerufen wurden, also weiß ich, dass es tun kann, was Sie wollen. Sie müssen nur den gewünschten Code finden und ihn für Ihr Projekt herausziehen. Ich habe Version 2.X benutzt und ich sehe, dass sie jetzt bis zu 3.X sind, aber ich vermute, dass dieser Aspekt des Codes intern nicht viel verändert hat.

Sie haben nicht gesagt, wenn Windows eine "Anforderung" oder eine "Präferenz" ist aber laut der Website: können sie beide tun.

+0

Nein, ich möchte es selbst implementieren. – Gtker

+2

Ich möchte nicht einen Flammenkrieg beginnen, aber die Tatsache, dass du gerade jemand anderen gefragt hast, wie es für dich im winpcap-Kommentar funktioniert, lässt mich wundern ... – Hotei