解析 WiFi 数据包 (libpcap)
Posted
技术标签:
【中文标题】解析 WiFi 数据包 (libpcap)【英文标题】:Parsing WiFi Packets (libpcap) 【发布时间】:2013-05-23 23:14:45 【问题描述】:我一直致力于让 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 地址在MAC 开头后10 个字节处开始)帧,它开始于 radiotap 报头结束的地方)。从该指针开始的 6 个字节是 802.11 帧中的 addr2
(再次参见第 17 页 here)。
【问题讨论】:
radiotap-parser.c 链接已损坏。 【参考方案1】:Google 搜索“802.11 帧格式”提供了一些我相信的有希望的链接。这是对数据包进行布局的高级概述:http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml。
【讨论】:
感谢您的链接,迈克,这对您有很大帮助。我没有考虑在我的搜索字符串中使用“帧格式”,但是一旦我这样做了,我就走上了一条更有用的道路。 提供 Google 搜索作为答案我感觉很糟糕,但我希望我的搜索词能证明比您之前尝试的更有用。很高兴它解决了:) 另外一个链接是the 802.11 page in the IEEE Get program,你可以从中获取官方的802.11标准。 没问题,迈克,这正是我所需要的。 @Guy,我实际上保存了 802.11 标准的 PDF,它确实为我澄清了一些事情,但我不得不承认,我在浏览所有这些信息时有点迷失了。不过感谢您的链接,希望其他偶然发现它的人也会发现它也很有用:)【参考方案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 个字节。
【讨论】:
【参考方案3】:我知道这篇文章很旧,但我在尝试进行 wifi 解析时遇到了它,但没有运气,所以我希望我能帮助别人!
有一个相对较新的库,但它对于堆栈的所有级别都令人惊叹。它被称为 libTins,它将在堆栈的每一层为您解析数据包。它的 BSD 许可(截至 2015 年)并且非常容易进行嗅探。它建立在 lib pcap 之上,但如果您想自己进行嗅探,它将接受字节数组。
【讨论】:
【参考方案4】:您可以使用模块 tshark 来检索特定字段。
【讨论】:
以上是关于解析 WiFi 数据包 (libpcap)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 libpcap 在原始数据包的 TCP 标头中打印标志