如今的手機,電腦,平板等若是要鏈接無線路由器比較方便,直接掃描無線wifi,輸入密碼就能夠了。但是如今智能家居愈來愈多,若是遇到一個攝像頭,智能插座這種沒輸入設備又沒顯示屏的東西,想讓它鏈接無線路由器可就不是很容易的事了。網絡
考慮到手機發送的數據包數據內容都會被加密,並且設備又不具有解密功能,因此沒法直接與設備通訊。可是IP地址是不會被加密的,因此咱們能夠利用本地管理組播地址239.0.0.0~239.255.255.255爲運載體,將信息編碼到地址內部,一次發送兩個字節。那麼若是咱們把須要發送的數據編碼,而後再寫到IP地址相似239.X.A.B,X做爲一個識別標識,A,B做爲實際數據,另外發送數據時會將實際發送的長度也發送出去,那麼長度咱們能夠做爲A,B兩個字節所在buffer中的索引,而實際發送內容因爲對咱們沒用因此咱們填空。此時發送數據,設備開啓監聽模式,若是抓到相似這樣的IP地址的包,此時無論實際收到的數據只從IP地址中拿到數據並重組,理論上就能夠收到咱們須要的數據了。數據結構
發送端僞代碼以下:分佈式
uint8_t d0 = buffer[index]; uint8_t d1 = (index+1)<tot_len?payload[index+1]:0; char destIP[16]; snprintf(destIP, sizeof(destIP), "239.200.%d.%d", d0, d1); send(sock, destIP, index);
理論基礎就是這些,實際要作仍是須要一些細化。其實無線電波所遵循的802.11協議分爲如下三種類幀:ui
1)控制幀:一般與數據幀搭配使用,負責區域的清空(RTS/CTS協議(Request To Send/Clear To Send))、信道的取得、收到數據後確認編碼
2)管理幀:負責監督,用來加入或退出無線網絡以及處理接入點之間關聯的轉移事宜(beacon)加密
3)數據幀:用於傳輸數據。spa
而咱們須要的數據幀,數據幀的標識頭數據結構以下:code
在圖上的數據中,咱們關心的數據有如下幾個:blog
Type與Subtype:制定使用幀類型(控制幀、數據幀、管理幀),而咱們此時關心的是數據幀索引
Address1:幀接收端
Address2:發送端的地址
Address3:供接入點與分佈式系統過濾之用 (即路由器的MAC地址)(這三個地址會根據幀的轉播方向不同排列順序也不同)
ToDs和FromDS表明幀的傳播方向,從中咱們能夠看出,幀的傳播方向不同後面的address排列順序也不同。而咱們須要的組播包則是手機發送給路由器的包,也就是上面提到的TO AP紅色的這一類型。
有了以上的信息,咱們能夠根據幀的類型,傳播方向過濾掉大部分無用幀和不須要的數據幀,而且咱們能夠根據路由器的MAC也就是BSSID,發送端的MAC地址也就是SA創建起一個對應關係表,此時拿到實際數據就相對容易多了。
咱們用手機發送數據包,設備開啓監聽模式抓包,而後解析數據的方式拿到帳號密碼。因爲智能設備抓無線網絡的數據包和咱們在電腦上抓包有些不同,它能夠抓到在當前信道全部包以及相鄰甚至相隔信道上的部分包,目前的無線網絡頻率分爲2.4G和5G兩類頻道,而智能設備目前大多數都是在2.4G的頻道上。在中國大陸,2.4G又具體分爲13個信道,通常狀況下每一個信道的頻寬是22MHZ,固然也能夠在路由器中修改。默認狀況下每一個頻寬之間都是有重疊的。而設備開啓監聽模式,而且在1到13折個13個信道中間來回切換,若是抓到手機發送的標識數據那麼就能夠鎖定信道而且開始抓包重組數據。