Вычисление подобия двоичных данных

34
задан Chad Birch 24 February 2009 в 00:21
поделиться

10 ответов

Это кажется на желание двоичной дельты или возможно индекса, полученного на основании приложения двоичной дельты (как, он - размер). Вы могли тогда сравнить этот индекс с некоторой базовой линией, которую Вы решаете экспериментально решать, является ли это "клон" или нет.

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

Однако попарное сравнение каждого двоичного файла в Вашей базе данных является, вероятно, непомерно дорогим (O (n <глоток> 2 ), я думаю). Я попытался бы найти простой хеш для идентификации возможных кандидатов на сравнение. Что-то концептуально подобное тому, что предлагают spdenne и Eduard. Таким образом, найдите хеш, который может быть применен к каждому объекту однажды, вид, которые перечисляют и затем используют более прекрасное гранулярное сравнение на объектах, хеши которых находятся близко друг к другу в списке.

хеши Построения, полезные для общего случая, была активно преследуемая тема исследования в CS в течение нескольких лет. библиотека программного обеспечения LSHKit реализует некоторые алгоритмы этого вида. Интернет доступная бумага НАХОДЯЩИЕ ПОДОБНЫЕ ФАЙЛЫ В БОЛЬШОЙ ФАЙЛОВОЙ СИСТЕМЕ кажутся, что это могло бы быть предназначено больше для сравнения текстовых файлов, но могло бы быть полезно для Вас. Более свежая бумага подобие Мультиразрешения, хеширующее , описывает более мощный алгоритм. Это, кажется, не доступно без подписки, все же. Вы, вероятно, хотите сохранить статью Википедии о Местность Чувствительное Хеширование удобный, поскольку Вы просматриваете другие ресурсы. Они все становятся довольно техническими, и сама статья в Википедии является симпатичной тяжелой математикой. Как более удобная для пользователя альтернатива Вы могли бы быть в состоянии применить некоторые идеи (или даже исполняемые файлы) от поля Акустическое Снятие отпечатков пальцев .

, Если Вы готовы отказаться от общего случая, вероятно, что можно найти намного более простое (и быстрее) проблемно-ориентированной хеш-функцией, которая работает только на ROMs. Возможно что-то включающее размещение стандарта, или распространенный, последовательности байта и значение избранных битов около них. Я действительно не знаю много о Вашем двоичном формате, но я воображаю вещи, которые сигнализируют о запуске разделов в файле как регионы для звука, изображений или текста. Двоичные форматы часто хранят адреса этих видов разделов около начала файла. Некоторые также используют механизм объединения в цепочку, который хранит адрес первого раздела в известном местоположении наряду с, он - размер. Это позволяет Вам перемещаться в следующий раздел, который также содержит размер и т.д. Немного расследования, вероятно, позволит Вам обнаруживать любое соответствующее форматирование, если Вы не будете уже знать о нем и должны будете поместить Вас хорошо на Ваш путь к построению полезного хеша.

, Если хеш-функции не получают Вас полностью (или они требуют, чтобы какой-то вход определил метрику/расстояние), тогда существует несколько двоичных алгоритмов дельты и имеющихся в сети реализаций. Тот, с которым я являюсь самым знакомым, используется системой управления версиями подрывной деятельности. Это использует двоичный алгоритм дельты, названный xdelta для эффективного хранения изменений двоичного файла. Вот ссылка непосредственно на файл в их репозитории, который реализует его: xdelta.c. Существует, вероятно, инструмент в сети, которая делает это более доступным также.

20
ответ дан Waylon Flinn 11 October 2019 в 06:58
поделиться

Я думаю, что некоторые методы, одолженные от сжатия данных, могли быть интересными здесь:

Предполагают, что у Вас есть два файла, A и B.

Сжатие каждый файл индивидуально и добавляют сжатые размеры вместе. Затем свяжите эти два файла в единственный, большой файл и сожмите его также.

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

я предлагаю, чтобы Вы попробовали Преобразование Burrow Wheeler (bzip2), чтобы сделать сжатие. Большинство других алгоритмов сжатия только имеет ограниченную историю. Алгоритм BWT otoh может работать над очень большими блоками данных. Алгоритм "видит" оба файла одновременно, и любое подобие приведет к более высокой степени сжатия.

3
ответ дан Nils Pipenbrinck 11 October 2019 в 06:58
поделиться

XDelta довольно полезен для получения достойного двоичного файла diffs: http://xdelta.org

2
ответ дан Rik Hemsley 11 October 2019 в 06:58
поделиться

Используйте некоторые идеи от Обнаружение Плагиата алгоритмы.

Моя идея:

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

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

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

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

Хранилище этот график на ROM. Сравните графики частоты для двух различных ROMs путем вычисления суммы квадратов различия в частотах для каждого значения хэш-функции. Если это суммирует для обнуления тогда ROMs, то вероятно, будут идентичны. Еще дальше от нуля это, менее подобное, которым будет ROMs.

7
ответ дан Stephen Denne 11 October 2019 в 06:58
поделиться

