Как захватить все локальные http-запросы и извлечь url-адрес с помощью c?

в каком направлении я должен идти в(библиотеки, документы)?

обновление

может ли кто-нибудь проиллюстрировать, как использовать winpcap для выполнения этой работы?

обновление 2

Как проверить, является ли пакет HTTP?

4 ответов


если под "hijack" вы имели в виду нюхать пакеты, то что вы должны сделать, чтобы сделать это с WinPcap следующее:

  1. Найти устройство, которое вы хотите использовать - см. учебник WinPcap.

  2. открыть устройство с помощью 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. используйте функцию, которая считывает пакеты из дескриптора, например pcap_loop

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

    это будет цикл, пока что-то не случилось или цикл был прерван с помощью специального вызова метода. Он вызовет functionPointer для каждого пакета.

  4. в указанной функции реализуйте что-то, что анализирует пакеты, оно должно выглядеть как pcap_handler:

    typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
             const u_char *);
    
  5. теперь все, что у вас осталось, это разобрать пакеты, что их буфер находится в const u_char* и их длина составляет в pcap_pkthdr структура ';

вы также можете фильтровать только HTTP-трафик, используя создание и настройку BPF. см. учебник WinPcap. Вероятно, вам следует использовать filter "tcp and dst port 80" что даст вам только запрос, который ваш компьютер отправляет на сервер.

если вы не против использования C#, вы можете попробовать использовать Pcap.Net, который сделал бы все это для вас гораздо проще, включая разбор Ethernet, IPv4 и TCP части пакета.


попробуйте http://www.winpcap.org/


Это может показаться излишним, но веб-прокси/кэш сервер Squid делает именно это. Несколько лет назад моя компания использовала его, и мне пришлось настроить код локально, чтобы обеспечить некоторые специальные предупреждения при доступе к определенным URL-адресам, чтобы я знал, что он может делать то, что вы хотите. Вам просто нужно найти код, который вы хотите, и вытащить его для вашего проекта. Я использовал версию 2.X и я вижу, что они до 3.X теперь, но я подозреваю, что этот аспект кода не сильно изменился внутренне.

вы не сказали, если windows - это "требование" или "предпочтение", но в соответствии с сайтом: http://www.squid-cache.org/ они могут сделать оба.


вы можете посмотреть исходный код tcpdump чтобы увидеть, как это работает. tcpdump - это утилита командной строки Linux, которая отслеживает и печатает сетевую активность. Вам нужен root-доступ к машине, чтобы ее использовать.