Я работаю над тем, чтобы иметь доступ к запросам зонда 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 здесь).