Eigentlich ist die Anwendung, die diese Informationen bestimmt airodump-ng
, nicht aircrack-ng
. Aus der airodump-ng
Dokumentation werden die Leistungsstufen bestimmt als:
PWR - Von der Karte gemeldetes Signal. Ihre Bedeutung hängt vom Fahrer ab [...]
Nun, mal sehen, ob wir es besser machen können. Beim Durchsehen des neuesten Quellcodes der airodump-ng.c
Datei wird die Leistung in der dump_add_packet(...)
Funktion eingestellt:
/* only update power if packets comes from * the AP: either type == mgmt and SA != BSSID, * or FromDS == 1 and ToDS == 0 */ if (...) ap_cur->power_lvl[ap_cur->power_index] = ri->ri_power;
Nachdem ich mehrere Schichten der Abstraktion, Strukturen und Funktionszeiger durchgearbeitet hatte, stellte ich fest, dass diese Daten aus der linux_read(...)
in der osdep/linux.c
Datei definierten Funktion gefüllt werden. Dies ist, wo die ri_power
Variable inri
Struktur mit Daten gefüllt und scheint tatsächlich treiberspezifisch zu sein.
Die meisten Treiber folgen dem Radiotap- Standard (im Gegensatz zum unten beschriebenen älteren Prism54-Standard), der mehrere vordefinierte Felder zum Bestimmen der Antennenleistung, des Rauschens und der Dämpfung aufweist. Diese Felder werden direkt verwendet airodump-ng
, um die ri_power
Variable auszufüllen . Einige davon sind bereits in Dezibel oder Leistung verfügbar.
airodump-ng
verwendet entweder das Antennensignalfeld (in dBm) oder das dB-Antennensignalfeld (in dB), um die angezeigte Signalleistung zu berechnen. Ähnliche Schritte werden für die anderen Felder verwendet, da sie alle in der Radiotap-Spezifikation, auf die oben verwiesen wird, vorgegeben sind. Zum Beispiel kann die ri_power
Verwendung des dB-Antennensignalfelds wie folgt berechnet werden:
case IEEE80211_RADIOTAP_DB_ANTSIGNAL: if(!got_signal) { if( *iterator.this_arg < 127 ) ri->ri_power = *iterator.this_arg; else ri->ri_power = *iterator.this_arg - 255; got_signal = 1; } break;
Wie bereits erwähnt, folgen einige Geräte der (älteren) prism54- Spezifikation (anstelle von Radiotap), die einen Header mit fester Länge verwendet. In diesem Fall wird die Empfangsleistung direkt aus dem Puffer abgerufen (beachten Sie, dass dies kein vollständiger Quellcode ist, sondern nur die Pfade zum Befüllen zeigt ri_power
):
if (tmpbuf[7] == 0x40) ri->ri_power = tmpbuf[0x33]; else ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C );