我一直在研究如何让一个OpenWRT路由器记录WiFi探测请求到MySQL数据库(它存储每个探测请求数据包的MAC地址和RSSI信息以及其他特定于路由器的数据)。
在研究了libpcap之后,我已经能够拼凑出一个基本的小程序,只需使用过滤器表达式('wlan subtype probe-req')在监视器接口(mon0)上嗅探数据包然后打印出来十六进制的原始数据包。有了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页here),因此只需要指向packet + it_len + 10
的指针(源MAC地址在此后的10个字节后开始) MAC帧的开头,从radiotap标题结束的地方开始)。从该指针开始的6个字节在802.11帧中为addr2
(同样,请参见第17页here)。
答案 0 :(得分:2)
谷歌搜索“802.11帧格式”提供了一些我认为有希望的链接。以下是一个高级概述,其中列出了数据包:http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml。
答案 1 :(得分:2)
如果您正在使用pylibpcap,那么您可以通过这种方式获取RSSI。这是粗略的,并假设802.11帧中的标志(即标志必须是0x0000482F),但它对我有用。这是一个python hack,我不想沿着安装额外模块的路线前进(dpkt
和scapy
具有执行此操作的功能,但没有详细记录)当hack只是一个调用时到struct.unpack
。
(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个字节。
答案 2 :(得分:1)
我知道这篇文章很老但是我遇到它试图做无线解析没有运气所以我希望我能帮助别人!
有一个相对较新的库,但它对于所有级别的堆栈都是惊人的。它被称为libTins并将为您解析堆栈的每一层的数据包。它的BSD获得许可(截至2015年)并且非常容易进行嗅探。它建立在lib pcap之上,但如果你想自己嗅探,它会接受字节数组。
答案 3 :(得分:-1)
您可以使用模块tshark来检索特定字段。