Сравнить бинарные файлы linux

Обновлено: 08.07.2024

каков самый простой способ достижения цели? Стандартный инструмент? Какой-то сторонний инструмент?

(Примечание: cmp -l должны быть убиты огонь, он использует десятичную систему для смещений и восьмеричную для байтов.)

это выведет смещение и байты в hex:

или -1 , чтобы первое печатное смещение начиналось с 0.

к сожалению, strtonum() специфичен для GAWK, поэтому для других версий awk-например, mawk-вам нужно будет использовать функцию преобразования восьмеричного в десятичное число. Например,

сломанный вне для считываемости:

попробовать diff в следующей комбинации замещения процесса zsh/bash и colordiff в CLI:

  • -y показывает вам различия бок о бок (необязательно)
  • xxd является инструментом CLI для создания вывода шестнадцатеричного двоичного файла
  • colordiff будет раскрасить diff вывод (установка через: sudo apt-get install colordiff )
  • добавить -W200 to diff шире вывод
  • если файлы большие, добавьте ограничение (например, -l1000 ) для каждого xxd

binary file output in terminal - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff

есть инструмент DHEX, которые могут сделать работу, и есть еще один инструмент под названием VBinDiff.

для строго командной строки, попробуйте JDIFF.

метод, который работает для добавления / удаления байтов

создать тестовый случай с одним удалением байта 64:

если вы также хотите увидеть ASCII версию символа:

протестировано на Ubuntu 16.04.

предпочитаю od over xxd потому что:

  • it is POSIX, xxd нет (поставляется с Vim)
  • имеет -An удалить столбец адреса без awk .

при использовании hexdumps и text diff для сравнения двоичных файлов, особенно xxd , добавления и удаления байтов становятся сдвигами в адресации, которые могут затруднить просмотр. Этот метод указывает xxd не выводить адреса, а выводить только один байт в строке, которая в свою очередь показывает, какие именно байты были изменены, добавлены или удалены. Вы можете найти адреса позже, ища интересные последовательности байтов в более " нормальном" вывести (вывод xxd first.bin ).

Я бы рекомендовал hexdump для демпинга двоичных файлов в текстовый формат и kdiff3 для просмотра различий.

hexdiff - это программа, предназначенная, чтобы делать именно то, что вы ищете.

он отображает шестнадцатеричный (и 7-битный ASCII) из двух файлов один над другим, с выделенными различиями. Посмотри на man hexdiff для команд перемещения в файле, и простой q уйдет.

он не может строго ответить на вопрос, но я использую это для разных двоичных файлов:

он печатает оба файла как hex и ASCII значения, один байт в строке, а затем использует средство Vim diff, чтобы визуализировать их визуально.

DHEX-это больше, чем просто еще один шестнадцатеричный редактор: он включает режим diff, который можно легко и удобно использовать для сравнения двух двоичных файлов. Так как он основан на ncurses и является themeable, он может работать на любом количестве систем и сценариев. Благодаря использованию журналов поиска можно легко отслеживать изменения в различных итерациях файлов.

можно использовать gvimdiff инструмент, который входит в vim-gui-common пакета

sudo apt-получить обновление

sudo apt-get install vim-gui-common

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

Tha все. Надеюсь, что помощь !

перейти на продукт с открытым исходным кодом на Linux (и все остальное) является Radare, которая содержит radiff2 специально для этой цели. Я проголосовал, чтобы закрыть это потому, что сам и другие тот же вопрос, в вопросе вы спрашиваете

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

немного практичнее radiff -O . The -O для ""код не сравниваете с все байты, а не просто фиксированный код байт""

как IDA Pro, Radare является основным инструментом для бинарного анализа, вы также можете показать Дельта диффинг с -d , или отображать разобранные байты вместо hex с -D .

Мне нужно сравнить два двоичных файла и получить вывод в виде:

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

за каждый другой байт. Так что, если file1.bin есть

в двоичном виде и file2.bin является

Я хочу получить что-то вроде

Есть ли способ сделать это в Linux? Я знаю, cmp -l но он использует десятичную систему для смещений и восьмеричную для байтов, которых я хотел бы избежать.

вы в основном ищете "бинарный дифференциал". я могу вообразить какой-то по-настоящему уродливый однострочник командной строки с od . Поскольку вы не можете ответить на этот вопрос (поскольку вы не пользователь), я голосую, чтобы закрыть. Бинарный diff, как явно запрашивается здесь, совсем не полезен, и я склонен думать, что вы хотите что-то полезное, если вы вставляете один байт в начало файла, все ли байты должны быть помечены как разные? Не зная этого, это просто слишком расплывчато. @EvanCarroll Если вы думаете, что вопрос не по теме, почему вы отвечаете на него?

