解析WiFi数据包(libpcap)

16

我一直在研究如何使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页)

radiotap-parser.c 的链接已经损坏。 - haccks
4个回答

3

谢谢你的链接,Mike,这帮了我很多。我之前没有考虑到在我的搜索字符串中使用“帧格式”,但一旦我这样做了,我就找到了一条更加有用的路径。 - Kyle G.
我觉得只提供一个谷歌搜索结果作为答案有些不好,但我希望我的搜索词比你之前尝试的更有用。很高兴它起作用了 :) - Mike Pelley
另一个链接是到IEEE Get程序中的802.11页面,您可以从中检索官方的802.11标准。 - user862787
没问题,Mike。结果正是我所需要的。@Guy,我实际上有一个保存的802.11标准PDF文件,它确实为我澄清了一些事情,但我必须承认,我在浏览所有这些信息时有点迷失了。不过还是谢谢你提供的链接,希望其他人看到这个也会觉得有用 :) - Kyle G.
链接似乎无法访问。 - Sri Balaji S

2
如果您正在使用pylibpcap,则可以通过以下方式获取RSSI。这种方法很粗糙,并假设802.11帧中的标志必须为0x0000482F,但对我有效。这是一个Python技巧,我不想走额外安装模块的路线(dpkt和scapy有此功能,但文档不太好),因为这个技巧只需要调用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个字节。

1
我知道这篇文章有些旧了,但是我碰巧在尝试进行wifi解析时遇到了它,但是没有成功,所以我希望我能帮助其他人!有一个相对较新的库,非常适合各个级别的堆栈。它叫做libTins,可以为您解析堆栈的每一层数据包。它的BSD许可证(截至2015年)非常容易进行嗅探。它是建立在lib pcap之上的,但如果您想自己进行嗅探,它也会接受字节数组。

-1

你可以使用tshark模块,从中检索特定字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接