сравнить два двоичных файла - PullRequest
4 голосов
/ 24 января 2011

Как мне различить два двоичных файла?

У меня есть две версии программы, версия 1 и версия 2. Я внес небольшое количество изменений между двумя версиями, но, к сожалению, не сделалрегулярно делал резервные копии, и поэтому, хотя у меня есть источник для версии 2, у меня есть только двоичный файл версии 1. Мне нужно выяснить, что именно я изменил между двумя версиями.Я попытался создать objdump из двух версий, а затем использовать diff, чтобы найти изменения, но это не работает, потому что смещения разные, и поэтому diff считает, что почти каждая строка изменилась.

ДляНапример, одна строка может быть bgez v0,4074d0<daemonize+0xd4> в версии 1 и bgez v0,4073d4<daemonize+0xd4> в версии 2. Они копируются непосредственно из файлов дампа - вы можете видеть, что две строки делают одно и то же, но diff не может их различить.Файлы слишком велики, чтобы я мог просматривать каждую строку вручную;Как обнаружить изменения функциональности, игнорируя при этом различия в смещении?

Ответы [ 5 ]

4 голосов
/ 08 августа 2011

Это возможно.В настоящее время я работаю над проектом, который способен искать адреса функций и указателей памяти из скомпилированного файла в новом / измененном двоичном файле.Он поддерживает двоичные файлы Windows PE и ELF для x86 и x86_64.Существует также документ, описывающий подход.Это хорошо работает для моего реверсивного проекта, где я должен часто обновлять все хуки и адреса памяти при выполнении двоичных обновлений.Но есть и другие варианты использования.

Проверьте это здесь.

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

3 голосов
/ 25 января 2011

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

1 голос
/ 24 января 2011

Краткий ответ: вы не можете.

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

0 голосов
/ 25 января 2011

Конечно, что-то вроде bsdiff сработает?

0 голосов
/ 24 января 2011

Вы можете использовать sed или awk (или perl или ...), чтобы написать фильтр, чтобы сделать все смещения идентичными перед запуском diff. Написание такого фильтра оставлено читателю в качестве упражнения. : -Р

...