Это выведет смещение и байты в шестнадцатеричном виде:

Или сделать так, $1-1 чтобы первое напечатанное смещение начиналось с 0.

К сожалению, strtonum() это специфично для GAWK, поэтому для других версий awk - например, mawk - вам нужно будет использовать функцию преобразования восьмеричного числа в десятичное. Например,

Вычеркнуто для удобства чтения:

@gertvdijk: strtonum специфично для GAWK. Я считаю, что Ubuntu ранее использовал GAWK по умолчанию, но в какой-то момент переключился на mawk . В любом случае GAWK можно установить и установить по умолчанию (см. Также man update-alternatives ). Смотрите мой обновленный ответ для решения, которое не требует strtonum . Почему бы просто не сравнить сумму sha256 обоих файлов? @Rodrigo: Этот и другие методы покажут, отличаются ли файлы. Мой ответ соответствует требованию ОП, чтобы показать, в чем заключаются различия. Конечно! Извините, я так волновалась о своей проблеме, что едва читала ОП. Спасибо.

Как сказал Кряк :

В Bash: diff <(xxd b1) <(xxd b2) но выходной формат этого (или вашего) далеко не соответствует тому, что запрашивал OP. с помощью vimdiff он будет окрашивать байты в строках, где эти два «файла» различаются Ой, почему я не подумал об этом? И я уверен, что я использовал эту технику и в прошлом. Это прекрасно сработало для меня (с opendiff OS X вместо vimdiff ) - представление по умолчанию xxd обеспечивает, что механизм сравнения отслеживает сравнение байтов за байтом. При использовании простого (необработанного) шестнадцатеричного кода, в который просто помещается столбец fold , я diff бы попытался сложить / сгруппировать случайные вещи в файлах, которые я сравнивал. Эта команда плохо работает для удаления байтов, так как каждая следующая строка будет выровнена и будет видна как измененная diff . Решение состоит в том, чтобы поместить 1 байт в строку и удалить столбец адреса, как предложено Джоном Лоуренсом Аспденом и мной .

diff + xxd

Попробуйте diff использовать следующую комбинацию подстановки zsh / bash:

  • -y показывает различия между собой (необязательно).
  • xxd инструмент CLI для создания шестнадцатеричного вывода двоичного файла
  • Добавить -W200 к diff для более широкого выхода (из 200 символов в строке).
  • Для цветов используйте colordiff как показано ниже.

colordiff + xxd

Если у вас есть colordiff , он может раскрасить diff вывод, например:

В противном случае установить через: sudo apt-get install colordiff .

вывод двоичного файла в терминале - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff

vimdiff + xxd

Вы также можете использовать vimdiff , например,

  • если файлы слишком большие, добавьте ограничение (например -l1000 ) для каждого xxd
Команду можно упростить как colordiff -y <(xxd foo1.bin) <(xxd foo2.bin) . Если у вас нет colordiff, это сделает то же самое без цветов: diff -y <(xxd foo1.bin) <(xxd foo2.bin) Если вы просто хотите узнать, являются ли оба файла на самом деле одинаковыми, вы можете использовать переключатель -q или --brief , который будет отображать вывод только тогда, когда файлы различаются. создать xxddiff для этого функцию с: xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; ) здорово! diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim - Тем не менее, сделаю работу хорошо enoug

Есть инструмент под названием DHEX, который может сделать эту работу, и есть другой инструмент, который называется VBinDiff .

Для строго командной строки, попробуйте jojodiff .

DHEX потрясающе сравнивает двоичные файлы - это то, что вы хотите сделать. Подайте в него два файла, и вы сразу перейдете к сравнительному виду, выделив различия, и легко сможете перейти к следующему различию. Также он может работать с большими терминалами, что очень полезно на широкоэкранных мониторах. Я предпочитаю VBinDiff. DHEX использует процессор даже на холостом ходу, я думаю, что он постоянно перерисовывается или что-то в этом роде. VBinDiff не работает с широкими терминалами. Но адреса в любом случае становятся странными с широкими терминалами, поскольку у вас больше 16 байтов на строку. vbindiff позволяет нам на самом деле редактировать файл, спасибо! Сжатые файлы @DanielBeauyat будут совершенно другими после того, как вы столкнетесь с первым другим байтом. Вывод вряд ли будет полезным. @ 1111161171159459134 jdiff является частью "набора" программ для синхронизации и исправления различий, обнаруженных jdiff. Но, как сказал Марк Рэнсом, на сжатых файлах это было бы неразумно; исключение составляют «синхронизируемые» сжатые форматы (например, созданные gzip --rsyncable), в которых небольшие различия в несжатых файлах должны оказывать ограниченное влияние на сжатый файл.

