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這個就是獲取到的數據。具體分析方法后面會具體說明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM