Openwrt WIFI探针开发

2017.9.26 

公开源码(Apache2.0协议)


https://github.com/769484623/WiFiProbe


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


在学校断断续续做了一年多的Openwrt WIFI探针,从刚开始磕磕绊绊,国内几乎没有公开的资料的情况下入手到最后能够较完整得到几乎所有需要的数据,期间确实是很辛劳。 

我选用的方案是:


PCAP库 

RADIOTAP解析库


PCAP库作用为将WIFI模式切换为监听模式同时进行抓包原始数据获取。 

RADIOTAP库作用为得到RSSI、频率等比较底层的信息,同时进行一些错误数据的抛弃。


下面开始讲解PCAP库的使用。


在本机安装PCAP并完成Makefile编写

安装这个不多说了,直接在Openwrt上获取并安装PCAP也是可以的,或者选择像我一样在交叉编译过程中在gcc 最后加上 -static 静态连接上。 

下面是我使用的解决方法:


$(CC) $(LDFLAGS) XX.o -o XX -lpcap -static

1

关于Openwrt Makefile的编写与对应IPK的生成,网络上有很多说明,不再赘述。


PCAP的使用

    char errbuff[PCAP_ERRBUF_SIZE];
    pcap_t *device = pcap_open_live(argv[1], 8000, 1, 0, errbuff);//(1)
    if (!device)
    {
        printf("error: pcap_open_live(): %s\n", errbuff);
        exit(1);
    }
    if (pcap_set_rfmon(device, 1) == 0)//(2)
    {
        printf("can't enter rfmode\n");
        exit(1);
    }
    printf("Scaning starts\n");
    pcap_loop(device, -1, getPacket, &i); //Scaning starts//(3)
    pcap_close(device);

PS: 

(1)argv[1]为网卡名字,如wlan0这样。8000为获取数据大小,1这里将网卡设置为混杂模式,0为无超时等待,errbuf意义如名字。 

(2)pcap_set_rfmon,这个是将网卡设置为监听模式的函数,省去了调用iw 等系统程序的调用。 

(3)pcap_loop,获取到了数据之后便调用getPacket函数。 getPacket函数应该简洁,并尽可能短 ,我工程实现中使用队列(可存32帧)来存储待分析的数据,发现队列基本一直处于满或者快满的状态,说明底层传上来的数据速度比分析速度快,同时观测发现系统占用60%的CPU,Usr占用只有区区18%。 

下面为调用函数的原型。


void getPacket(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet);


packet这个就是获取到的数据。具体分析方法后面会具体说明。



前文我们已经使用了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或为正的,都需要将该帧抛弃。

--------------------- 

作者:Similar_Fair 

来源:CSDN 

原文:https://blog.csdn.net/sunhaobo1996/article/details/72598028 

版权声明:本文为博主原创文章,转载请附上博文链接!


已有1位网友发表了看法:

发表评论:

◎欢迎参与讨论,请在这儿发表您的观点。

«   2019年10月   »
123456
78910111213
14151617181920
21222324252627
28293031
about关于我

root.wang&老王SEO

邮箱:8#ie3.cn

微博:weibo.com/mldh

lofter

PHP攻城师

SEO攻城师

python爱好者

数据挖掘爱好者

智能硬件爱好者

摄影爱好者

网站分类
搜索
文章归档
友情链接