Как Waylon Flinn сказал, Вам, возможно, понадобится двоичный алгоритм дельты. rsync алгоритм является хорошим. Это быстро и надежно. См. также документация утилиты .

1
ответ дан Yuval F 11 October 2019 в 06:58
поделиться

Трудность здесь состоит в том, что, так как Вы имеете дело с исполняемым кодом, простые изменения могут распространить через весь ROM. Адреса и смещения для ВСЕХ значений могут измениться с добавлением единственной переменной или пустой команды. Это сделает даже основанное на блоке хеширование бесполезным.

А быстрое-и-грязное решение состояло бы в том, чтобы изрубить решение с difflib (или эквивалентный w/Ваш любимый язык), так как это получает Вас скользящее сравнение, которое может иметь дело с дополнением данных или удалением. Разделите ROM на исполняемый файл и разделы данных (если возможный). Раздел данных может быть сравнен непосредственно и , отношение подобия вычислило , хотя у Вас все еще будут проблемы w/адресами или смещениями.

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

неудачная часть - то, что это - все еще O (n^2) операция на количестве ROMs, который Вы отслеживаете, но это может быть облегчено с (возрастающей) кластеризацией или основанным на частоте порядком сравнения уменьшить сумму необходимых сравнений.

1
ответ дан HUAGHAGUAH 11 October 2019 в 06:58
поделиться

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

Nils Pipenbrinck входил в то же направление как мой существующий метод. Так как одним из основных результатов нахождения клонов являются огромные сбережения от серьезной архивации, я полагал, что мог просто попытаться сжать любые два ROMs вместе и видеть, сколько свободного места было оставлено. Я использую алгоритм LZMA в 7zip для этого.

первый шаг должен сжать каждый ROM индивидуально и отметить сжатый размер, затем попытаться архивировать любые два ROMs вместе и видеть, насколько получающийся размер отличается от сжатых размеров их человека. Если объединенный размер совпадает с суммой отдельных размеров, они на 0% подобны, и если размер совпадает с одним из них (самый большой), они идентичны.

Теперь, это - огромное количество требуемых попыток сжатия, таким образом, у меня есть несколько оптимизации до сих пор (и хотел бы выяснить больше):

  1. Располагают по приоритетам сравнения на основе того, насколько подобный сжатые размеры. Если ROM A имеет сжатый размер 10 МБ, и ROM B имеет сжатый размер 2 МБ, для них невозможно быть больше, чем подобных 20%, настолько выдерживающих сравнение их для получения реального результата можно оставить до позже. Выполнение того же алгоритма сжатия для высоко подобных файлов имеет тенденцию приводить к результатам подобного размера, таким образом, это находит много клонов очень быстро.

  2. Объединенный с вышеупомянутым, сохраните и верхние и более низкие "границы" на возможном подобии между любой парой ROMs. Это позволяет дальнейшее установление приоритетов. Если ROMs A и B на 95% подобны, и ROMs B, и C только на 2% подобны, то Вы уже знаете, что A и C между 0% и 7%. Это слишком низко, чтобы быть клоном, таким образом, это сравнение может быть безопасно отложено или даже проигнорировано полностью, если я действительно не хочу знать точные общие черты всего.

6
ответ дан Chad Birch 11 October 2019 в 06:58
поделиться

Две мысли:

  • Рассматривают организацию файла как график потока данных и выполнение некоторой канонизации на этом represention. Так как Вы знаете систему команд, это может быть выполнимо, возможно, просто связав дизассемблер и делая некоторую обработку текста.
  • А обучаемый классификатор такой как CRM114 мог бы пригодиться для предоставления Вам компактное представление, которое дает Вам некоторое представление, имеют ли двоичные файлы много общего.
1
ответ дан Liudvikas Bukys 11 October 2019 в 06:58
поделиться

Можно запустить путем хранения чего-то как хэш-деревья . Только необходимо сохранить один такой набор хешей для каждого ROM, и необходимое пространство памяти только пропорционально (но намного ниже, чем) размер ROM, принимая постоянный размер блока. Выбранный размер блока должен дать достаточную гранулярность для обеспечения точности, например: для минимального размера 128 МиБ, ограничения точности 1% и хеш Tiger 128 (подобный тому, что они используют для проверки файлов, переданных через DirectConnect), размер блока 1 МиБ делает прекрасный, и можно сохранить все хеши в 128 * 128 / 8 = 2 048 байтов! Так выполнение его для 10,000 ROMs только потребовало бы приблизительно 20 МиБ пространства. Далее, можно выбрать менее безопасный, но более быстрый и/или меньший хеш. При добавлении/проверке для подобия новый ROM повлек бы за собой что-то как:

  1. Разделение новый ROM в блоках и хеше каждый из них.
  2. Для каждого ROM уже в базе данных, сравните (см. ниже), ее хеши с хешами нового ROM.

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

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

1
ответ дан Eduard - Gabriel Munteanu 11 October 2019 в 06:58
поделиться

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

11
ответ дан jpalecek 11 October 2019 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: