我一直在研究一种让 OpenWRT 路由器将 WiFi 探测请求记录到 MySQL 数据库的方法(它存储每个探测请求数据包的 MAC 地址和 RSSI 信息以及其他特定于路由器的数据)。
在对 libpcap 进行了大量研究之后,我已经能够拼凑出一个基本的小程序,该程序使用过滤器表达式('wlan subtype probe-req')简单地嗅探监视器接口(interface)(mon0)上的数据包,然后打印出来十六进制的原始数据包。根据 libpcap 上在线提供的信息,这部分非常简单。
现在我遇到了困难:如何解析 WiFi 数据包以检索我要查找的信息(RSSI 和源 MAC 地址)?
需要说明的是,我并不是要代码来执行此操作(尽管如果您愿意提供一些代码,我不会提示 :D)。我只是在寻找某种指南,以了解哪个字节是哪个字节 - WiFi 数据包路线图,如果您愿意的话。
有一些很好的教程可以解析通过以太网传入的数据包,但我还没有找到任何有助于解析与 WiFi 特别相关的 header 的内容。我认为这将是一个非常简单的过程 - 只需获取 RSSI 和源 MAC 的相关字节 - 但同样,我无法找到任何关于哪个字节是哪个字节的文档。
我知道以前有人这样做过,但老实说:在查看 tcpdump 的源代码时,我完全迷失了。
那么,有人知道如何解析 WiFi 数据包的好资源吗?
干杯
编辑:更具体的答案
RSSI 位于 RadioTap header 中(好吧,在 Linux 上就是这样)。使用 radiotap-parser.c 从数据包中提取 RSSI 非常简单以及它所依赖的文件(与我链接到的文件位于同一目录中)。 如果有人在使用 radiotap-parser.c 函数时遇到问题,请随时与我们联系。
通过 radiotap 函数提取源 MAC 地址变得非常容易,因为 radiotap header 结构包含 radiotap header 的长度 (it_len
),这是可变的。因为我只解析具有固定长度的探测请求(查看第 17 页 here),所以只需创建一个指向 packet + it_len + 10
(源 MAC 地址)的指针在 MAC 帧开始后 10 个字节开始,它从 radiotap 报头结束的地方开始)。从该指针开始的 6 个字节是 802.11 帧中的 addr2
(再次参见第 17 页 here)。
最佳答案
Google 搜索“802.11 帧格式”提供了一些我认为有希望的链接。这是对数据包进行布局的高级概述: https://www.technologyuk.net/telecommunications/computer-networks/wireless-networks.shtml
关于c - 解析 WiFi 数据包 (libpcap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16801270/