Каким будет наилучший подход для сравнения двух шестнадцатеричных сигнатур файлов друг с другом для сходства.
В частности, я бы хотел сделать шестнадцатеричное представление файла .exe и сравнить его с серией вирусных сигнатур. Для этого подхода я планирую разбить шестнадцатеричное представление файла (exe) на отдельные группы из N символов (т.е. 10 шестнадцатеричных символов) и сделать то же самое с сигнатурой вируса. Я пытаюсь выполнить какую-то эвристику и, следовательно, статистически проверить, имеет ли этот файл exe X% сходства с известной сигнатурой вируса.
Простейший и, вероятно, очень неправильный способ, которым я думал об этом, - сравнить exe [n, n-1] с вирусом [n, n-1], где каждый элемент в массиве является вспомогательным массивом, и поэтому exe1 [0,9] против вируса1 [0,9]. Каждое подмножество будет классифицироваться статистически.
Как вы можете понять, будет огромное количество сравнений и, следовательно, очень медленное. Поэтому я подумал спросить, можете ли вы, ребята, подумать о более подходящем подходе для такого сравнения, например, совместно использовать разные структуры данных.
Это для проекта, который я делаю для своего BSc, где я пытаюсь разработать алгоритм обнаружения полиморфных вредоносных программ, это только одна часть всей системы, где другая основана на генетических алгоритмах для разработки статической сигнатуры вируса. Любые советы, комментарии или общая информация, такая как ресурсы, очень приветствуются.
Определение. Полиморфное вредоносное ПО (вирус, червь,...) поддерживает ту же функциональность и полезную нагрузку, что и их "оригинальная" версия, имея по-видимому разные структуры (варианты). Они достигают этого путем обфускации кода и, таким образом, изменяя свою шестую подпись. Некоторые из методов, используемых для полиморфизма; изменение формата (вставить удаление пробелов), переименование переменной, перестановку операторов, добавление младшего кода, замену оператора (x = 1 изменяется на x = y/5, где y = 5), свопинг управляющих операторов. Так как вирус гриппа мутирует, и поэтому вакцинация не эффективна, полиморфные вредоносные программы мутируют, чтобы избежать обнаружения.
Обновление: После того, как вы посоветуете, вы, ребята, дали мне то, что читаете; Я сделал это, но это несколько смутило меня. Я нашел несколько алгоритмов расстояний, которые могут применяться к моей проблеме, например:
- Самая длинная общая подпоследовательность
- алгоритм Левенштейна
- Алгоритм Needleman-Wunsch
- Смит-Уотерман алгоритм
- алгоритм Бойера Мура
- Алгоритм Aho Corasick
Но теперь я не знаю, что использовать, все они, похоже, делают то же самое по-разному. Я продолжу заниматься исследованиями, чтобы лучше понять каждую из них; но в то же время вы могли бы высказать свое мнение по поводу which might be more suitable
, чтобы я мог придать ему приоритет во время моих исследований и изучить его глубже.
Обновление 2: Я закончил использование объединения LCSubsequence, LCSubstring и Levenshtein Distance. Спасибо всем за предложения.
Существует копия готовой бумаги на GitHub