我使用如下的 libpcap 过滤器在(Linux ubuntu、c、监控模式)中捕获了信标文件
char *filter = "wlan type mgt subtype beacon";
pcap_compile(pcd,&bpg,filter,-1,PCAP_NETMASK_UNKNOWN);
pcap_setfilter(pcd, &bpg);
我捕获了信标帧,但它包含 radiotap header 。 (pcak 数据链路返回 IEEE_802_11_RADIO)
但我只想将信标帧(删除 radiotap header )保存到 pcap 文件。 但我在函数 pcap_dump() 中找不到此类选项
有什么方法可以保存数据包的选择性部分(删除 radiotap 部分)吗? 或者是否有任何过滤选项可以帮助我在没有 radiotap 的情况下只获得信标帧??
最佳答案
Is there any method to save selective parts(remove radiotap part) of packet??
是的。
首先,如果您正在写入 pcap 文件(我假设您正在这样做,正如您提到的 pcap_dump()
),请不要使用 pcap_t
当你打开 Wi-Fi 适配器作为 pcap_dump_open()
的参数时你得到了,因为您不会将带有 radiotap header 的数据包写入 pcap 文件,并传递 pcap_t
当你打开 Wi-Fi 适配器作为 pcap_dump_open()
的参数时你得到了将意味着文件的链路层 header 类型将为 DLT_IEEE802_11_RADIO
,这意味着该文件将被其他程序解释为包含带有 radiotap header 的数据包。
相反,使用 pcap_open_dead()
制造假货 pcap_t
,并使用 DLT_IEEE802_11
作为其链路层报头类型,并在 pcap_dump_open()
中使用 that打电话。
然后,对于每个数据包:
首先,确保“网络长度”(数据包的 len
的 struct pcap_pkthdr
字段,由 libpcap 提供给您的程序) >= 4 字节,如果不是,拒绝数据包。这意味着数据包的长度不足以包含完整的 radiotap header ,这可能意味着驱动程序中存在错误。
然后,确保“捕获的数据长度”(数据包的caplen
的struct pcap_pkthdr
字段,由 libpcap 提供给您的程序)>= 4 字节,如果不是,则拒绝该数据包.这意味着没有足够的捕获数据用于完整的 radiotap header ,这可能意味着您的程序指定的快照长度太短。
然后获取 it_len
来自 radiotap header 的字段在数据包的开头。请注意,它是小端,而不是大端,因此您不需要在小端处理器(例如 32 位和 64 位 x86 处理器)上对其进行字节交换,而您确实 需要在大端处理器(例如运行 Linux 时的 PowerPC)上对其进行字节交换。
然后检查以确保 len
和 caplen
struct pcap_pkthdr
的字段对于数据包都是 >= it_len
值(value)。
然后复制struct pcap_pkthdr
将数据包发送到单独的 struct pcap_pkthdr
变量,减去 it_len
来自那个单独的struct pcap_pkthdr
变量的 len
和 caplen
变量,得到一个指向it_len
的指针超过数据包开头的字节,并传递该指针和指向 struct pcap_pkthdr
的指针您从中减去的变量 it_len
来自 len
和 caplen
值,到 pcap_dump()
.
关于c - libpcap,将我的数据包的选择性区域保存到 pcap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20302713/