Метод, который работает для добавления / удаления байтов

Создайте тестовый пример с единственным удалением байта 64:

Если вы также хотите увидеть ASCII-версию персонажа:

Проверено на Ubuntu 16.04.

Я предпочитаю od более , xxd потому что:

  • это POSIX , xxd нет (поставляется с Vim)
  • имеет, -An чтобы удалить столбец адреса без awk .

При использовании hexdumps и text diff для сравнения двоичных файлов, особенно xxd , добавления и удаления байтов становятся изменениями в адресации, что может затруднить просмотр. Этот метод говорит xxd не выводить адреса и выводить только один байт на строку, что, в свою очередь, показывает, какие именно байты были изменены, добавлены или удалены. Вы можете найти адреса позже, выполнив поиск интересных последовательностей байтов в более "нормальном" hexdump (вывод xxd first.bin ).

Я бы порекомендовал hexdump для выгрузки двоичных файлов в текстовый формат и kdiff3 для просмотра различий.

Даже здесь, в Bash kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin) без необходимости создавать файлы myfile1.hex и myfile2.hex .

Это hexdiff программа, предназначенная для того, чтобы делать именно то, что вы ищете.

Он отображает шестнадцатеричный (и 7-битный ASCII) двух файлов один над другим с выделением любых различий. Посмотрите на man hexdiff команды для перемещения в файле, и простое q закроется.

Но это делает довольно плохую работу, когда дело касается сравнения. Если вы вставите несколько байтов в файл, он @ Мурмель, пока я согласен, не об этом ли здесь спрашивают? @EvanCarroll true, и поэтому я оставил комментарий (только) и не понизил голос

Возможно, он не совсем отвечает на вопрос, но я использую это для сравнения двоичных файлов:

Он распечатывает оба файла в виде шестнадцатеричных и ASCII- значений, по одному байту на строку, а затем использует средство сравнения Vim для визуальной визуализации.

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

Я никак не связан с dhex. Я скопировал описание автора в пост, потому что есть минимальный предел длины поста

Вы можете использовать инструмент gvimdiff , который входит в пакет vim-gui-common

sudo apt-get update

sudo apt-get установить vim-gui-common

Затем вы можете сравнить 2 шестнадцатеричных файла, используя следующие команды:

Это все. Надеюсь, что помощь!

Инструмент анализа микропрограммного обеспечения binwalk также имеет это в качестве функции через параметр -W / --hexdump командной строки, который предлагает параметры, такие как показ только отличающихся байтов:

В примере OP при выполнении binwalk -W file1.bin file2.bin :

binwalk -W file1.bin file2.bin

BinDiff - это отличный инструмент для сравнения бинарных файлов, который был недавно открыт.

Можно ли его использовать для произвольных двоичных файлов? Похоже, что эта страница полезна для сравнения исполняемых файлов, которые были разобраны с помощью Hex-Rays IDA Pro.

Продуктом с открытым исходным кодом для Linux (и всего остального) является Radare, который radiff2 специально предназначен для этой цели. Я проголосовал за это, потому что у меня и у других один и тот же вопрос в вопросе, который вы задаете

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

Чуть более практичным является radiff -O . Это -O для "" Выполнять проверку кода со всеми байтами, а не только с фиксированными байтами кода операции ""

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

Мне нужно сравнить два двоичных файла и получить вывод в виде:

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

за каждый другой байт. Так что если file1.bin

в двоичном виде и file2.bin

Я хочу получить что-то вроде

Есть ли способ сделать это в Linux? Я знаю о cmp -l но он использует десятичную систему для смещений и восьмеричную для байтов, которых я хотел бы избежать.

Это напечатает смещение и байты в шестнадцатеричном виде:

Или введите $1-1 чтобы первое напечатанное смещение начиналось с 0.

К сожалению, strtonum() специфичен для GAWK, поэтому для других версий awk - например, mawk - вам потребуется использовать функцию преобразования восьмеричного числа в десятичное. Например,

Вычеркнуто для удобства чтения:

Как сказал Кряк :

