扫描隐藏SSID,和非隐藏SSID,STA端只有在wpa_supplicant.conf有一点不同:
network={
ssid="Xiaomi_B908"
scan_ssid=1 ##这一项表示可以扫描隐藏wifi
psk="12345678"
priority=1
id_str="%7B%22creatorUid%22%3A%22-1%22%2C%22configKey%22%3A%22%5C%22Xiaomi_B908%5C%22WPA_PSK%22%7D"
}
在不隐藏SSID时,AP广播的Beacon帧中,将携带SSID信息:
SSID
Element ID: 0 SSID [36]
Length: 11 [37]
SSID: Xiaomi_B908 [38-48]
也就是在Beacon帧中携带本BSS的SSID信息,通知STA。
但是设置隐藏SSID的AP在广播的Beacon帧中没有携带SSID信息。通常的利用wpa_supplicant实现的设备搜索到的隐藏SSID的AP的SSID为空,这种为空的SSID被处理的时候被忽略了,就搜索不到。sniffer包表现为:
SSID
Element ID: 0 SSID [36]
Length: 0 [37]
从代码来看:
设置扫描隐藏SSID,从代码上来看,首先要设置wpa_supplicant.conf中scan_ssid项为1。在wpa_supplicant中扫描过程如下:
wpas_ctrl_scan(wpa_s, NULL, reply, reply_size, &reply_len);
wpa_supplicant_req_scan(wpa_s, 0, 0);
wpa_supplicant_scan()
wpa_drv_scan(wpa_s, params);
在wpa_supplicant_scan()中有:
@scan.c
static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
{
if (ssid == NULL && max_ssids > 1)
ssid = wpa_s->conf->ssid;
while (ssid) {
if (!wpas_network_disabled(wpa_s, ssid) &&
ssid->scan_ssid) {
wpa_hexdump_ascii(MSG_DEBUG, "Scan SSID",
ssid->ssid, ssid->ssid_len);
params.ssids[params.num_ssids].ssid =
ssid->ssid;
params.ssids[params.num_ssids].ssid_len =
ssid->ssid_len;
params.num_ssids++;
if (params.num_ssids + 1 >= max_ssids)
break;
}
ssid = ssid->next;
if (ssid == start)
break;
if (ssid == NULL && max_ssids > 1 &&
start != wpa_s->conf->ssid)
ssid = wpa_s->conf->ssid;
}
}
wpa_supplicant从配置文件中读取配置信息,包括scan_ssid项信息。以上代码首先判断配置是否设置scan_ssid项,如果设置了的话,就将设置的网络信息写入到parames(wpa_driver_scan_params对象)中,这个parames是驱动扫描的参数,参与到扫描过程中。如果没有设置,if中语句不执行,bss信息不写入到扫描参数中。
从发送的MAC帧来看:
在STA进行扫描时,如果wpa_supplicant.conf设置了scan_ssid = 1, STA发送probe request帧,会发送两种类型的帧,第一种用来扫描所有AP,其中request帧SSID项不携带信息。同时发送另一种request帧,其中有携带SSID信息,用来搜索隐藏SSID。
STA设置隐藏后,其中携带要扫描的SSID信息的request帧,在sniffer中的描述:
802.11 Management - Probe Request
SSID
Element ID: 0 SSID [24]
Length: 11 [25]
SSID: Xiaomi_B908 [26-36]
在没有设置扫描隐藏SSID时,STA发送的request帧只有第一种,不能指定获取某种SSID。这个时候隐藏SSID的AP回复的response帧包含的SSID信息为空,于是在wpa_supplicant中看到的SSID为空,framework层就把空SSID忽略了,搜索不到。
但是对于设置了扫描隐藏SSID的STA,在发送携带特定SSID信息的request后,AP端虽然隐藏了SSID,但是回复的response帧将携带自身SSID信息的,STA通过其SSID项正常扫描到网络。
回复的response帧信息:
802.11 Management - Probe Response
SSID
Element ID: 0 SSID [36]
Length: 11 [37]
SSID: Xiaomi_B908 [38-48]