How to read Wireless Information Elements in C++



Beacon Frames

Come si sa i routers wifi (ed ogni Access Point in generale) durante il loro normale funzionamento inviano periodicamente numerose informazioni nella WLAN (Wireless Local Area Network) sia per segnalare la propria esistenza che per consentire ai loro clients di scambiare informazioni e dati. Queste "informazioni" sono trasmesse in frames.

Un Beacon Frame è un tipo di "management frame" che viene trasmesso ad intervalli che possono variare da rete a rete, il cui contenuto è un insieme di informazioni riguardanti la WLAN e lo stesso access point che le trasmette.

Lo standard IEEE 802.11 stabilisce che ogni beacon frame possa contenere una lunga (molto lunga) lista di informazioni, dal SSID (Subscription Service Identifier) al BSSID (Basic Service Set Identifier) al MAC address del device ed a tante altre ancora. Consiglio a che vuole approfondire l'argomento beacon frames di leggere informazioni dettagliate sullo standard IEEE 802.11 peraltro facilmente reperibili in rete.


Vendor Specific Information Element

Sempre secondo lo stesso standard ogni Beacon Frame può contenere diversi Information Elements i quali vengono identificati con specifici codici in base a delle tabelle contemplate nel documento che lo regola.
Tra i vari IE (Information Elements) previsti dall' IEEE 802.11, i vendors dell'hardware dell'access point (routers etc.) hanno la facoltà di inserire nei bacon frames delle informazioni custom, note come Vendor Specific Information Elements, quali il brand dell' access point, il nome, il MAC address di quest'ultimo e così via...
(Teniamo presente comunque che, sebbene previsti dallo standard, i Vendor Specific Information Elements non sempre sono presenti in un beacon frame).

Analizzando quindi i beacon frames trasmessi nelle reti wireless intorno a noi, non appena ci imbatteremo in un elemento che abbia un Element ID 221, sapremo che si tratta di informazioni custom del produttore dell'access point e che tali informazioni ci consentiranno per esempio di sapere che router (marca, modello etc.) hanno i nostri vicini, su quale canale trasmette etc...

Nell'immagine qui sotto potete vedere una dimostrazione:

WIFI-InfoElements


Nell'immagine qui sopra nella sezione Information Elements vengono mostrati 5 campi interessanti:

I primi due sono :
- uno: l'offset in bytes in cui iniziano i dati relativi agli Information Elements all'interno del beacon frame.
- due: la lunghezza in bytes dei dati degli IE.

I rimanenti tre
sono campi che (insieme ad altri) fanno parte degli IE e che da questi sono stati estrapolati dall'applicazione di esempio.


Microsoft Native Wifi API

L'API Native Wifi di Microsoft è un fantastico, potente set di funzioni che ci consente di gestire completamente le reti wireless in C++.
Tra le innumerevoli funzioni di questa API ce n'è una che, in base al network indicato nei parametri di input, restituisce (in bytes) sia l'offset degli IE che la loro dimensione e

        DWORD WINAPI WlanGetNetworkBssList(
        _In_             HANDLE         hClientHandle,
        _In_            const GUID      *pInterfaceGuid,
                    const  PDOT11_SSID   pDot11Ssid,
        _In_             DOT11_BSS_TYPE  dot11BssType,
        _In_             BOOL            bSecurityEnabled,
        _Reserved_       PVOID           pReserved,
        _Out_            PWLAN_BSS_LIST  *ppWlanBssList
        );
    

li scrive nel parametro di output *ppWlanBssList che è un puntatore alla struttura WLAN_BSS_ENTRY, precisamente

        typedef struct _WLAN_BSS_ENTRY {
  DOT11_SSID        dot11Ssid;
  ULONG             uPhyId;
  DOT11_MAC_ADDRESS dot11Bssid;
  DOT11_BSS_TYPE    dot11BssType;
  DOT11_PHY_TYPE    dot11BssPhyType;
  LONG              lRssi;
  ULONG             uLinkQuality;
  BOOLEAN           bInRegDomain;
  USHORT            usBeaconPeriod;
  ULONGLONG         ullTimestamp;
  ULONGLONG         ullHostTimestamp;
  USHORT            usCapabilityInformation;
  ULONG             ulChCenterFrequency;
  WLAN_RATE_SET     wlanRateSet;
  ULONG             ulIeOffset;
  ULONG             ulIeSize;
} WLAN_BSS_ENTRY, *PWLAN_BSS_ENTRY;
       

    

nei campi:
    ULONG             ulIeOffset;
    ULONG             ulIeSize;


Prima di vedere come leggere i Vendor Specific Information Elements c'è ancora un problema.

Il campo ulIeSize contiene la lunghezza di tutti gli IE (Information Elements), come facciamo a leggere i dati di ogni singolo elemento?
Od in altre parole, come possiamo sapere la lunghezza di ogni singolo elemento?

In realtà questo è piuttosto semplice ed è il solito standard che dispone che per ogni elemento sia indicato:


Un esempio nelle immagini qui sotto:

L' Element ID 0 (lo standard dice che l'id 0 deve indicare l'SSID del network).
Il valore del byte che segue è 17 bytes (in hex).

WIFI-InfoElements

Quindi la lunghezza del campo con ID 0 è 17 bytes in hex ovvero 23 bytes in decimale.

WIFI-InfoElements

Ora che sappiamo come ricavare la lunghezza dei campi possiamo ricavare i Vendor Specific Information Elements:

Come detto in precedenza l'ID da cercare è l'Element ID 221 che in hex è DD.

WIFI-InfoElements

La lunghezza del campo in questo caso è 97 bytes (hex) cioè 151 bytes in decimale.

WIFI-InfoElements



Guardando l'immagine qui sopra si vede immediatamente che l'access point indica nel campo Vendor Specific Information in successione:

Brand del router
Modello del router
Nome del router

Inoltre possiamo notare che brand, model e name sono preceduti rispettivamente da un byte specifico per ogni valore :

Per il brand un byte di valore 21 hex seguito da 00 hex e quindi da 07 hex ( 7 in decimale )
per cui basterà leggere i successivi 7 bytes per avere il campo brand.

WIFI-InfoElements

Per il model un byte di valore 23 hex seguito da 00 hex e quindi da 09 hex ( 9 in decimale )
per cui basterà leggere i successivi 9 bytes per avere il campo model.

WIFI-InfoElements

Per il name un byte di valore 11 hex seguito da 00 hex e quindi da 09 hex ( 9 in decimale )
per cui basterà leggere i successivi 9 bytes per avere il campo name.

WIFI-InfoElements

Qui di seguito potrete fare il download dell'applicazione demo in formato exe o tutto il progetto per Visual C++.

Per sicurezza verificare sempre i codici HASH delle applicazioni.
Un codice HASH corrispondente assicura che le applicazioni siano quelle originali rilasciate dal produttore.

HASH codes:


download WIFI-InfoElements_BIN ver. 1.0  exe 

HASH codes:


download WIFI-InfoElements_Source ver. 1.0  exe 



Giuseppe Pischedda 2017




Se l'applicazione ti è utile puoi fare una donazione all'autore, l'importo è a tua libera scelta.

Grazie