Diff binary files in linux

Как сравнить двоичные файлы в Linux?

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

14 ответов 14

cmp -l file1.bin file2.bin | gawk '' 
cmp -l file1.bin file2.bin | gawk '' 

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

cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) ; return dec> ' 
cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) < for (i = 1; i ; return dec > < printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3) >' 
 % xxd b1 > b1.hex % xxd b2 > b2.hex 
  • -y показывает различия между собой (необязательно)
  • xxd — это инструмент CLI для создания шестнадцатеричного вывода двоичного файла
  • colordiff раскрасит вывод diff (установите с помощью: sudo apt-get install colordiff )
  • добавить -W200 к diff для более широкого вывода (по 200 символов в строке)

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

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

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

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

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

for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1 for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2 

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

bdiff() ( f() ( od -An -tx1c -w1 -v "$1" | paste -d '' - - ) diff <(f "$1") <(f "$2") ) bdiff file1 file2 

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

  • -An удаляет адресную колонку. Это важно, иначе все строки будут отличаться после добавления / удаления байта.
  • -w1 помещает один байт на строку, чтобы diff мог его использовать. Крайне важно иметь один байт на строку, иначе каждая строка после удаления окажется не в фазе и будет отличаться. К сожалению, это не POSIX, но присутствует в GNU.
  • -tx1 - это желаемое представление, замените его на любое возможное значение, пока вы сохраняете 1 байт на строку.
  • -v предотвращает повторение звездочки * которое может помешать разнице
  • paste -d '' - - соединяет каждые две строки. Нам это нужно, потому что гекс и ASCII идут в отдельные смежные строки. Взято из: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
  • мы используем круглые скобки () для определения bdiff вместо <> для ограничения области действия внутренней функции f , см. также: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another -функции-в-Баш

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

Читайте также:  Общая папка linux centos

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

hexdump myfile1.bin > myfile1.hex hexdump myfile2.bin > myfile2.hex kdiff3 myfile1.hex myfile2.hex 

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

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

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

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

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

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

sudo apt-get update

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

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

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

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

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

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

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

0x000000a4 0c01 => 3802 0x000000a4 0x000000a8 1401 => 3802 0x000000a8 0x000000ac 06 => 05 0x000000ac 0x000000b4 02 => 01 0x000000b4 0x000000b8 4c05 => 0020 0x000000b8 0x000000bc 4c95 => 00a0 0x000000bc 0x000000c0 4c95 => 00a0 0x000000c0 

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

Если вы задаете такие вопросы, проверьте

Источник

Binary diff files linux

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

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

Сравнение файлов diff

Утилита diff linux — это программа, которая работает в консольном режиме. Ее синтаксис очень прост. Вызовите утилиту, передайте нужные файлы, а также задайте опции, если это необходимо: $ diff опции файл1 файл2 Можно передать больше двух файлов, если это нужно. Перед тем как перейти к примерам, давайте рассмотрим опции утилиты:

  • -q — выводить только отличия файлов;
  • -s — выводить только совпадающие части;
  • — выводить нужное количество строк после совпадений;
  • -u — выводить только нужное количество строк после отличий;
  • -y — выводить в две колонки;
  • -e — вывод в формате ed скрипта;
  • -n — вывод в формате RCS;
  • -a — сравнивать файлы как текстовые, даже если они не текстовые;
  • -t — заменить табуляции на пробелы в выводе;
  • -l — разделить на страницы и добавить поддержку листания;
  • -r — рекурсивное сравнение папок;
  • -i — игнорировать регистр;
  • -E — игнорировать изменения в табуляциях;
  • -Z — не учитывать пробелы в конце строки;
  • -b — не учитывать пробелы;
  • -B — не учитывать пустые строки.
Читайте также:  Nvidia driver uninstaller linux

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

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

Вот содержимое наших тестовых файлов:

Теперь давайте выполним сравнение файлов diff:

В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:

Можно сделать вывод в две колонки:

А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:

Чтобы обработать несколько файлов в папке удобно использовать опцию -r:

Для удобства, вы можете перенаправить вывод утилиты сразу в файл:

diff -u file1 file2 > file.patch

Как видите, все очень просто. Но не очень удобно. Более приятно использовать графические инструменты.

