Na verdade, o aplicativo que determina essas informações é airodump-ng
, não aircrack-ng
. A partir da airodump-ng
documentação , os níveis de energia são determinados como:
PWR - Signal level reported by the card. Its signification depends on the driver [...]
Bem, vamos ver se podemos fazer melhor. Analisando o código-fonte mais recente do arquivo airodump-ng.c
, vemos o energia é definida na função dump_add_packet(...)
:
/* 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;
Depois de vasculhar várias camadas de abstração, estruturas e ponteiros de função, descobri que esses dados são preenchidos a partir da função linux_read(...)
definida no osdep/linux.c
. É aqui que a variável ri_power
no ri
struct é preenchida com dados e, de fato, parece ser específica do driver.
A maioria dos motoristas segue o padrão Radiotap (em oposição ao padrão mais antigo prism54 detalhado abaixo), que ter vários campos predefinidos para determinar a potência da antena, o ruído e a atenuação. Esses campos são usados diretamente por airodump-ng
para preencher a variável ri_power
. Alguns deles já estão disponíveis em valores de decibéis ou de potência.
airodump-ng
usará o campo sinal da antena (em dBm) ou o campo de sinal da antena dB (em dB) para calcular a potência do sinal exibido. Etapas similares são usadas para os outros campos, já que são todos predeterminados na especificação do Radiotap vinculada acima. Por exemplo, o ri_power
usando o campo dB Antenna Signal pode ser calculado como:
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;
Como mencionado anteriormente, alguns dispositivos seguem a especificação (mais antiga) prism54 (em vez do Radiotap), que usa um cabeçalho de comprimento fixo. Neste caso, o poder RX diretamente do buffer (note que este não é o código-fonte completo, apenas mostra os caminhos tomados para preencher ri_power
):
if (tmpbuf[7] == 0x40)
ri->ri_power = tmpbuf[0x33];
else
ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C );