код перехвата пакетов c не прекращается, показывая количество перехваченных пакетов - PullRequest
0 голосов
/ 03 октября 2019

Я учусь писать код pcap на языке c. Ниже я написал простой код на c, чтобы автоматически определять устройство для прослушивания, получения маски ip и подсети, получения заголовков канального уровня и фильтрации трафика, а затем печати размера пакета.

Код успешно выполняется, но застревает на

Обнаружено сетевое устройство: wlo1

при запуске. Удаление части фильтра печатает размер пакета. И удаление части пакета печати;Программа соответствует требованиям и работает успешно.

Мне кажется, мне не хватает понимания фильтрующей части.

Я компилирую, используя (в Linux): gcc имя_программы -lpcap

Выводкод: Сетевое устройство найдено: wlo1

wlo1 является беспроводным устройством

#include <stdio.h>
#include <pcap.h>

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

    char *dev; //device automatically detected for sniffing
    char errbuf[PCAP_ERRBUF_SIZE]; //error string
    pcap_t *handle; //session hnadle
    struct bpf_program fp;  //The compiled filter expression
    char filter_exp[] = "port 23";  //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;
    const unsigned char *packet;

    //device detection block
    dev = pcap_lookupdev(errbuf);
    if (dev == NULL){
            printf("Error finding device: %s\n", errbuf);
            return 1;
        }
    printf("Network device found: %s\n", dev);

    //opening device for sniffing
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
    if(handle == NULL){
        fprintf(stderr,"Couldn't open device %s : %s\n",dev,errbuf);
        return 1;
    }

    // //check for link-layer header of the device
    if(pcap_datalink(handle) != DLT_EN10MB){ //for ethernet data link layer
        if(pcap_datalink(handle) != DLT_IEEE802_11){ //for wlan data link layer
            fprintf(stderr, "Device %s doesn't provide WLAN headers - not supported\n", dev);
            return 1;
        }
        else{
            fprintf(stderr, "Device %s doesn't provide Ethernet headers - not supported\n", dev);
            return 1;
        }
    }

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

    //block for filtering traffic we want to sniff
    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 1;
    }
    if(pcap_setfilter(handle, &fp) == -1) {
        fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
        return 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;
}

1 Ответ

1 голос
/ 03 октября 2019

Если wlo1 захватывает в режиме мониторинга в «защищенной» сети (сеть с трафиком, зашифрованным на канальном уровне, используя WEP или WPA / WPA2 / WPA3), тогда любой фильтр, работающий над канальным уровнем - такойтак как фильтр уровня TCP / UDP, который является «портом 80», не будет работать, потому что пакеты, доставленные в код фильтрации, будут зашифрованы с полезной нагрузкой 802.11, поэтому фильтры на них работать не будут.

Следовательно, ни один пакет не пройдет фильтр.

...