Как точки доступа определяют мощность связанного или не связанного клиента?
Я не могу понять, как точки доступа определяют мощность сигнала соседних клиентов.
Я не нашел эту информацию ни в одном из учебных пособий по WiFi-пакетам, поэтому могу только предположить, что информация о питании не поступает от клиента, а определяется точкой доступа.
Я знаю приложение под названием aircrack, которое может определить эту информацию, но прежде чем перейти к этому и покопаться, я хотел бы получить представление о том, как рассчитывается мощность. Мои навыки работы с Google не так уж и плохи, поэтому я удивлен, что до сих пор не смог найти какую-либо информацию об этом. Конечно, если aircrack может сделать это, эта информация там!
Я надеялся, что пользователи здесь могут указать мне правильное направление?
Что касается щедрости
Я думаю, пришло время попытаться использовать награду. В своих ответах, пожалуйста, опубликуйте все ссылки, которые вы можете найти, которые помогут любому понять, как работает это обнаружение питания. Конкретная информация о том, как это реализовано в aircrack, была бы идеальной!
ОБНОВИТЬ:
На данный момент, используя в качестве примера пакет aircrack-ng, похоже, что значение мощности извлекается из buf[2] в net_read(). Я полагаю, что это значение в конечном итоге исходит от net_cmd, что приводит к парным вызовам к net_send и net_get(). Я думаю, что net_get () читает любую информацию заголовка, отправленную из-за вызова net_send(), и этот заголовок указывает, сколько данных должно быть скопировано в буфер buf[].
Но теперь я не получаю следующее: похоже, что buf [] заполняется вызовом net_read_exact(), который просто читает данные из сокета. Если это так, и если мощность - это деталь драйвера, почему значение мощности в буфере? Если этот буфер действительно заполнен данными сокета, не означает ли это, что питание отправляется клиентом / станцией? Я полагаю, что AP / драйвер отвечает за предоставление информации о питании, как все говорили, но только не получите эту часть.
2 ответа
На самом деле, приложение, которое определяет эту информацию airodump-ng
не aircrack-ng
, От airodump-ng
В документации уровни мощности определяются как:
PWR - уровень сигнала, сообщаемый картой. Его значение зависит от водителя [...]
Что ж, посмотрим, сможем ли мы сделать лучше. Просматривая последний исходный код airodump-ng.c
файл, мы видим, что сила устанавливается в 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;
Перебрав несколько слоев абстракции, структур и указателей на функции, я обнаружил, что эти данные заполняются из функции linux_read(...)
определены в osdep/linux.c
файл. Это где ri_power
переменная в ri
Структура заполнена данными, и, действительно, она действительно зависит от драйвера.
Большинство драйверов следуют стандарту Radiotap (в отличие от более раннего стандарта prism54, описанного ниже), который имеет несколько предопределенных полей для определения мощности антенны, шума и затухания. Эти поля используются непосредственно airodump-ng
заполнить ri_power
переменная. Некоторые из них уже доступны в децибелах или значениях мощности.
airodump-ng
будет использовать поле сигнала антенны (в дБм) или поле сигнала антенны дБ (в дБ) для вычисления отображаемой мощности сигнала. Аналогичные шаги используются для других полей, так как все они предопределены в спецификации Radiotap, связанной с выше. Например, ri_power
используя поле сигнала антенны дБ, можно рассчитать как:
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;
Как упоминалось ранее, некоторые устройства следуют (более старой) спецификации prism54 (вместо Radiotap), в которой используется заголовок фиксированной длины. В этом случае питание RX напрямую из буфера (обратите внимание, что это не полный исходный код, просто показаны пути, взятые для заполнения ri_power
):
if (tmpbuf[7] == 0x40)
ri->ri_power = tmpbuf[0x33];
else
ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C );
Я не совсем уверен, что вы спрашиваете.
Точки доступа имеют радиоприемники, естественно, и эти приемники имеют аналоговые секции с автоматическим усилением, из которых аппаратные средства могут извлекать уровень принимаемого сигнала. Аппаратный драйвер затем делает эту информацию доступной для другого программного обеспечения в зависимости от ОС.
Вот почему aircrack имеет большое значение для водителей и оборудования.