首先,WiFi Monitor模式需要WiFi芯片本身支持,并且驱动要支持相应的接口。
在非Monitor模式(平时正常使用的状态)下,内核会将802.11帧封装成普通网络帧传递给上层; 而在Monitor模式下,内核则会直接将802.11帧传给上层,不会进行封装,用户层就通过接口拿到RAW包,可以按802.11帧格式进行包解析处理。
在Linux内核中,hostap_80211_rx函数是IEEE 802.11接收无线skb的tasklet函数,其作用是处理802.11网卡传递过来的数据包。倘若网卡被设置成monitor模式,该函数中会调用如下分支:
if (local->iw_mode == IW_MODE_MONITOR) {
monitor_rx(dev, skb, rx_stats);
return;
}
在monitor_rx函数中,主要是prism2_rx_80211函数,将带有802.11头的skb直接发送给netif。netif为linux内核网络数据包的标准框架。在prism2_rx_80211中,在skb里补充了一个抓包的头,给用户提供更多的包信息。这个头对应的数据结构为linux_wlan_ng_cap_hdr,具体声明如下:
struct linux_wlan_ng_cap_hdr {
__be32 version;
__be32 length;
__be64 mactime;
__be64 hosttime;
__be32 phytype;
__be32 channel;
__be32 datarate;
__be32 antenna;
__be32 priority;
__be32 ssi_type;
__be32 ssi_signal;
__be32 ssi_noise;
__be32 preamble;
__be32 encoding;
} __packed;
与wireshark抓到的包是相吻合,如下图:

那么,要如何开启该模式?使用如下命令可以实现:
iwconfig wlan0 mode Monitor
其调用了如下ioctl来配置:
ret = ioctl(skfd, SIOCSIWMODE, &wrq);
对应的配置模式,通过wrq参数来定义。而上面的skfd则由下面操作获取:
skfd = socket(AF_INET, SOCK_DGRAM, 0);
综上,我们可以很好的开启WiFi Monitor模式,并获取其RAW数据包来对802.11帧进行解析。
1835

被折叠的 条评论
为什么被折叠?



