2013-05-28 151 views
14

我一直在努力让OpenWRT路由器将一个WiFi探测请求记录到MySQL数据库(它为每个探测请求数据包存储MAC地址和RSSI信息以及其他特定路由器数据)。解析WiFi数据包(libpcap)

在研究了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头结构包含可变的无线头标头(it_len)的长度,所以通过无线功能块功能可以非常轻松地拉出源MAC地址。由于我仅解析具有固定长度的探测请求(请查看第here),因此只需将指针指向packet + it_len + 10(源MAC地址在MAC帧开始后10个字节开始,即开始无线电广播标头在哪里结束)。在该指针处开始的6个字节是802.11帧中的addr2(同样,请参阅第17页here)。

+0

radiotap-parser.c链接已损坏。 – haccks

回答

2

谷歌搜索“802.11帧格式”提供了一些有希望的链接,我相信。以下是一个高层概述,其中列出了数据包:http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml

+0

感谢您的链接,迈克,这帮助了很多。我没有考虑在搜索字符串中使用“帧格式”,但是一旦我完成了,我的结果就变得更有用了。 –

+0

我觉得糟糕,提供Google搜索作为答案,但我希望我的搜索条件会比以前尝试的更有用。很高兴它成功了:) –

+0

另一个链接是[IEEE获取程序中的802.11页面](http://standards.ieee.org/about/get/802/802.11.html),您可以从中检索官方的802.11标准。 – 2013-05-29 19:35:23

-1

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

2

如果您使用的是pylibpcap,那么您可以通过这种方式获取RSSI。这是粗糙的,并对802.11帧中的标志进行了假设(即标志必须为0x0000482F),但它对我很有用。这是一个python黑客,我不想沿着安装额外模块的路线(dpktscapy有功能做到这一点,但没有很好的文档),当黑客只是一个电话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,并找出如何计算(在这个例子中22)的偏移量RSSI场。每个标志位将偏移量改变1,2,4或8个字节。

1

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

有一个相对较新的图书馆,但它的惊人的所有层次的堆栈。它被称为libTins,并且会为您解析堆栈中每一层的数据包。它的BSD许可(截至2015年),并且非常容易做嗅探。它建立在lib pcap之上,但如果你想自己嗅探,它将接受字节数组。