Data Science Project

Классификация вредоносных программ с использованием сверточных нейронных сетей - пошаговое руководство

Быстрый и легкий учебник об интересном подходе к классификации вредоносных программ.

Вредоносное ПО - это общий термин, обозначающий любой вредоносный код или программу, которые могут нанести вред системе.

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

В этой статье я решил сосредоточиться на интересном методе классификации вредоносных программ, основанном на сверточных нейронных сетях. Эта идея прямо взята из статьи Образы вредоносных программ: визуализация и автоматическая классификация Л. Натараджа, С. Картикеяна, Г. Джейкоба и Б. С. Манджунатха.

Моя цель - дать вам быстрое и легкое руководство о том, как реализовать их решение, от предварительной обработки вредоносных программ до вывода. Надеюсь, вы сможете понять основные концепции и использовать эту статью для создания своих собственных проектов!

Этот проект можно найти на моем Github.

Набор данных

Прежде всего, давайте представим набор данных! В основном мы будем использовать Набор данных Malimg, который взят из вышеупомянутой статьи.

Набор данных Malimg содержит 9339 образов вредоносных программ, принадлежащих к 25 семействам / классам. Таким образом, наша цель - выполнить многоклассовую классификацию вредоносных программ.

Вот информация о наборе данных:

Наша модель попытается предсказать, к какому семейству принадлежит каждое вредоносное ПО. Столбец Тип носит информативный характер.

Предварительная обработка

От двоичного файла к изображению

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

Для каждого файла необработанные данные содержат шестнадцатеричное представление двоичного содержимого файла. Цель состоит в том, чтобы преобразовать эти файлы в изображения PNG и использовать их в качестве входных данных для нашего CNN.

Мы можем преобразовать каждую вредоносную программу, используя следующую функцию:

Вот изображение, полученное после преобразования двоичного файла 0ACDbR5M3ZhBJajygTuf.bytes в PNG.

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

Более того, каждое изображение вредоносного ПО необходимо поместить в подпапку, соответствующую его классу. Таким образом, при создании собственного набора данных изображений не забудьте собрать вредоносные программы по семействам во вложенные папки перед выполнением следующего шага.

Создание набора данных

Вот наши классы / семейства вредоносных программ в виде вложенных папок, содержащих PNG:

ImageDataGenerator.flow_from_directory() генерирует пакеты нормализованных данных тензорного изображения из соответствующих каталогов данных (в нашем случае семейства). Благодаря этой функции мы можем использовать наши изображения для обучения и тестирования.

  • target_size: изменяет размер всех изображений до указанного размера. Я выбрал (64 * 64) изображений.
  • batch_size: размер партии, которую мы будем использовать. В нашем случае у нас всего 9339 изображений, поэтому установка размера пакета выше этого значения ничего не изменит.

После создания наших пакетов мы можем использовать функцию train_test_split() для разделения данных между поездом и тестом, следуя (7 0–30) соотношение.

Вот соответствующий код:

Результат ImageDataGenerator().flow_from_directory():

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

Вот образец нашего набора данных:

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

Быстрый анализ

Согласно следующему рисунку, наш набор данных достаточно несбалансирован: более 30% изображений относятся к классу 2: Allaple.A и 17% к классу 3: Allaple.L!
Нам нужно будет решить эту проблему позже.

Давайте теперь построим нашу модель CNN

Модель CNN

Архитектура

Теперь, когда наш набор данных готов, мы можем построить нашу модель с помощью Keras. Будет использована следующая структура:

  • Сверточный слой: 30 фильтров, (3 * 3) размер ядра.
  • Максимальный уровень пула: (2 * 2) размер пула.
  • Сверточный слой: 15 фильтров, (3 * 3) размер ядра.
  • Максимальный уровень пула: (2 * 2) размер пула.
  • DropOut Layer: отбрасывает 25% нейронов.
  • Свести слой
  • Плотный / полностью связанный слой: 128 нейронов, функция активации Relu
  • DropOut Layer: отбрасывает 50% нейронов.
  • Плотный / полностью связанный слой: 50 нейронов, функция активации Softmax.
  • Плотный / полностью связанный слой: нейроны num_class, функция активации Softmax

input имеет форму [64 * 64 * 3]: [ширина * высота * глубина]. В нашем случае каждое вредоносное ПО представляет собой изображение в формате RGB.

Вот соответствующий код:

Несбалансированные данные

Доступно несколько методов для работы с несбалансированными данными. Я решил придать больший вес классу меньшинства и меньший вес классу большинства.

Функция sklearn.utilis.class_weights использует значения y для автоматической корректировки весов, обратно пропорциональных частотам классов во входных данных. Чтобы использовать этот метод, y_train не должен быть горячим кодированием.

Полученные результаты

После обучения и тестирования нашей модели мы достигли конечной точности 95%, что неплохо!

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

Мы можем заметить, что, хотя большинство вредоносных программ было хорошо классифицировано, Autorun.K всегда ошибочно принимают за Yuner.A. Вероятно, это связано с тем, что в нашем наборе данных очень мало образцов Autorun.K, и оба они являются частью близкого типа червя.

Более того, Swizzor.gen! E часто ошибочно принимают за Swizzor.gen! L, что можно объяснить тем, что они действительно близкие типы семейств и типов и, следовательно, могут иметь сходство в своем коде.

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

Вывод

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

Я надеюсь, что это руководство помогло вам в создании вашего проекта! Теперь, возможно, следующим шагом будет понимание как его развернуть 😉

Опять же, моей целью было дать простой урок о чьей-то большой работе, так что аплодируйте им! 🍺

Конечно, все доступно на моем Github.

Удачного дня!

использованная литература

Вот где я нашел свое вдохновение: