15

我一直在研究一种让 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 个字节addr2位于 802.11 帧中(同样,请参见此处的第 17 页)。

4

4 回答 4

3

谷歌搜索“802.11 帧格式”提供了一些我相信的有希望的链接。以下是对数据包进行布局的高级概述:http ://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml 。

于 2013-05-29T04:55:13.940 回答
2

如果您使用的是 pylibpcap,那么您可以通过这种方式获取 RSSI。这是粗略的,并对 802.11 帧中的标志做出假设(即标志必须是 0x0000482F),但它对我有用。这是一个 python hack,dpktscapyhack 只是对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])

如果您的标志与上述不同,请查看radiotap-parser.cOP 的问题,并找出如何计算 RSSI 字段的偏移量(本例中为 22)。每个标志位将偏移量更改 1、2、4 或 8 个字节。

于 2014-01-30T00:03:09.637 回答
1

我知道这篇文章很旧,但我在尝试进行 wifi 解析时遇到了它,所以我希望我能帮助别人!

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

于 2016-02-04T02:23:19.237 回答
-1

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

于 2013-10-16T04:37:38.270 回答