Разбор пакетов WiFi (libpcap)

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

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

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

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

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

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

Итак, кто-нибудь знает хороший ресурс для разбора пакетов WiFi?

Ура

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

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

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

4 ответов


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


если вы используете 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 байт.


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

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


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