1

研究の問題のために、Macでモニターモードでパケットをキャプチャしようとしています。これらのパケットから、rssiなどの特別な情報が必要です。残念ながら、リンクタイプにはDLT_IEEE802_11_RADIOと記載されていますが、モニターモードをオンにする必要があるため、実際にはDLT_PRISM_HEADERを期待しています。radiotapヘッダーはRSSI値やその他の必要なものを提供しないため、これは問題です。

これが私のコードです(コールバックメソッドなどは省略しています):

int main(int argc, char *argv[])
{
pcap_t *handle; /* Session handle */
char *dev;  /* The device to sniff on */
char errbuf[PCAP_ERRBUF_SIZE];  /* Error string */
struct pcap_pkthdr header;  /* The header that pcap gives us */
const u_char *packet;   /* The actual packet */
struct ether_header *ether;  /* net/ethernet.h */

/* Define the device */
dev = pcap_lookupdev(errbuf);
if(dev == NULL) {
    printf("Couldn't find default device: %s\n", errbuf);
    exit(EXIT_FAILURE);
}
printf("Device: %s\n", dev);

//handle = pcap_open_live(dev, 1562, 1, 500, errbuf);
handle = pcap_create(dev, errbuf);
if(handle == NULL) {
    printf("pcap_create failed: %s\n", errbuf);
    exit(EXIT_FAILURE);
}

/* set monitor mode on */
if(pcap_set_rfmon(handle, 1) != 0) {
    printf("monitor mode not available\n");
    exit(EXIT_FAILURE);
}
pcap_set_snaplen(handle, 2048);  // Set the snapshot length to 2048
pcap_set_promisc(handle, 1); // Turn promiscuous mode on
pcap_set_timeout(handle, 512); // Set the timeout to 512 milliseconds

int status = pcap_activate(handle);
if(status != 0) {
    printf("activation failed: %d\n", status);
}

printf("link-type: %s\n", pcap_datalink_val_to_name(pcap_datalink(handle)));

int loop = pcap_loop(handle, 1, process_packet, NULL);
if(loop != 0) {
    printf("loop terminated before exhaustion: %d\n", loop);
}

/* And close the session */
pcap_close(handle);

return(0);
}

それで、なぜ私がプリズムではなくラジオタップを受信して​​いるのか、そして代わりにどのようにすべきかを誰かが知っていますか?繰り返しますが、私はOSXでコーディングしています。

4

1 に答える 1

0

これらのパケットから、rssi などの特別な情報が必要です。

次に、ドライバーが radiotap ヘッダーではなく PPI ヘッダーを要求できるようにしない限り、呼び出し後pcap_list_datalinks() にモニター モードで使用し、pcap_activate() DLT_PPI が含まれている場合は、リンク層ヘッダー タイプを DLT_PPI に設定しpcap_set_datalink()ます。PPI ヘッダーを要求できる場合は、そのヘッダーから RSSI 値を取得できる可能性があります。PPI 仕様を参照してください。

残念ながら、linktype には DLT_IEEE802_11_RADIO と表示されていますが、モニター モードをオンにする必要があるため、実際には DLT_PRISM_HEADER が必要です。

任意の Wi-Fi デバイスとドライバーを備えた任意のオペレーティング システムで、監視モードで Prism ヘッダーを取得できると期待する理由はまったくありません。無線情報を取得する場合は、ドライバー ライターが提供する任意のヘッダーを取得します。最近では、ドライバーは radiotap を使用する傾向があります - Linux mac80211 ドライバー、ほとんどの *BSD ドライバー、および OS X ドライバーが使用します。

于 2012-10-19T19:31:02.527 に答える