c - libpcap,将我的数据包的选择性区域保存到 pcap 文件

标签 c pcap libpcap wifi

我使用如下的 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打电话。

然后,对于每个数据包:

首先,确保“网络长度”(数据包的 lenstruct pcap_pkthdr 字段,由 libpcap 提供给您的程序) >= 4 字节,如果不是,拒绝数据包。这意味着数据包的长度不足以包含完整的 radiotap header ,这可能意味着驱动程序中存在错误。

然后,确保“捕获的数据长度”(数据包的caplenstruct pcap_pkthdr 字段,由 libpcap 提供给您的程序)>= 4 字节,如果不是,则拒绝该数据包.这意味着没有足够的捕获数据用于完整的 radiotap header ,这可能意味着您的程序指定的快照长度太短。

然后获取 it_len来自 radiotap header 的字段在数据包的开头。请注意,它是小端,而不是大端,因此您不需要在小端处理器(例如 32 位和 64 位 x86 处理器)上对其进行字节交换,而您确实 需要在大端处理器(例如运行 Linux 时的 PowerPC)上对其进行字节交换。

然后检查以确保 lencaplen struct pcap_pkthdr 的字段对于数据包都是 >= it_len值(value)。

然后复制struct pcap_pkthdr将数据包发送到单独的 struct pcap_pkthdr变量,减去 it_len来自那个单独的struct pcap_pkthdr变量的 lencaplen变量,得到一个指向it_len的指针超过数据包开头的字节,并传递该指针和指向 struct pcap_pkthdr 的指针您从中减去的变量 it_len来自 lencaplen值,到 pcap_dump() .

关于c - libpcap,将我的数据包的选择性区域保存到 pcap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20302713/

相关文章:

c - 乌类图 : Permissions for C program built in Eclispse

hadoop - pcap 到 Hadoop 上的 Avro

docker - 如何在docker容器中使用主机的pcap?

java - android使用pcap库

linux - 从 pcap_findalldevs() 过滤网络设备

c++ - 在 https 协议(protocol)的情况下,是否可以使用 libpcap 查看 header /数据包中的内容

c - 交换存储在字符数组 C 中的两个字符串

c - 我应该为 C 使用什么图形库

c - 什么是 "better": (x=x) or (void(x)) for unused parameters?

linux - YAF 因错误而终止(无法创建连接的 TCP 套接字)