Найдите совпадающие последовательности в двух двоичных файлах

StackOverflow https://stackoverflow.com/questions/119651

  •  02-07-2019
  •  | 
  •  

Вопрос

Позвольте мне начать с небольшой предыстории.

Сегодня утром один из наших пользователей сообщил, что антивирус CA сообщил, что установочный файл Testuff заражен вирусом.Уверенный, что это было ложное срабатывание, я поискал в Интернете и обнаружил, что пользователи другой программы (SpyBot) сообщили о той же проблеме.

А теперь собственно вопрос.

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

Я попробовал следующее на Python, но оно работает уже давно, и мне было интересно, есть ли лучший или более быстрый способ.

from difflib import SequenceMatcher

spybot = open("spybotsd160.exe", "rb").read()
testuff = open("TestuffSetup.exe", "rb").read()

s = SequenceMatcher(None, spybot, testuff)
print s.find_longest_match(0, len(spybot), 0, len(testuff))

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

Это было полезно?

Решение

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

Использование перла Дерево::Суффикс может быть самым простым решением.По-видимому, он дает все распространенные подстроки в указанном диапазоне длин:

@lcs = $tree->lcs;
@lcs = $tree->lcs($min_len, $max_len);
@lcs = $tree->longest_common_substrings;

Другие советы

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

Почему бы вам не связаться с CA и не попросить их рассказать, что они ищут, а именно этот вирус?

Или вы можете скопировать файл и изменять каждый отдельный байт, пока предупреждение не исчезнет (это может занять некоторое время в зависимости от размера).

Возможно, обнаружение вируса может быть намного сложнее, чем простой поиск фиксированной строки.

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

Если вас это интересует - здесь Документ .ps связан здесь вы можете найти хорошее введение в эту тему.

Существует ли хорошая реализация этих алгоритмов, я не могу сказать.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top