Обнаружение вредоносного ПО с помощью алгоритмов МО на облачной платформе Google |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2021-10-08 04:45 Индустрия вредоносного программного обеспечения по-прежнему остается отлично организованным, хорошо финансируемым рынком, нацеленным на обход традиционных мер безопасности. Заражая компьютеры вредоносными программами, преступники тем или иным способом могут нанести ущерб как потребителям, так и предприятиям. В этой статье я расскажу:
1. Бизнес-проблема 1.1. Что такое малварь? Английский термин “malware” (“малварь”) — это сложносокращенное слово от “malicious software” (вредоносное программное обеспечение). Если коротко, вредоносное ПО — это любая часть программного обеспечения, написанная с намерением нанести вред данным, устройствам или людям. 1.2. Постановка проблемы В последние несколько лет индустрия вредоносных программ развивалась очень быстро. Преступные синдикаты вкладывают значительные средства в технологии, позволяющие избежать традиционных мер безопасности. Это вынуждает группы/сообщества по защите от вредоносных программ создавать более надежное программное обеспечение для обнаружения и предотвращения хакерских атак. Основная часть защиты компьютерной системы от малварь заключается в определении того, является ли данный файл/программное обеспечение вредоносным ПО. 1.3 Источник/полезные ссылки Корпорация Майкрософт уже много лет активно занимается созданием антивирусных продуктов. Ее утилиты для защиты от вредоносных программ запущены на более чем 150 миллионах компьютеров по всему миру. Это генерирует десятки миллионов ежедневных точек данных, которые необходимо анализировать как потенциально вредоносные программы. Чтобы эффективно анализировать и классифицировать такие большие объемы данных, необходимо научиться группировать вредоносы и идентифицировать каждую группу. Набор данных, собранный корпорацией Майкрософт, содержит около 9 классов вредоносных программ. 1.4. Реальные/бизнес-цели и ограничения
2. Проблема датасета/машинного обучения 2.1. Данные 2.1.1. Обзор данных
Типы вредоносных программ:
2.1.2. Пример точки данных asm-файл .text:00401000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing bytes-файл 00401000 00 00 80 40 40 28 00 1C 02 42 00 C4 00 20 04 20 2.2. Сопоставление реальной проблемы с проблемой МО 2.2.1. Тип проблемы машинного обучения Существует 9 различных классов вредоносных программ, которые нам необходимо классифицировать по заданной точке данных => Проблема многоклассовой классификации 2.2.2. Показатели эффективности Метрики:
2.2.3. Цели и ограничения машинного обучения Цель: Установить вероятность принадлежности каждой точки данных к одному из 9 классов. Ограничения: * Нужна вероятностная оценка классов. * Исключить ошибки в вероятностной оценке классов =>Метрика — логистическая функция потерь. *Определенные ограничения по времени. 2.3. Датасет для машинного обучения и тестирования Рандомное разделение датасета на три части:
2.4. Полезные блоги, видео и справочные материалы http://blog.kaggle.com/2015/05/26/microsoft-malware-winners-interview-1st-place-no-to-overfitting/ Решение, занявшее первое место на конкурсе Kaggle: https://www.youtube.com/watch?v=VLQTRlLGz5Y “Перекрестная проверка более надежна, чем знание предметной области”. 3. Использование облачной платформы Google (GCP) Я создал экземпляр GCP с хранилищем 500 ГБ и 8-ядерными VCPU с 32 ГБ оперативной памяти. Использование SSH оболочки экземпляра напрямую может привести к исчерпанию хранилища при выполнении определенного количества операций с файлами. Поскольку данное тематическое исследование требовало операций с файлами, я воспользовался механизмом переадресации портов. Шаг -1 Создаем экземпляр, указанный ниже. Перед этим обязательно создаем брандмауэр. Как только и то, и другое будет сделано, можно создать внешний IP-адрес со статическим типом и назначить экземпляр. Созданный экземпляр Google Cloud Шаг -2 Устанавливаем Google Cloud SDK по указанному ниже URL-адресу. https://cloud.google.com/sdk/docs/quickstart Шаг -3 На этом решающем этапе используем переадресацию портов, как показано ниже. Формат: gcloud compute ssh --ssh-flag="-L <tcp port>:localhost:<tcp port>" --zone "<zone>" "<instance name>" Пример: gcloud compute ssh --ssh-flag="-L 8888:localhost:8888" --zone "us-central1-a" "instance-1" Шаг -4 Теперь используем приведенную ниже команду, чтобы открыть jupyter notebook. jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser & Теперь открываем браузер Chrome и вводим IP экземпляра: TCP Port После введения команды Jupyter notebook вы получите токен в консоли (можете использовать то же самое для постоянной установки пароля). Когда все шаги будут выполнены, jupyter notebook отобразится на Google Compute Engine, как показано ниже. Как видно на рисунке ниже, я использовал 56% из назначенных 492 ГБ. Все в облачном хранилище!!! Разве это не здорово? 4. Загрузка и извлечение файлов 4.1 Загружаем датасет из Kaggle Я использовал расширение CurlWget, которое доступно в магазине Google Chrome. Он поможет загрузить датасет из Kaggle и его Cancel. Открываем CurlWget, копируем ссылку и открываем jupyter notebook. В ячейке напечатайте то, что указано ниже. ! <link> Запустив ячейку, вы будете поражены тому, как быстро она загружается. При этом хранилище в вашей локальной среде не используется. 4.2 Распаковываем/извлекаем сжатый файл Устанавливаем 7zip с помощью команды PIP в ячейке jupyter notebook и извлекаем файлы определенных типов с помощью вышеуказанной команды. В приведенном выше коде извлекаем .bytes-файлы из сжатого файла train.7z. 5. Поисковый анализ данных Наконец все необходимые библиотеки импортированы. Теперь нужно графически отобразить распределение классов вредоносных программ. Поскольку это многоклассовая классификация из 9 классов, я использовал приведенный ниже код. Как видим, самая высокая метка у класса 3, а самая низкая — у класса 5. Теперь рассчитаем размер byte-файла и построим диаграмму размаха для краткого обзора максимальных размеров классов. Как видно из приведенного выше графика, byte-файлы класса 2 имеют максимальные размеры файлов, т. е. приблизительно 8 МБ. 6. Разработка функциональных возможностей Я произвел следующие вычисления и сохранил датасет в Google Cloud: 6.1 Униграмма byte-файлов с размерами byte-униграммы приведены в датасете, который можно сохранить в файле CSV и прочитать позже, как показано ниже. 6.2 Униграмма asm-файлов с размерами asm-униграммы приведены в датасете, который можно сохранить в файле pickle и прочитать позже, как показано ниже. 6.3 Биграмма byte-файлов (выбрано 2000 лучших из 66308 функций) Приступая к созданию биграмм byte-файлов, я понимал, что подобная задача может время от времени убивать ядро python, потому что датасет требует вычислений почти 66,5 тыс. функций. Поэтому я использовал многопроцессорную обработку и вычислил разреженные матрицы, как показано ниже. import scipy import warnings from datetime import datetime def generate_sparse_matrices(files): #Ref: https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing from multiprocessing import Pool files = os.listdir('byteFiles') all_byte_files = [byte_files_part_1, byte_files_part_2, byte_files_part_3, byte_files_part_4] print("Multiprocessing is commenced... ") p.map(generate_sparse_matrices, all_byte_files) print(" Multiprocessing is completed and resides in ", os.getcwd()) Когда разреженные матрицы были созданы, я объединил их и подготовил окончательный датасет. Аналогично, я объединил созданные метки классов, чтобы избежать неправильного присвоения классов файлам. from scipy import sparse sparse_file = sparse.load_npz('sparse_bytefile_bigrams.npz') byteclass_file_1 = np.load('dict_fileclasses_1943.npy', allow_pickle = True) byteclass_file_2 = np.load('dict_fileclasses_1944.npy', allow_pickle = True) byteclass_file_3 = np.load('dict_fileclasses_1945.npy', allow_pickle = True) byteclass_file_4 = np.load('dict_fileclasses_1946.npy', allow_pickle = True) id_classes = pd.concat([class_labels_1, class_labels_2,class_labels_3, class_labels_4], axis = 0) Используя тест хи-квадрат, я выбрал 2000 лучших объектов и подготовил датасет. #Использование теста хи-квадрат для получения 2000 лучших функций из 66307 from numpy import hstack clf = SelectKBest(chi2, k=2000) bigrams_2000_indices = clf.get_support(indices = True) selected_columns_matrix = np.zeros((10868, 0)) byte_bigrams_df = pd.DataFrame(selected_columns_matrix, columns = np.take(features, bigrams_2000_indices)) Как видно ниже, я подготовил набор данных bigrams, содержащий 2000 функций. 6.4 Биграмма asm-файлов (выбрано 500 лучших из 676 функций) Ниже представлены подготовленные мной биграммы кодов операций с asm-файлами. opcodes = ['jmp', 'mov', 'retf', 'push', 'pop', 'xor', 'retn', 'nop', 'sub', 'inc', 'dec', 'add','imul', 'xchg', 'or', 'shr', 'cmp', 'call', 'shl', 'ror', 'rol', 'jnb','jz','rtn','lea','movzx'] def asm_bigram(opcodes): def opcode_collect(): from scipy.sparse import csr_matrix vectorizer = CountVectorizer(ngram_range=(2, 2), vocabulary = asm_bigrams) for i in tqdm(range(10868)): sparse.save_npz('opcodebigrams_sparse.npz',opcodebigrams_sparse) В ходе подготовки набора данных я удалил столбцы, в которых присутствует только 1 уникальное значение, и выбрал 500 лучших объектов с помощью библиотеки теста хи-квадрат. from scipy import sparse opcodebigramse = sparse.load_npz('opcodebigrams_sparse.npz') #удаление столбцов, в которых присутствует только 1 уникальное значение. #Выбор 500 лучших функций с помощью теста хи-квадрат clf = SelectKBest(chi2, k=500) cols = X.columns[bigram_500_indices] 6.5 Триграмма asm-файлов (выбрано 800 лучших из 17 тысяч функций) Я прочитал разреженную матрицу, созданную для триграмм кода операции, и подготовил набор данных с 800 лучшими функциями, используя тест хи-квадрат opcode_trigram_sparse = sparse.load_npz('opcodetrigram.npz') unique_cols = opcodetrigrams_df.nunique() # отбрасывание ненужных столбцов X = opcodetrigrams_df.drop('ID', axis = 1) #Выбор 800 лучших функций триграммы clf = SelectKBest(chi2, k=800) trigram_800_indices = clf.get_support(indices = True) cols = X.columns[trigram_800_indices] 6.6 Особенности изображений asm-файлов (выбрано 800 лучших) Я создал изображения каждого asm-файла и задал путь сохранения. Как только все изображения были сохранены, я вычислил 800 лучших функций. def extract_images_from_text(arr_of_filenames, folder_to_save_generated_images): directory_to_save_generated_image = root_path + 'image_asm_files' file_list_asm_files=os.listdir('image_asm_files') with open(root_path + "asm_image_top_800_df.csv", mode='w') as top_800_image_asm_df: Это заключительные функции, объединенные вместе. Я пробовал различные типы функций, чтобы добиться логистической функции потерь в 0,01, но не смог. Только последние функции помогли мне добиться логистической функции потерь 0,01. Вы можете обратиться к ссылке GitHub, приведенной выше, для завершения экспериментов. Я использовал библиотеку тестов хи-квадрат для выбора лучших функций. Это делается для уменьшения размерности набора данных, поскольку pandas не может хорошо справляться с большими наборами данных. 6.7 Объединение всех функций Я объединил все функции, чтобы разделить наборы данных для машинного обучения и тестирования. 7. Пробный метод Учитывая цель нашего тематического исследования — достичь логистической функции потерь 0,1, — лучше всего подготовить продвинутые функции с использованием N-граммы и объединить их. В приведенном ниже разделе мы применили модели машинного обучения к окончательно подготовленному набору данных. 8. Классификатор Random Forest Используя классификатор Random Forest, мы добились логистической функции потерь 0,02, как показано ниже. 9. Классификатор XGBoost Есть!!! Мы достигли логистической функции потерь 0,01 с помощью XGBoost. Следовательно, мы можем выбрать модель XGBoost для повышения производительности и точности с наименьшим значением логистической функцией потерь. 10. Сравнение моделей В этом разделе я сравниваю все модели, участвовавшие в эксперименте с различными типами функций, включая выбранные в конце функции. Для знакомства с остальными моделями можете посетить мой профиль на GitHub. 11. Вывод
Читайте также:
Источник: m.vk.com Комментарии: |
|