一种让智能设备连接无线路由器的方法

现在的手机,电脑,平板等如果要连接无线路由器比较方便,直接扫描无线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协议分为以下三种类帧:

1)控制帧:通常与数据帧搭配使用,负责区域的清空(RTS/CTS协议(Request To Send/Clear To Send))、信道的取得、收到数据后确认

2)管理帧:负责监督,用来加入或退出无线网络以及处理接入点之间关联的转移事宜(beacon)

3)数据帧:用于传输数据。

而我们需要的数据帧,数据帧的标识头数据结构如下:

在图上的数据中,我们关心的数据有以下几个:

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个信道中间来回切换,如果抓到手机发送的标识数据那么就可以锁定信道并且开始抓包重组数据。

原文地址:https://www.cnblogs.com/mod109/p/4928024.html