Как угнать весь локальный запрос HTTP и извлечь URL с помощью c?

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

ОБНОВЛЕНИЕ

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

ОБНОВЛЕНИЕ 2

Как я проверяю, является ли пакетом HTTP один?

6
задан Gtker 5 May 2010 в 17:00
поделиться

4 ответа

Если под «угоном» вы имели в виду обнюхивать пакеты, то для этого с WinPcap вам следует сделать следующее:

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

  2. Открытие устройства с помощью pcap_open

     // Открытие устройства 
    char errorBuffer [PCAP_ERRBUF_SIZE]; 
    pcap_t * pcapDescriptor = pcap_open (source, // имя устройства { {1}} snapshotLength, // часть пакета для захвата 
     // 65536 гарантирует, что весь пакет будет захвачен на всех уровнях ссылок 
    , // 0 без флагов, 1 для беспорядочного 
    readTimeout, // таймаут чтения 
    NULL, // аутентификация на удаленном компьютере 
    errorBuffer); // буфер ошибок 
     
  3. Используйте функцию, которая считывает пакеты из дескриптора, например pcap_loop

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

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

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

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

    Предполагая, что у вас есть HTTP GET через TCP через IPv4 через пакеты Ethernet, вы можете:

    • Пропустить 14 байтов заголовка Ethernet.
    • Пропустить 20 байтов заголовка IPv4 (при условии, что параметры IPv4 отсутствуют, если вы подозреваете, что параметры IPv4 возможны, вы можете прочитать 5-8 бит заголовка IPv4, умножить их на 4, и это будет число байтов, которые занимает заголовок IPv4).
    • Пропустить 20 байтов заголовка TCP (при условии, что параметры TCP отсутствуют, если вы подозреваете, что параметры TCP возможны, вы можете прочитать 96-99 бит заголовка TCP, умножить это на 4, и это будет число байтов, которые занимает заголовок TCP).
    • Остальная часть пакета должна быть текстом HTTP. Текст между первым и вторым пробелами должен быть URI. Если он слишком длинный, вам может потребоваться некоторая реконструкция TCP, но большинство URI достаточно малы, чтобы поместиться в один пакет.

      ОБНОВЛЕНИЕ : В коде это будет выглядеть так (я написал это, не тестируя):

       int tcp_len, url_length; 
      uchar * url, * end_url, * final_url, * tcp_payload; 
       
       ... / * код в http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html * / 
       
       / * удалить позицию заголовка TCP * / 
      ip_len = (ih-> ver_ihl & 0xf) * 4; 
       {{1 }} / * убираем позицию полезной нагрузки tcp * / 
      tcp_len = (((uchar *) ih) [ip_len + 12] >> 4) * 4; 
      tcpPayload = (uchar * ) ih + ip_len + tcp_len; 
       
       / * начало url - пропустить "GET" * / 
      url = tcpPayload + 4; 
       
       / * длина url - поиск пробела * / 
      end_url = strchr ((char *) url, ''); 
      url_length = end_url - url; 
       
       / * копируем URL-адрес в строку c с завершающим нулем * / 
      final_url = (uchar *) malloc (url_length + 1); 
      strncpy ((char *) final_url, (char *) url, url_length); 
      final_url [url_length] = '\ 0'; 
       

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

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

15
ответ дан 8 December 2019 в 12:58
поделиться

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

1
ответ дан 8 December 2019 в 12:58
поделиться

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

0
ответ дан 8 December 2019 в 12:58
поделиться

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

Вы не сказали, являются ли окна «требованием» или «предпочтением», но согласно сайту: http://www.squid-cache.org/ они может сделать и то, и другое.

2
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: