我通过使用libpcap过滤器捕获了信标文件(Linux ubuntu,c,监视器模式(,
如下所示char *filter = "wlan type mgt subtype beacon";
pcap_compile(pcd,&bpg,filter,-1,PCAP_NETMASK_UNKNOWN);
pcap_setfilter(pcd, &bpg);
我捕获了信标框架,但它包括无线电窃听标头。(PCAK 数据链返回IEEE_802_11_RADIO(
但我只想将信标帧(删除 radiotap 标头(保存到 pcap 文件。但是我在函数 pcap_dump(( 中找不到这样的选项
有没有办法保存数据包的选择性部分(删除无线电抽头部分(?或者是否有任何过滤选项可以帮助我只获得没有无线电点击的信标帧?
有没有办法保存数据包的选择性部分(删除无线电抽头部分(?
是的。
首先,如果您正在写入 pcap 文件(我假设您正在这样做,正如您pcap_dump()
提到的(,请不要使用打开 Wi-Fi 适配器时获得的pcap_t
作为pcap_dump_open()
的参数,因为您不会将带有 radiotap 标头的数据包写入 pcap 文件,并将打开 Wi-Fi 适配器时获得的pcap_t
作为参数传递给 pcap_dump_open()
将意味着文件的链路层标头类型将是DLT_IEEE802_11_RADIO
,这意味着该文件将被其他程序解释为具有带有Radiotap标头的数据包。
相反,使用 pcap_open_dead()
创建一个假pcap_t
,并使用 DLT_IEEE802_11
作为其链接层标头类型,并在pcap_dump_open()
调用中使用它。
然后,对于每个数据包:
首先,确保"网络长度"(数据包struct pcap_pkthdr
的len
字段,由 libpcap 提供给程序(为>= 4 个字节,如果不是,则拒绝数据包。 这意味着数据包不够长,无法具有完整的radiotap标头,这可能意味着驱动程序中存在错误。
然后,确保"捕获的数据长度"(数据包struct pcap_pkthdr
的caplen
字段,由 libpcap 提供给程序(为>= 4 个字节,如果不是,则拒绝数据包。 这意味着没有足够的捕获数据用于完整的radiotap标头,这可能意味着您的程序指定的快照长度太短。
然后从数据包开头的 radiotap 标头中获取it_len
字段。 请注意,它是小端序,而不是大端序,因此您不需要在小端序处理器(例如 32 位和 64 位 x86 处理器(上对其进行字节交换,并且您确实需要在大端处理器(例如运行 Linux 时的 PowerPC(上对其进行字节交换。
然后检查以确保数据包struct pcap_pkthdr
的len
和caplen
字段均为>=it_len
值。
然后将数据包的struct pcap_pkthdr
复制到单独的struct pcap_pkthdr
变量,从该单独的struct pcap_pkthdr
变量的len
中减去it_len
并caplen
变量,获取一个指针,该指针指向数据包开头的it_len
字节,并传递该指针,以及指向从len
值中减去it_len
的struct pcap_pkthdr
变量的指针,并caplen
值, 到pcap_dump()
.