Мне нужно сравнить два двоичных файла и получить вывод в виде:
<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
но он использует десятичную систему для смещений и восьмеричную для байтов, которых я хотел бы избежать.
linux
diff
binary-files
bertieb
источник
источник
od
...Ответы:
Это выведет смещение и байты в шестнадцатеричном виде:
Или сделать так,
$1-1
чтобы первое напечатанное смещение начиналось с 0.К сожалению,
strtonum()
это специфично для GAWK, поэтому для других версий awk - например, mawk - вам нужно будет использовать функцию преобразования восьмеричного числа в десятичное. Например,Вычеркнуто для удобства чтения:
источник
strtonum
специфично для GAWK. Я считаю, что Ubuntu ранее использовал GAWK по умолчанию, но в какой-то момент переключился наmawk
. В любом случае GAWK можно установить и установить по умолчанию (см. Такжеman update-alternatives
). Смотрите мой обновленный ответ для решения, которое не требуетstrtonum
.Как сказал Кряк :
А потом
или же
источник
diff <(xxd b1) <(xxd b2)
но выходной формат этого (или вашего) далеко не соответствует тому, что запрашивал OP.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
.Образец вывода:
vimdiff
+xxd
Вы также можете использовать
vimdiff
, например,подсказки:
-l1000
) для каждогоxxd
источник
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.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 .
источник
Метод, который работает для добавления / удаления байтов
Создайте тестовый пример с единственным удалением байта 64:
Выход:
Если вы также хотите увидеть ASCII-версию персонажа:
Выход:
Проверено на Ubuntu 16.04.
Я предпочитаю
od
более ,xxd
потому что:xxd
нет (поставляется с Vim)-An
чтобы удалить столбец адреса безawk
.Объяснение команды:
-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-function-in-bashСмотрите также:
источник
Краткий ответ
При использовании hexdumps и text diff для сравнения двоичных файлов, особенно
xxd
, добавления и удаления байтов становятся изменениями в адресации, что может затруднить просмотр. Этот метод говорит xxd не выводить адреса и выводить только один байт на строку, что, в свою очередь, показывает, какие именно байты были изменены, добавлены или удалены. Вы можете найти адреса позже, выполнив поиск интересных последовательностей байтов в более "нормальном" hexdump (выводxxd first.bin
).источник
diff
вместоvimdiff
.)Я бы порекомендовал hexdump для выгрузки двоичных файлов в текстовый формат и kdiff3 для просмотра различий.
источник
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
без необходимости создавать файлыmyfile1.hex
иmyfile2.hex
.Это
hexdiff
программа, предназначенная для того, чтобы делать именно то, что вы ищете.Использование:
Он отображает шестнадцатеричный (и 7-битный ASCII) двух файлов один над другим с выделением любых различий. Посмотрите на
man hexdiff
команды для перемещения в файле, и простоеq
закроется.источник
Возможно, он не совсем отвечает на вопрос, но я использую это для сравнения двоичных файлов:
Он распечатывает оба файла в виде шестнадцатеричных и ASCII- значений, по одному байту на строку, а затем использует средство сравнения Vim для визуальной визуализации.
источник
Dhex http://www.dettus.net/dhex/
DHEX - это не просто еще один шестнадцатеричный редактор: он включает режим diff, который можно использовать для простого и удобного сравнения двух двоичных файлов. Поскольку он основан на ncurses и является темным, он может работать в любом количестве систем и сценариев. Благодаря использованию журналов поиска можно легко отслеживать изменения в разных итерациях файлов.
источник
Вы можете использовать инструмент gvimdiff , который входит в пакет vim-gui-common
Затем вы можете сравнить 2 шестнадцатеричных файла, используя следующие команды:
Это все. Надеюсь, что помощь!
источник
Инструмент анализа микропрограммного обеспечения
binwalk
также имеет это в качестве функции через параметр-W
/--hexdump
командной строки, который предлагает параметры, такие как показ только отличающихся байтов:В примере OP при выполнении
binwalk -W file1.bin file2.bin
:источник
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff - это отличный инструмент для сравнения бинарных файлов, который был недавно открыт.
источник
Продуктом с открытым исходным кодом для Linux (и всего остального) является Radare, который
radiff2
специально предназначен для этой цели. Я проголосовал за это, потому что у меня и у других один и тот же вопрос в вопросе, который вы задаетеЭто безумие, хотя. Потому что, как и просили, если вы вставите один байт в первый байт в файле, вы обнаружите, что каждый последующий байт отличается, и поэтому diff будет повторять весь файл для фактической разницы в один байт.
Чуть более практичным является
radiff -O
. Это-O
для "" Выполнять проверку кода со всеми байтами, а не только с фиксированными байтами кода операции ""Как и IDA Pro, Radare - это основной инструмент для бинарного анализа, вы также можете показывать разность дельты с помощью
-d
или отображать дизассемблированные байты вместо шестнадцатеричных с помощью-D
.Если вы задаете такие вопросы, проверьте
radiff2
для бинарного сравненияисточник