Pcap_inject отправляет слишком много сообщений - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь отправить сообщения аутентификации на точку доступа, но когда я это делаю, она отправляет 15 аутентификационных сообщений на точку доступа, в результате чего точка доступа не отвечает.Я использую Mac OS X и библиотеку libpcap.

Вот мой код:

int inject(char *src_mac, char *dst_mac)
{
     int i, rc;
    char *device, *packet;
    char error[PCAP_ERRBUF_SIZE];
    pcap_t *handle;

    device = pcap_lookupdev(error);
    handle = pcap_create(device, error);
    check(device != NULL, "Failed to find a device!");
    check(handle != NULL, "Failed to create handle!");

    rc = pcap_set_rfmon(handle, 1);
    check(rc == 0, "Failed to set monitor mode!");
    rc = pcap_set_promisc(handle, 1);
    check(rc == 0, "Failed to set promiscuous mode!");
    rc = pcap_activate(handle);
    check(rc == 0, "Failed to activate handle!");
    rc = pcap_datalink(handle);
    check(rc == DLT_IEEE802_11_RADIO, "Failed to use the correct format!");

    packet = radiotap_setup(src_mac, dst_mac,\
                        dst_mac, 0xb0);
    rc = pcap_inject(handle, packet,\
            RADIO_LEN + sizeof(ieee80211_hdr));
    check(rc != -1, "Failed to send packet!");

    pcap_close(handle);
    return 1;

   error:
    pcap_close(handle);
    return -1;
}

char *radiotap_setup(char *dst_mac, char *src_mac, char *bssid_mac, int fc)
{
    int i, radio_len;
    unsigned int shost_mac[6], dhost_mac[6], bhost_mac[6];
     static char packet[RADIO_LEN + sizeof(ieee80211_hdr)];
    ieee80211_hdr ieeeh;

    ieeeh.fc = fc;
     ieeeh.dur = 314;
     sscanf(src_mac, "%x:%x:%x:%x:%x:%x", &shost_mac[0], &shost_mac[1],\
          &shost_mac[2], &shost_mac[3], &shost_mac[4], &shost_mac[5]);
     sscanf(dst_mac, "%x:%x:%x:%x:%x:%x", &dhost_mac[0], &dhost_mac[1],\
          &dhost_mac[2], &dhost_mac[3], &dhost_mac[4], &dhost_mac[5]);
    sscanf(bssid_mac, "%x:%x:%x:%x:%x:%x", &bhost_mac[0], &bhost_mac[1],\
          &bhost_mac[2], &bhost_mac[3], &bhost_mac[4], &bhost_mac[5]);

    for (i = 0; i != 6; i++) {
        ieeeh.src[i] = (unsigned char)shost_mac[i];
        ieeeh.dest[i] = (unsigned char)dhost_mac[i];
        ieeeh.bssid[i] = (unsigned char)bhost_mac[i];
    }
    ieeeh.seq = rand();
     ieeeh.rc = 1792;

    radio_len = RADIO_LEN;
    memcpy(&packet[2], &radio_len, 2);
    memcpy(packet + RADIO_LEN, &ieeeh,\
          sizeof(ieee80211_hdr));

     return packet;
}

Когда я выполняю код, я получаю это на Wireshark: Вывод Wireshark

...