Openwrt WIFI探针开发【一】
2017.9.26
公开源码(Apache2.0协议)
—————————————————————————————————————————————————————
在学校断断续续做了一年多的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这个就是获取到的数据。具体分析方法后面会具体说明。