Openwrt WIFI探針開發【一】

2017.9.26
公開源碼(Apache2.0協議)git

https://github.com/769484623/WiFiProbegithub

—————————————————————————————————————————————————————網絡

在學校斷斷續續作了一年多的Openwrt WIFI探針,從剛開始磕磕絆絆,國內幾乎沒有公開的資料的狀況下入手到最後可以較完整獲得幾乎全部須要的數據,期間確實是很辛勞。
我選用的方案是:函數

PCAP庫
RADIOTAP解析庫oop

PCAP庫做用爲將WIFI模式切換爲監聽模式同時進行抓包原始數據獲取。
RADIOTAP庫做用爲獲得RSSI、頻率等比較底層的信息,同時進行一些錯誤數據的拋棄。ui

下面開始講解PCAP庫的使用。spa

在本機安裝PCAP並完成Makefile編寫

安裝這個很少說了,直接在Openwrt上獲取並安裝PCAP也是能夠的,或者選擇像我同樣在交叉編譯過程當中在gcc 最後加上 -static 靜態鏈接上。
下面是我使用的解決方法:code

$(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%。
下面爲調用函數的原型。get

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

packet這個就是獲取到的數據。具體分析方法後面會具體說明。

相關文章
相關標籤/搜索