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

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

для каждого байта. Так если file1.bin is

  00 90 00 11

в двоичной форме и file2.bin is

  00 91 00 10

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

  00000001 90 91
  00000003 11 10

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

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

21
задан Peter Mortensen
19.01.2023 12:36 Количество просмотров материала 3635
Распечатать страницу

14 ответов

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

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

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

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

к сожалению, 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", , oct2dec(), oct2dec()}'

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

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", , oct2dec(), oct2dec()
          }'
146
отвечен Dennis Williamson 2023-01-20 20:24

As ~quack отметил:

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

а то

 % diff b1.hex b2.hex

или

 % vimdiff b1.hex b2.hex
143
отвечен akira 2023-01-20 22:41

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

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

где:

  • -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

65
отвечен kenorb 2023-01-21 00:58

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

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

48
отвечен njd 2023-01-21 03:15

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

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 "" | paste -d '' - -
  )
  diff <(f "") <(f "")
)

bdiff file1 file2

выход:

64d63
<   40   @

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

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

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

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

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

посмотреть также:

25
отвечен Ciro Santilli 新疆改造中心 六四事件 法轮功 2023-01-21 05:32

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

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

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

13
отвечен Evgeny 2023-01-21 07:49

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

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
11
отвечен BugoK 2023-01-21 10:06

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

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

hexdiff file1 file2

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

4
отвечен Mick 2023-01-21 12:23

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

gvim -d <(xxd -c 1 ~/file1.bin | awk '{print , }') <(xxd -c 1 ~/file2.bin | awk '{print , }')

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

3
отвечен John Lawrence Aspden 2023-01-21 14:40

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

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

0
отвечен Vincent Vega 2023-01-21 16:57

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

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

sudo apt-get install vim-gui-common

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

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

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

0
отвечен craken 2023-01-21 19:14

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

для каждого байта

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

немного практичнее radiff -O. The -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, или отображать разобранные байты вместо hex с -D.

если вы спрашиваете такого рода вопросы, хотя, проверить

0
отвечен Evan Carroll 2023-01-21 21:31

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

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

-1
отвечен Evgeny 2023-01-21 23:48

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

-3
отвечен user3119546 2023-01-22 02:05

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх