Перейти к содержанию
  • Язык

Я НАПИСАЛА КУРСОВУЮ ПО PWNAGOTCHI И ВОТ ЧТО ПОНЯЛА

(0 отзывов)

Ну что, мальчики и девочки, давненько я не щитпостила в свой блог, пора исправить это досадное недоразумение.

Ранее я уже поверхностно рассказывала про pwnagotchi – проект, которым был вдохновлен небезызвестный FlipperZero. Спустя несколько месяцев мне удалось познакомиться с ним поближе, мерзко обесчестить опенсурсный ai и более глубоко разобраться в механиках работы алгоритмов обучения с подкреплением.

Во-первых, ChatGPT нагло соврал, когда сообщил, что pwnagotchi работает на Q-Learning. Он может, но не по умолчанию. По умолчанию он юзает алгоритм A2C.

Цитата

A2C (Advantage Actor-Critic) — это один из алгоритмов обучения с подкреплением (Reinforcement Learning), который принадлежит семейству методов Actor-Critic. Он улучшает классический подход с использованием двух основных компонент: Actor (Актор) и Critic (Критик). A2C выделяется простотой и эффективностью благодаря синхронной обработке данных.

Во-вторых, обучать модель все же куда как легче и быстрее на рандомно генерируемых данных, т.к. в реальных условиях получение данных извне может быть связано с множеством ограничений, включая недостаток доступных Wi-Fi сетей, ограниченные возможности оборудования, длительное время сбора, закон 🙄🥱.

Генерировать необходимо состояния агента, включая:

-  число деаутов (deauth, deauthentication) отправленных агентом за эпоху (деаут-пакеты используются для отключения устройств от их точки доступа Wi-Fi, чтобы инициировать повторное подключение, что позволяет агенту перехватывать хендшейки);

- Количество успешных ассоциаций агента с точками доступа Wi-Fi. Если число ассоциаций велико, агент активно работает с точками доступа;

- Число перехваченных хендшейков (handshakes) за эпоху. Хендшейк — это ключевой элемент для атаки на WPA/WPA2 сети, так как он содержит данные для последующего подбора пароля. Большое значение указывает на продуктивность агента;

и т.д.

Для реализации данной задачи используется скрипт на языке Python, который создает случайные значения для параметров эпохи, сохраняя их в формате JSON для дальнейшего анализа и использования в обучении. Использование JSON для хранения данных упрощает их обработку, анализ и передачу между системами.     

Этот формат интуитивно понятен и позволяет быстро увидеть структуру данных, также он относительно компактен, что позволяет эффективно хранить даже большие объемы данных без избыточной информации, используя минимально возможное количество символов.

Результат первого обучения модели на сгенерированных данных в виде графика.

image.png

Параметры:

image.png

Изменение количества эпох

Для проведения первого «эксперимента» с изменением параметров модели в части количества эпох необходимо скорректировать следующий блок кода в файле train.py.

Изначально в работе рассматривается 10 эпох. Для того, что б посмотреть, как количество эпох влияет на модель, меняем его на 50:

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
    dataset_path = 'random_data.json'
    agent = MockAgent()
    environment = Environment(dataset_path=dataset_path, agent=agent)

    rewards = []
    params_log = []

    state = environment.reset()
    for epoch in range(50):
        action = environment.action_space.sample()
        state, reward, done, _ = environment.step(action)
        rewards.append(reward)
        params_log.append(environment.last['params'])
        if done:
            break

Результаты:

image.png

Изменение функции расчета награды

Второй «эксперимент» направлен на изучение влияния изменения функции вычисления наград на итоговые результаты. Для этого код в файле reward.py был изменен.

Данная функция вычисляет награду на основе нескольких параметров, характеризующих поведение агента и его взаимодействие с окружающей средой, используя вероятностные и пропорциональные зависимости. С математической точки зрения функция включает дроби, где числители и знаменатели нормализуют параметры состояния. В основе формулы лежит произведение доли успешных рукопожатий (num_handshakes), активного времени (active_for_epochs), и вероятности избегания нежелательных состояний (blind_for_epochs и missed_interactions), все из которых делятся на общее количество эпох или взаимодействий для нормализации. Дополнительно учитываются эмоциональные параметры (sad_for_epochs и bored_for_epochs), которые уменьшают награду, если их значения велики. Эти параметры тоже нормализуются через общее число эпох, и их влияние нивелируется, если они меньше заданного порога. Использование множителей 1e−20 предотвращает деление на ноль.

Результаты:

image.png

Очевидно, что изначальная функция расчета награды работала куда более качественно. Зато можно дальше поиграться с математикой и вывести формулу под уникальную задачу, если возникнет такая необходимость.

Изменение нормализации и денормализации данных

Третий «эксперимент» раскрывает влияние различных методов нормализации данных на итоговые результаты обучения. Для этого в файле parameter.py были произведены следующие изменения:

1. Добавление динамической регулировки диапазона параметра (adjust_bounds)

Метод adjust_bounds изменяет диапазон значений параметра (min_value, max_value) в зависимости от текущей эпохи. Это позволяет адаптировать параметры во время тренировки в зависимости от прогресса.

Логирование этих изменений помогает отслеживать, как изменяются параметры на разных этапах обучения:

def adjust_bounds(self, epoch):
    """
    Динамически изменяет диапазон параметра в зависимости от текущей эпохи.
    :param epoch: Текущая эпоха.
    """
    self.min_value = max(self.min_value - epoch * 0.1, -100)
    self.max_value = min(self.max_value + epoch * 0.1, 100)
    logging.info(f"Parameter {self.name}: Adjusted bounds to [{self.min_value}, {self.max_value}]")

С каждым новым шагом эпохи диапазоны значений параметров будут изменяться, что полезно для исследования влияния параметров на обучение.

2. Изменение вычисления "размера пространства" (space_size)

Метод space_size теперь учитывает возможный сдвиг (с учетом scale_factor), который определяется в зависимости от минимального значения параметра.

scale_factor корректируется в зависимости от минимального значения параметра:

def space_size(self):
    return self.max_value + self.scale_factor

Это позволяет более гибко масштабировать пространство действий, учитывая сдвиг диапазона значений.

3. Добавление шума при преобразовании действия в значение параметра (to_param_value)

В методе to_param_value добавлен случайный шум в значение параметра:

self.value += random.uniform(-0.05, 0.05)  # Добавление шума

Вводя случайный шум, создаются небольшие флуктуации в значениях параметров, что может улучшить обучение за счет случайных отклонений, увеличивая разнообразие состояния.

4. Нелинейное преобразование в методе denormalize

Метод denormalize теперь включает нелинейное преобразование:

nonlinear_scale = normalized**2  # Нелинейное преобразование

Это означает, что значение параметра будет изменяться не линейно, а в квадрате нормализованного значения. Это может позволить более точно настроить параметры с меньшими изменениями в их значениях.

5. Учет важности параметров в denormalize

В методе denormalize добавлена учет важности параметров из метаданных (meta):

importance = self.meta.get('importance', 1.0)
value *= importance

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

Результаты:

image.png

Анализ результатов показал, что изменение подхода к нормализации и денормализации данных меняет распределение значений параметров, особенно в их крайних пределах, т.е. важно предварительно обрабатывать данные для успешного применения методов машинного обучения. Корректная нормализация позволяет улучшить как точность, так и стабильность модели усиленного обучения.

Очевидно, Pwnagotchi – крайне перспективный проект, который можно превратить в очень и очень мощный инструмент автоматического тестирования безопасности. Горизонты простираются в огромном количестве направлений, причем не только в сторону написания плагинов, добавления всяких программно-аппаратных приблуд или «взломов» Bluetooth и IoT. У него есть возможность интеграции с такими титанами ИБ, как Wireshark и Metasploit. Однако, потребуется немало времени и умственных усилий, чтобы разобраться в этом проекте. Не каждый готов тратить на такое время и силы...

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

0 высказываний

Рекомендуемые комментарии

Высказываний нет...

Посетитель
Добавить высказывание...

Важная сводка

Мы разместили cookie-файлы на твоё устройство, чтобы помочь сделать этот форум лучше. Ты можешь корректировать своё управление cookie-файлами, или же продолжить без каких-либо корректировок.

Иконка перчаток с несколькими звуками
Иконка перчаток

Досье

Навигация

Розыск

Розыск

Настройка push-извещений браузера

Chrome (Android)
  1. Нажми на значок замка рядом с адресной строкой.
  2. Нажми Разрешения → Извещения.
  3. Корректируй свои предпочтения.
Chrome (Desktop)
  1. Нажми на значок замка в адресной строке.
  2. Выбери Управление сайта.
  3. Разыщи Изввещения и корректируй свои предпочтения.