Попробуйте использовать diff в следующей комбинации замены процесса zsh/bash и colordiff в CLI:

вывод двоичного файла в терминале - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff

Есть инструмент под названием DHEX, который может сделать эту работу, и есть другой инструмент, который называется VBinDiff.

Для строго командной строки попробуйте JDIFF.

Метод, который работает для добавления / удаления байтов

Сгенерируйте тестовый пример с единственным удалением байта 64:

Если вы также хотите увидеть ASCII-версию персонажа:

Проверено на Ubuntu 16.04.

Я предпочитаю od xxd потому что:

При использовании hexdumps и text diff для сравнения двоичных файлов, особенно xxd , добавление и удаление байтов становятся изменениями в адресации, что может затруднить просмотр. Этот метод говорит xxd не выводить адреса и выводить только один байт на строку, что, в свою очередь, показывает, какие именно байты были изменены, добавлены или удалены. Вы можете найти адреса позже, выполнив поиск интересных последовательностей байтов в более "нормальном" hexdump (вывод xxd first.bin ).

Я бы порекомендовал hexdump для выгрузки двоичных файлов в текстовый формат и kdiff3 для просмотра различий.

hexdiff - это программа, предназначенная для того, чтобы делать именно то, что вы ищете.

Он отображает шестнадцатеричный (и 7-битный ASCII) двух файлов один над другим с выделением любых различий. Посмотрите на man hexdiff чтобы найти команды для перемещения по файлу, и простой q завершит работу.

Возможно, он не совсем отвечает на вопрос, но я использую это для сравнения двоичных файлов:

Он печатает оба файла как шестнадцатеричные и ASCII- значения, по одному байту на строку, а затем использует средство сравнения Vim для визуальной визуализации.

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

Вы можете использовать инструмент gvimdiff , который входит в пакет vim-gui-common

Затем вы можете сравнить 2 шестнадцатеричных файла, используя следующие команды:

Это все. Надеюсь, что помощь!

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

Продуктом с открытым исходным кодом для Linux (и всего остального) является Radare, который явно использует radiff2 для этой цели. Я проголосовал за это, потому что у меня и у других один и тот же вопрос в вопросе, который вы задаете

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

Чуть более практичным является radiff -O . Параметр -O предназначен для "" Выполнять проверку кода со всеми байтами, а не только с фиксированными байтами кода операции ""

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


Photo by Ryan Stone on Unsplash

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

Также оказывается, что для восстановления системы вам нужно сравнить код в двух версиях. Давление растет, все вокруг паникуют (и это понятно).

К счастью, в Linux есть утилита под названием diff, которая вам поможет.

Что из себя представляет команда diff в Linux?

Сравнивать вручную долго и тяжело, к тому же велика вероятность ошибок. Поэтому Linux предоставляет вам мощную встроенную утилиту под названием diff. Ее применение позволяет сэкономить время и силы.

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

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

Указания даются при помощи специальных символов:

Давайте рассмотрим несколько примеров использования команды diff.

Примеры использования команды diff

Чтобы выяснить, являются ли файлы одинаковыми, команда diff дополняется флагом -s . В нашем примере содержимое файлов fileA и sameAsfileA совпадает.

Скриншот консоли: команда diff испольузется с флагом -s

А в следующем примере файлы имеют разный контент. Вывод команды diff говорит, что строки 11 и 14 в showList_v2.js нужно изменить, чтобы они совпадали со строками 11 и 13 в showList_v1.js.


Параллельный просмотр различий в двух файлах, когда команда diff применяется с флагом -y


Вот еще несколько полезных флагов, которые можно применять с командой diff:

Синтаксис команды patch

Изменения в коде происходят постоянно. Расшаривать отредактированные файлы после внесения каждого изменения нереально. Обычно разработчики расшаривают сами изменения в коде.

Давайте посмотрим, как работают патчи:

Примеры использования команды patch

Предположим, у нас есть простой JavaScript-код в файле print_in_js.js, который выводит строку.


Наш коллега находит опечатку в строке № 3 и исправляет файл.

Когда файл исправлен и код работает корректно, наш коллега создает патч:

Давайте посмотрим содержимое патча:


Получив патч, мы применяем его:


Итоги

Создавать и применять патчи при помощи команд patch и diff довольно просто.

Похожий подход применяется, когда вы пользуетесь системами контроля версий вроде Git или SVN. Знание основ (т. е. работы соответствующих команд Linux) поможет вам лучше понять работу систем контроля версий, а это важно для разработчиков.

Читайте также: