2010-03-29 15:28:57 +0000 2010-03-29 15:28:57 +0000
324
324

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

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

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

для каждого разного байта. Итак, если file1.bin - это

00 90 00 11

в двоичном виде и file2.bin - это

00 91 00 10

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

00000001 90 91
  00000003 11 10

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

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

Ответы (14)

182
182
182
2010-03-29 16:30:19 +0000

Это позволит печатать офсет и байты в hex:

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

Или сделать $1-1, чтобы первый напечатанный офсет начинался с 0.

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'

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

cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'

Разрыв для удобочитаемости:

&00001

174
174
174
2010-03-29 16:07:55 +0000

Как отметил ~quack:

% xxd b1 > b1.hex
 % xxd b2 > b2.hex

And then

или

% diff b1.hex b2.hex
112
112
112
2015-09-05 21:14:55 +0000

diff + xxd

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

diff -y <(xxd foo1.bin) <(xxd foo2.bin)

Где:

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

colordiff + xxd

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

colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)

Иначе установите через: sudo apt-get install colordiff.

Вывод примеров:

vimdiff + xxd

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

vimdiff <(xxd foo1.bin) <(xxd foo2.bin)
  • *

Подсказки:

  • если файлы слишком большие, добавьте лимит (например, -l1000) для каждого xxd.
60
60
60
2010-03-29 15:41:30 +0000

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

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

28
28
28
2015-04-04 20:31:59 +0000

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

diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)

Генерация тестового случая с одним удалением байта 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

Выход:

64d63
< 40

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

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

bdiff file1 file2

Выход:

64d63
< 40 @

Протестировано на Ubuntu 16. 04.

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

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

Объяснение команды:

  • -An удаляет столбец адреса. Это важно, иначе все строки будут отличаться после добавления/удаления байта.
  • -w1 ставит по одному байту на строку, так что разница может потреблять ее. Очень важно иметь по одному байту на строку, иначе каждая строка после удаления выйдет из фазы и будет отличаться. К сожалению, это не POSIX, но присутствует в GNU.
  • -tx1 - это представление, которое вы хотите изменить на любое возможное значение, при условии, что вы держите 1 байт на строку.
  • -v предотвращает появление аббревиатуры повторения * со звездочкой, которая может помешать diff
  • 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-function-in-bash

См. также:

14
14
14
2015-04-22 12:10:51 +0000

Короткий ответ

vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)

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

11
11
11
2013-06-12 07:46:34 +0000

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

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
6
6
6
2015-10-07 04:11:31 +0000

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

Использование:

hexdiff file1 file2

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

4
4
4
2011-09-07 15:47:54 +0000

I

1
1
1
2019-07-25 12:42:04 +0000

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

-W, --hexdump Perform a hexdump / diff of a file or files
    -G, --green Only show lines containing bytes that are the same among all files
    -i, --red Only show lines containing bytes that are different among all files
    -U, --blue Only show lines containing bytes that are different among some files
    -w, --terse Diff all files, but only display a hex dump of the first file

В примере операционной системы при выполнении binwalk -W file1.bin file2.bin:

1
1
1
2018-10-08 13:52:19 +0000

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

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

sudo apt-получить установку vim-gui-common

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

ubuntu> gvimdiff <hex-file1> <hex-file2>

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

Всего. Надеюсь, это поможет!

0
0
0
2017-08-18 11:25:28 +0000

dhex http://www.dettus.net/dhex/

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

-1
-1
-1
2018-11-09 04:18:32 +0000

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

_ для каждого разного байта_

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

Немного более практично это 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.

Если вы задаёте такие вопросы, обратите внимание на

-1
-1
-1
2016-03-23 20:18:41 +0000

https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html

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

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

6
10
5
37
2