Программный подход в Java для сравнения файлов

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

Более конкретно, я бы хотел взять шестнадцатеричное представление файла .exe и сравнить его с серией сигнатур вирусов. Для этого подхода я планирую разбить шестнадцатеричное представление файла (exe) на отдельные группы по N символов (т.е. 10 шестнадцатеричных символов) и сделать то же самое с сигнатурой вируса. Я стремлюсь выполнить своего рода эвристику и, следовательно, статистически проверить, имеет ли этот exe-файл X% сходства с известной сигнатурой вируса.

Самый простой и, вероятно, очень неправильный способ, которым я думал это сделать, - это сравнить exe [n , n-1] против вируса [n, n-1], где каждый элемент в массиве является подмассивом, и, следовательно, exe1 [0,9] против вируса 1 [0,9]. Каждое подмножество будет оцениваться статистически.

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

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


Определение : Полиморфное вредоносное ПО (вирус, червь и т. Д.) Поддерживает те же функциональные возможности и полезную нагрузку, что и их «исходная» версия, но при этом очевидно имеет разные конструкции (варианты). Они достигают этого путем обфускации кода и, таким образом, изменения своей шестнадцатеричной подписи. Некоторые из методов, используемых для полиморфизма: изменение формата (вставка, удаление пробелов), переименование переменных, перестановка операторов, добавление ненужного кода, замена операторов (x = 1 меняется на x = y / 5, где y = 5), замена операторов управления. Так же, как вирус гриппа мутирует, и поэтому вакцинация неэффективна, полиморфные вредоносные программы мутируют, чтобы избежать обнаружения.


Обновление: После совета, который вы дали мне, ребята, относительно того, что делать; Я так и поступил, но это меня еще больше смутило. Я нашел несколько дистанционных алгоритмов, которые можно применить к моей проблеме, например:

  • Самая длинная общая подпоследовательность
  • Алгоритм Левенштейна
  • Алгоритм Нидлмана – Вунша
  • Алгоритм Смита – Ватермана
  • Алгоритм Бойера Мура
  • Ахо Алгоритм Корасика

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


Обновление 2: В итоге я использовал объединение LCSubsequence, LCSubstring и Levenshtein Distance. Спасибо всем за предложения.

Копия готовой статьи есть на GitHub

10
задан Carlos 10 May 2013 в 13:20
поделиться