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

来源:互联网 发布:南柯奇谭 墨竹 知乎 编辑:程序博客网 时间:2024/05/17 08:26

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.cstatic 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]
原创粉丝点击