解析WiFi数据包(libpcap)

我一直在研究如何让一个OpenWRT路由器记录WiFi探测请求到MySQL数据库(它存储每个探测请求数据包的MAC地址和RSSI信息以及其他特定于路由器的数据)。

在研究了libpcap之后,我已经能够拼凑出一个基本的小程序,只需使用filter表达式(’wlan subtype probe-req’)在监视器接口(mon0)上嗅探数据包,然后输出原始数据包hex 有了libpcap在线提供的信息,这部分相当简单。

现在这里我被困住了: 如何解析WiFi数据包以检索我正在寻找的信息(RSSI和源MAC地址)?

要说清楚,我不是要求代码去做(虽然我不会抱怨,如果你想提供一些:D)。 我只是在寻找某种指导来理解哪个字节是哪个 – 如果你愿意的话,那就是WiFi数据包路线图。

有一些很好的教程可以解析通过以太网进入的数据包,但是我无法找到任何可以帮助解析与WiFi特定相关的标头。 我假设它将是一个非常简单的过程 – 只需抓取RSSI和源MAC的相关字节 – 但同样,我还没有找到任何关于哪个字节的文档。

我知道这已经完成了,但我会说实话:在查看tcpdump的源代码时,我完全迷失了。

那么,有没有人知道如何解析WiFi数据包的良好资源?

干杯

编辑:更具体的答案

RSSI位于RadioTap标题中(嗯,在Linux上)。 使用radiotap-parser.c以及它所依赖的文件(在与我链接的文件相同的目录中找到)将RSSI从数据包中拉出是相当简单的。 如果有人在使用radiotap-parser.c时遇到问题,请随时与我们取得联系。

通过radiotap函数拉出源MAC地址非常容易,因为radiotap头结构包含radiotap头( it_len )的长度,它是可变的。 因为我只解析具有固定长度的探测请求( 在这里查看第17页),所以只需要指向指向packet + it_len + 10的指针(源MAC地址在MAC开始后10个字节开始)框架,从radiotap标头结束的地方开始)。 从该指针开始的6个字节是802.11帧中的addr2 (同样,请参见此处的第17页)。

谷歌搜索“802.11帧格式”提供了一些我认为有希望的链接。 这是一个高级概述,列出了数据包: http : //www.technologyuk.net/telecommunications/networks/wireless_networks.shtml 。

如果您正在使用pylibpcap,那么您可以通过这种方式获取RSSI。 这是粗略的,并假设802.11帧中的标志(即标志必须是0x0000482F),但它对我有用。 这是一个python hack,当hack只是对struct.unpack一次调用时,我不想沿着安装额外模块的路径( dpktscapy具有执行此操作的function,但没有详细记录)。

 (len,data,timestamp) = p.get_next() if data[0:8] =='\x00\x00\x22\x00\x2F\x48\x00\x00' and len(data) >= 50: type_subtype = ord(data[34]) dest_mac = data[38:38+6] src_mac = data[44:44+6] rssi, = struct.unpack("b",data[22]) 

如果你的标志不是如上所述,那么在OP的问题中查看radiotap-parser.c ,并弄清楚如何计算RSSI字段的偏移量(本例中为22)。 每个标志位将偏移量改变1,2,4或8个字节。

我知道这篇文章很老但是我遇到它试图做无线解析没有运气所以我希望我能帮助别人!

有一个相对较新的库,但它对于堆栈的所有级别都是惊人的。 它被称为libTins并将为您解析堆栈的每一层的数据包。 它的BSD许可(截至2015年)并且非常容易进行嗅探。 它建立在lib pcap之上,但如果你想自己嗅探,它会接受字节数组。

您可以使用模块tshark来检索特定字段。