@BigRussianJack

Как перехватывать трафик сетевой карты?

Доброго времени суток! Сейчас столкнулся с проблемой, пишу анализатор трафика, и мне необходимо просматривать http, как это сделать? С помощью libpcap реализовал сниффер, но максимум что могу узнать длинну пакета, если все правильно написал то он должен поидее просматривать только http трафик, как распарсить эти пакеты? Вот код перехватывающий их:
#include <stdio.h>
#include <pcap.h>

int main(int argc, char *argv[]){

    pcap_t *handle;                      //заголовок сессии
    char *dev, errbuf[PCAP_ERRBUF_SIZE]; //хранение ошибок

    struct bpf_program fp;		         //The compiled filter expression
    char filter_exp[] = "tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)"; //The filter expression
    bpf_u_int32 mask;		             //The netmask of our sniffing device
    bpf_u_int32 net;		             //The IP of our sniffing device
    struct pcap_pkthdr header;           //The header that pcap gives us
    const u_char *packet;                //The actual packet

    //установка соединения

    dev = pcap_lookupdev(errbuf);

    if (dev == NULL) {
        fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
        return(2);
    }
    printf("Device: %s\n", dev);



    //поиск устройства если не через рут он не даст скажет нет прав
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
    if(handle == NULL) {
        fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
        return(2);
    }

    printf("Device is opening for sniffing\n");

    //проверка на поддерживаемость типазаголовка канального уровня
    if(pcap_datalink(handle) != DLT_EN10MB){
            fprintf(stderr, "Device %s doesn't provide Ethernet headers - not supported\n", dev);
            return(2);
    }

    printf("Device does provide Ethernet headers\n");

    //установка фильтров

    if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
         fprintf(stderr, "Can't get netmask for device %s\n", dev);
         net = 0;
         mask = 0;
    }

    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);

    if(pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
         fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
         return(2);
    }
    printf("Parse filter found\n");

    if(pcap_setfilter(handle, &fp) == -1) {
         fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
         return(2);
    }

    printf("Parse filter install\n");

    while(1){
        // Grab a packet
        packet = pcap_next(handle, &header);
        // Print its length
        printf("Jacked a packet with length of [%d]\n", header.len);
    }

    // And close the session
    pcap_close(handle);

    return(0);
}


Заранее спасибо!
  • Вопрос задан
  • 838 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
"Трафик сетевой карты" - это не IP-пакеты и даже не Ethernet-кадры, а электрические импульсы в кабеле, или радиоволны! Между сетевой картой и Winsock (TCP) пролегает штук 5-10 слоев кода в ядре NT, это несколько системных драйверов, Pcap всего лишь еще один драйвер, он также загружается в ОЗУ в процесс System и в рамках этого процесса ставит "хуки" в один из ранее загруженных системных драйверов.
Тем не менее, для HTTP даже такое решение как Pcap слишком низкоуровневое, как и сниффер Wireshark который на основан на Pcap. Смотрите лучше в сторону сниффера Fiddler и его библиотеки FiddlerCore, там просто локальный HTTP-прокси, который устанавливается в систему и отслеживает трафик, можете использовать эту библиотеку, там хотя бы C# а не C++, или сами такой прокси написать, не обязательно локальный.
И в любом случае учтите что область мало проработана и нет гарантий что в интернете есть все необходимые примеры исходного кода и документация, поэтому надо мало того что уметь их искать и анализировать, может понадобится еще и анализ, реверс-инжиниринг самих снифферов - отладка, дизассемблирование, декомпиляция, опять же с Fiddler это намного проще поскольку .NET.
Рассчитывать здесь на помощь на форуме, тем более бесплатную, это полнейший абсурд и наивность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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