Parsing WiFi Packets (libpcap) - программирование
Подтвердить что ты не робот

Parsing WiFi Packets (libpcap)

Я работаю над тем, чтобы иметь доступ к запросам зонда Wi-Fi в OpenWRT для MySQL db (он хранит MAC-адрес и информацию RSSI для каждого пакета запроса зонда вместе с другими специфичными для маршрутизатора данными).

После небольшого исследования libpcap я смог собрать базовую небольшую программу, которая просто обнюхивает пакеты на интерфейсе монитора (mon0), используя выражение фильтра ( "wlan subtype probe-req" ), а затем распечатывает необработанные пакеты в шестнадцатеричном формате. С информацией, доступной в Интернете по libpcap, эта часть была довольно простой.

Теперь здесь, где я застрял: Как разобрать пакет WiFi для получения информации, которую я ищу (RSSI и MAC-адрес источника)?

Чтобы быть ясным, я не прошу код сделать это (хотя я не буду жаловаться, если вы хотите предоставить некоторые: D). Я просто ищу какое-то руководство для понимания того, какой байт - это дорожная карта WiFi-пакета, если вы это сделаете.

Есть несколько хороших обучающих программ для парсинга пакетов, которые поступают через Ethernet, но я не смог найти ничего, чтобы помочь с разбором заголовков, связанных с WiFi. Я предполагаю, что это будет довольно простой процесс - просто захватить соответствующие байты для RSSI и исходного MAC-кода, - но опять же, я не смог найти какую-либо документацию, на которой находится байт.

Я знаю, что это было сделано раньше, но я буду честен: я полностью потерял, просматривая исходный код для tcpdump.

Итак, знает ли кто-нибудь о хорошем ресурсе для того, как разбирать пакеты Wi-Fi?

Приветствия

EDIT: более конкретный ответ

RSSI найден в заголовке RadioTap (ну, в Linux это). Вытягивание RSSI из пакета довольно просто, используя radiotap-parser.c вместе с файлами, на которых это зависит (найдено в том же каталоге, что и файл, с которым я связан). Если у кого-то возникают проблемы с использованием функций radiotap-parser.c, вы можете войти в контакт.

Вытягивание исходного MAC-адреса делается довольно легко благодаря функциям радиотопапа, потому что структура заголовка radiotap содержит длину заголовка лучевой кавычки (it_len), которая является переменной. Поскольку я разбираю только запросы зонда, которые имеют фиксированную длину (см. Стр. 17 здесь), это просто вопрос создания указателя, указывающего на packet + it_len + 10 ( исходный MAC-адрес начинается с 10 байт после начала кадра MAC, который начинается там, где заканчивается заголовок радиоисточника). 6 байтов, начинающихся с этого указателя, addr2 в кадре 802.11 (см. Стр. 17 здесь).

4b9b3361

Ответ 1

Поиск Google для "формата кадров 802.11" предоставляет некоторые перспективные ссылки, которые я считаю. Здесь представлен обзор высокого уровня, в котором указан пакет: http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml.

Ответ 2

Если вы используете pylibpcap, тогда вы можете захватить RSSI таким образом. Это грубо и делает предположения относительно флагов в кадре 802.11 (то есть флаги должны быть 0x0000482F), но это сработало для меня. Это взлома python, и я не хотел идти по пути установки дополнительных модулей (dpkt и scapy имеют функции для этого, но не задокументированы), когда хак - это всего лишь один вызов struct.unpack.

(len,data,timestamp) = p.get_next()

if data[0:8] =='\x00\x00\x22\x00\x2F\x48\x00\x00' and len(data) >= 50:
  type_subtype = ord(data[34])
  dest_mac     = data[38:38+6]
  src_mac      = data[44:44+6]
  rssi,        = struct.unpack("b",data[22])

Если ваши флаги не такие, как указано выше, просмотрите radiotap-parser.c в вопросе OP и выясните, как вычислить смещение в поле RSSI (22 в этом примере). Каждый бит бит меняет смещение на 1,2,4 или 8 байтов.

Ответ 3

Я знаю, что это сообщение устарело, но я натолкнулся на это, пытаясь сделать синтаксический анализ Wi-Fi без везения, поэтому я надеюсь, что смогу помочь кому-то еще!

Существует относительно новая библиотека, но она потрясающая для всех уровней стека. Его называют libTins и будут разбирать пакеты на каждом уровне стека для вас. Его BSD лицензируется (по состоянию на 2015 год) и очень легко обнюхивает. Он построен поверх lib pcap, но будет принимать байтовые массивы, если вы хотите сделать обнюхивание самостоятельно.

Ответ 4

вы можете использовать модуль tshark, где вы можете получить определенные поля.