我一直在研究如何使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页),所以只需创建一个指向 packet + it_len + 10
的指针即可(源MAC地址从MAC帧开始的10个字节之后开始,该帧始于radiotap头结束处)。从指针开始的6个字节是802.11帧中的addr2
。(同样,请参见此处的第17页)