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

Jak porównać pliki binarne w Linuksie?

Muszę porównać dwa pliki binarne i otrzymać wyjście w postaci:

<plik offset-hex> <plik 1-bajt-hex> <plik 2-bajt-hex>

dla każdego innego bajtu. So if file1.bin is

00 90 00 11

in binary form and file2.bin is

00 91 00 10

I want to get something like

00000001 90 91
  00000003 11 10

Is there a way to do this in Linux? Wiem o cmp -l, ale używa on systemu dziesiętnego dla offsetów i ósemkowego dla bajtów, czego chciałbym uniknąć.

Odpowiedzi (14)

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

To będzie drukować offset i bajty w szesnastkowym:

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

Albo zrobić $1-1 aby pierwszy drukowany offset zaczął się od 0.

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

Niestety, strtonum() jest specyficzny dla GAWK, więc dla innych wersji awk-ego, mawk-you będzie musiał użyć funkcji konwersji ósemkowej do dziesiętnej. Na przykład,

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)}'

Broken out for readability:

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)
          }'
174
174
174
2010-03-29 16:07:55 +0000

As ~quack pointed out:

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

And then

% diff b1.hex b2.hex

lub

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

diff + xxd

Spróbuj diff w następującej kombinacji zastępowania procesu zsh/bash:

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

Gdzie:

  • -y pokazuje różnice obok siebie (opcjonalnie).
  • xxd jest narzędziem CLI do tworzenia wyjścia hexdump pliku binarnego.
  • Dodaj -W200 do diff dla szerszego wyjścia (200 znaków w linii).
  • Dla kolorów, użyj colordiff jak pokazano poniżej.

colordiff + xxd

Jeśli masz colordiff, możesz podbarwić wyjście diff, np.:

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

W przeciwnym razie zainstaluj przez: sudo apt-get install colordiff.

Wyjście próbne:

vimdiff + xxd

Można także użyć vimdiff, np.

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

Podpowiedzi:

  • jeśli pliki są zbyt duże, dodaj limit (np. -l1000) dla każdego xxd
60
60
60
2010-03-29 15:41:30 +0000

Jest narzędzie o nazwie DHEX , które może wykonać tę pracę, i jest jeszcze inne narzędzie o nazwie VBinDiff .

Dla ścisłego podejścia z linii poleceń, spróbuj jojodiff .

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

Methode die werkt voor byte toevoeging / verwijdering

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

Genereer een testcase met een enkele verwijdering van byte 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

Uitgang:

64d63
< 40

Indien u ook de ASCII-versie van het karakter wilt zien:

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

bdiff file1 file2

Uitgang:

64d63
< 40 @

Getest op Ubuntu 16. 04.

Ik geef de voorkeur aan od boven xxd omdat:

  • het is POSIX , xxd is niet (komt met Vim)
  • heeft de -An om de adreskolom te verwijderen zonder awk.

Command uitleg:

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

Krótka odpowiedź

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

Podczas używania hexdumpów i diffów tekstowych do porównywania plików binarnych, zwłaszcza xxd, dodawanie i usuwanie bajtów staje się przesunięciem w adresowaniu, co może być trudne do zauważenia. Metoda ta mówi xxd, aby nie wyświetlać adresów wyjściowych, a tylko jeden bajt na linię, co z kolei pokazuje dokładnie, które bajty zostały zmienione, dodane lub usunięte. Adresy można znaleźć później, szukając interesujących sekwencji bajtów w bardziej “normalnym” hexdump (wyjście z xxd first.bin).

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

Polecam hexdump do zrzucania plików binarnych do formatu tekstowego i kdiff3 do podglądu 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 to program zaprojektowany tak, aby zrobić dokładnie to, czego szukasz.

Zastosowanie:

hexdiff file1 file2

Wyświetla on heks (i 7-bitowy ASCII) dwóch plików jeden nad drugim, z zaznaczonymi różnicami. Spójrz na man hexdiff, aby znaleźć komendy do poruszania się w pliku, a prosty q zakończy pracę.

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

Może nie odpowiada ściśle na pytanie, ale używam tego do dyfuzji binarnych:

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

Drukuje oba pliki jako wartości hex i ASCII , jeden bajt na linię, a następnie używa funkcji dyfuzji Vima do ich wizualnego renderowania.

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

Narzędzie analizy firmware'u binwalk posiada również tę funkcję poprzez opcję -W/--hexdump wiersza poleceń , która oferuje takie opcje, jak wyświetlanie tylko różnych bajtów:

-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

W przykładzie OP podczas wykonywania binwalk -W file1.bin file2.bin:

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

Możesz użyć gvimdiff narzędzia, które jest zawarte w vim-gui-common package

sudo apt-get update

sudo apt-get install vim-gui-common

Następnie możesz porównać 2 pliki hex używając następujących komend :

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

Tha’s all. Mam nadzieję, że to pomoże!

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

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

DHEX jest czymś więcej niż tylko kolejnym edytorem szesnastkowym: zawiera tryb diff, który może być używany do łatwego i wygodnego porównywania dwóch plików binarnych. Ponieważ jest on oparty na ncurses i jest tematyczny, może działać na dowolnej liczbie systemów i scenariuszy. Dzięki wykorzystaniu logów wyszukiwania, można łatwo śledzić zmiany w różnych iteracjach plików.

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

Przejdź do produktu open source na Linuksie (i wszystkiego innego) jest Radare , który zapewnia radiff2 wyraźnie do tego celu. Głosowałem za zamknięciem tego, ponieważ ja i inni mam to samo pytanie, w pytaniu, które zadajesz

_ dla każdego innego bajtu_

To jednak szaleństwo. Ponieważ, jak pytamy, jeśli wstawimy do pliku jeden bajt w pierwszym bajcie, okaże się, że każdy kolejny bajt jest inny, a więc różnica będzie powtarzać cały plik, dla rzeczywistej różnicy jednego bajtu.

Nieco bardziej praktyczny jest radiff -O. The -O is for “"Do code diffing with all bytes instead of just the fixed opcode bytes”“

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

Like IDA Pro, Radare is a tool primary for binary analysis, you can also show delta diffing with -d, or display the disassembled bytes instead of hex with -D.

Jeśli jednak zadajesz tego typu pytania, sprawdź

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

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

BinDiff jest doskonałym narzędziem UI do porównywania plików binarnych, które zostały niedawno otwarte.