Сравнение файлов Linux с помощью GUI

Существует несколько отличных инструментов для сравнения файлов в linux в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

1. Kompare

Kompare — это графическая утилита для работы с diff, которая позволяет находить отличия в файлах, а также объединять их. Написана на Qt и рассчитана в первую очередь на KDE. Вот ее основные особенности:

  • Поддержка нескольких форматов diff;
  • Поддержка сравнение файла linux и каталогов;
  • Поддержка просмотра файлов diff;
  • Настраиваемый интерфейс;
  • Создание и применение патчей к файлам.

2. DiffMerge

DiffMerge — это кроссплатформенная программ для сравнения и объединения файлов. Позволяет сравнивать два или три файла. Поддерживается редактирование строк на лету.

  • Поддержка сравнения каталогов;
  • Интеграция с просмотрщиком файлов;
  • Настраиваемая.

3. Meld

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

  • Сравнение двух и трех файлов;
  • Использование пользовательских типов и слов;
  • Режим автоматического слияния и действия с боками текста;
  • Поддержка Git, Mercurial, Subversion, Bazar и многое другое.

4. Diffuse

Diffuse — еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python. Поддерживается две основные возможности — сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра. Основные функции:

  • Подсветка синтаксиса;
  • Сочетания клавиш для удобной навигации;
  • Поддержка неограниченного числа отмен;
  • Поддержка Unicode;
  • Поддержка Git, CVS, Darcs, Mercurial, RCS, Subversion, SVK и Monotone.
Читайте также:  Linux on windows mono

5. XXdiff

XXdiff — это свободный и очень мощный инструмент для сравнения и слияния файлов. Но у программы есть несколько минусов. Это отсутствие поддержки Unicode и редактирования файлов.

  • Поверхностное или рекурсивное сравнение одного или двух файлов и каталогов;
  • Подсветка отличий;
  • Интерактивное объединение;
  • Поддержка внешних инструментов сравнения, такие как GNU Diff, SIG Diff, Cleareddiff и многое другое;
  • Расширяемость с помощью сценариев;
  • Настраиваемость.

6. KDiff3

KDiff3 — еще один отличный, свободный инструмент для сравнения файлов в окружении рабочего стола KDE. Он входит в набор программ KDevelop и работает на всех платформах, включая Windows и MacOS. Можно выполнить сравнение двух файлов linux для двух или трех, или даже сравнить каталоги. Вот основные особенности:

  • Отображение различий построчно и посимвольно;
  • Поддержка автослияния;
  • Обработка конфликтов при слиянии;
  • Поддержка Unicode;
  • Отображение отличий;
  • Поддержка ручного выравнивания.

Выводы

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

How do I compare binary files in Linux?

I need to compare two binary files and get the output in the form:

for every different byte. So if file1.bin is

in binary form and file2.bin is

I want to get something like

Is there a way to do this in Linux? I know about cmp -l but it uses a decimal system for offsets and octal for bytes which I would like to avoid.

16 Answers 16

This will print the offset and bytes in hex:

Or do $1-1 to have the first printed offset start at 0.

Unfortunately, strtonum() is specific to GAWK, so for other versions of awk—e.g., mawk—you will need to use an octal-to-decimal conversion function. For example,

Broken out for readability:

diff + xxd

Try diff in the following combination of zsh/bash process substitution:

  • -y shows you differences side-by-side (optional).
  • xxd is CLI tool to create a hexdump output of the binary file.
  • Add -W200 to diff for wider output (of 200 characters per line).
  • For colors, use colordiff as shown below.

colordiff + xxd

If you’ve colordiff , it can colorize diff output, e.g.:

Otherwise install via: sudo apt-get install colordiff .

vimdiff + xxd

You can also use vimdiff , e.g.

There’s a tool called DHEX which may do the job, and there’s another tool called VBinDiff.

For a strictly command-line approach, try jojodiff.

Method that works for byte addition / deletion

Generate a test case with a single removal of byte 64:

If you also want to see the ASCII version of the character:

I prefer od over xxd because:

  • it is POSIX, xxd is not (comes with Vim)
  • has the -An to remove the address column without awk .

Источник

Оцените статью
Adblock
detector