隐藏SSID和STA搜索隐藏SSID原理

1、AP隐藏时MAC帧的表现

扫描隐藏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]

2、设置STA扫描隐藏SSID

从代码来看:

设置扫描隐藏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]

你可能感兴趣的:(WIFI开发)