C语言 解析WiFi数据包(libpcap)



我一直在研究一种方法,让OpenWRT路由器将WiFi探测请求记录到MySQL数据库(它为每个探测请求包存储MAC地址和RSSI信息以及其他特定于路由器的数据)。

在对libpcap进行了相当多的研究之后,我已经能够拼凑出一个基本的小程序,它可以使用过滤器表达式('wlan subtype probe-req')在监视器接口(mon0)上嗅闻数据包,然后以十六进制输出原始数据包。有了libpcap上的在线信息,这部分就相当简单了。

现在这里是我卡住的地方:我如何解析WiFi数据包以检索我正在寻找的信息(RSSI和源MAC地址)?

要清楚,我不是要求代码来做这件事(尽管如果你愿意提供一些,我也不会抱怨:D)。我只是想找一些能帮助我理解字节的指南——如果你愿意的话,可以找一个WiFi数据包路线图。

有一些很好的教程在那里解析数据包进来的以太网,但我还没有能够找到任何东西来帮助解析报头特别与WiFi相关。我认为这将是一个相当简单的过程-只是为RSSI和源MAC抓取相关字节-但是,我还没有找到任何关于哪个字节是哪个的文档。

我知道这已经做过了,但我要诚实:我完全迷失了,当通过tcpdump的源代码看。

那么,有人知道如何解析WiFi数据包的好资源吗?

欢呼

EDIT: More Specific Answer

RSSI在RadioTap标头中找到(在Linux上是这样)。使用radiotap-parser.c及其所依赖的文件(在与我链接到的文件相同的目录中找到)将RSSI从数据包中提取出来是相当简单的。如果有人在使用radiotap-parser.c函数时遇到麻烦,请随时与我们联系。

通过radiotap函数提取源MAC地址非常容易,因为radiotap头结构包含radiotap头(it_len)的长度,这是可变的。因为我只解析探针请求,它有一个固定的长度(查看这里的第17页),这只是一个问题,使一个指针指向packet + it_len + 10(源MAC地址开始MAC帧开始后10个字节,它开始在无线电标头结束)。从该指针开始的6个字节是802.11帧中的addr2(再次,参见此处的第17页)。

谷歌搜索" 802.11帧格式";提供了一些有希望的链接,我相信。以下是对数据包的高级概述:https://www.technologyuk.net/telecommunications/computer-networks/wireless-networks.shtml

如果您正在使用pylibpcap,那么您可以通过这种方式获取RSSI。这是粗糙的,并且对802.11帧中的标志进行了假设(即标志必须是0x0000482F),但它对我有效。这是一个python hack,我不想沿着安装额外模块的路线(dpktscapy有这样做的功能,但没有很好地记录),当黑客只是一个调用struct.unpack

(len,data,timestamp) = p.get_next()
if data[0:8] =='x00x00x22x00x2Fx48x00x00' 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个字节。

我知道这篇文章是旧的,但我遇到它试图做wifi解析没有运气,所以我希望我可能能够帮助别人!

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

您可以使用模块tshark,在那里您可以检索特定的字段

最新更新