Openwrt WIFI探针开发【二】

来源:互联网 发布:知乎 完颜亮 编辑:程序博客网 时间:2024/05/16 00:43

2017.9.26
公开源码(Apache2.0协议)

https://github.com/769484623/WiFiProbe

—————————————————————————————————————————————————————

前文我们已经使用了PCAP库实现了对原始数据的获取,现在我们来谈谈对原始数据的处理,来得到我们想要的东西。
首先我说下我们获取的数据的结构。
我们获取到的数据是 Radiotap+Mac帧 。Radiotap的长度是变长的,所以想要精确地确定Mac帧开头位置,同时获取到RSSI等信息,我们需要使用Radiotap解析库。

Radiotap

李迟博主这篇对Radiotap的介绍写的很好,链接如下:

http://blog.csdn.net/subfate/article/details/53170546

接下来我们需要注意的就是这个结构:

struct ieee80211_radiotap_header {        u_int8_t        it_version;     /* set to 0 */          u_int8_t        it_pad;          u_int16_t       it_len;         /* entire length */          u_int32_t       it_present;     /* fields present */  };

it_len即为Radiotap的全长。用这个结构体来解析获取原始数据,并跳过it_len,即可到达MAC帧。

MAC帧解析

这个我没有找到具体对应的解析库,但Linux 802_11里面肯定是有的。这里我只提下我自己解析遇到的问题。
我遇到的问题是对控制帧进行解析SSID时遇到的。
由于SSID是变长的,所以我们需要知道SSID_Length。

struct ControlFrame_Body{    uint8_t Timestamp[8];    uint8_t Capability_Info[2];    uint8_t Listen_Interval[2];    uint8_t Element_ID;    uint8_t SSID_Length;};

最开始由于错误的资料,我将Element_ID这个Byte也合到了SSID_Length里面,导致经常会获取错误的SSID。
只有Element_ID为0时,后面的SSID_Length才代表SSID的长度,才代表本帧可以解析出SSID。
当Element_ID为其他值时,后面的有其他含义(如国家等)。

对于其他具体帧的分析,下面的博文会有很大帮助。

http://blog.csdn.net/wuyinghao59/article/details/52171715

就到这里吧,对数据的分析其实没什么难度。

对了,PCAP会把错误的帧也捕捉到,所以需要进行一些数据的清洗。比如无法用Radiotap解析的,解析错误的,RSSI为0或为正的,都需要将该帧抛弃。

原创粉丝点击