4

Я не могу понять, как точки доступа определяют мощность сигнала соседних клиентов.

Я не нашел эту информацию ни в одном из учебных пособий по 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 ответа2

4

На самом деле, приложение, которое определяет эту информацию, является 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 );
1

Я не совсем уверен, что вы спрашиваете.

Точки доступа, естественно, имеют радиоприемники, и эти приемники имеют аналоговые секции с автоматическим усилением, из которых аппаратные средства могут получать мощность принимаемого сигнала. Аппаратный драйвер затем делает эту информацию доступной для другого программного обеспечения в зависимости от ОС.

Вот почему aircrack имеет большое значение для водителей и оборудования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .