c - libpcap 捕获的信标帧有些奇怪

标签 c linux libpcap wifi

我用库 libpcap(Ubuntu, c) 捕获了信标帧

我将 wlan 模式更改为通过以下函数调用进行监控和捕获

// 3000 is large enough number for test
pcd = pcap_open_live(dev,3000,PROMISCUOUS,-1,errbuf)  
// filter with "wlan type mgt subtype beacon"    
pcap_compile(pcd,&bpg,"wlan type mgt subtype beacon",1,PCAP_NETMASK_UNKNOWN)
pcap_setfilter(pcd, &bpg)

下面是packet_view

void packet_view(
    unsigned char *user,
    const struct pcap_pkthdr *h,
    const unsigned char *p
){
    int len;
    len = 0;

    printf("PACKET\n");
    while(len < h->len) {
        printf("%02x ", *(p++));
        if(!(++len % 16))
            printf("\n");
    }
    printf("\n");
    return ;
}

我得到了以下结果(只有最重要的 32 位)

00 00 12 00 2e 48 00 00 00 02 6c 09 a0 00 bb 01 
00 00 80 00 00 00 ff ff ff ff ff ff 00 08 9f bf 

但是...实际上信标帧必须以位“08”开头 因为信标帧的协议(protocol)版本 = 00 类型 = 00 和子类型 = 1000 => 00001000(08)

我收到以 00 开头的数据包的原因是什么?虽然我用“wlan type mgt subtype beacon”过滤了??

最佳答案

您缺少一个 pcap 调用 - 对 pcap_datalink() 的调用。

除非 pcap_datalink() 返回 DLT_IEEE802_11,否则数据包不是以 802.11 header 开头。例如,如果它返回 DLT_IEEE802_11_RADIO,则数据包以 radiotap header 开头。 , 后面有一个 802.11 header ;这看起来像你的包裹里的东西。

参见 the tcpdump.org link-layer header types page有关 pcap_datalink() 可以返回的值以及出现在 pcap 和 pcap-ng 文件中的值的信息。

关于c - libpcap 捕获的信标帧有些奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290385/

相关文章:

linux - 当我执行 bash 时,$PATH 不断重复

linux - 如何从独立的 GNU screen session 中邮寄命令的输出?

c - 我该如何执行此 if else 语句?

c++ - select(NULL, NULL, NULL, &timeout) 只是等待给定的时间吗?

linux - 如何检查 Alpine docker 容器中是否安装了 libpcap

我可以使用 pcap 库来接收 ipv6 数据包吗?

c - libpcap 从 AF_LINK sockaddr_dl (OSX) 获取 MAC

c - 字符串初始化的 gcc 诊断不一致

c - Arduino 程序资源不足

C - 从最后一行读取文件问题