Muszę porównać dwa pliki binarne i uzyskać wynik w postaci:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
dla każdego innego bajtu. Więc jeśli file1.bin
jest
00 90 00 11
w formie binarnej i file2.bin
jest
00 91 00 10
Chcę dostać coś takiego
00000001 90 91
00000003 11 10
Czy jest na to sposób w Linuksie? Wiem o tym, cmp -l
ale używa systemu dziesiętnego dla przesunięć i ósemkowego dla bajtów, których chciałbym uniknąć.
linux
diff
binary-files
bertieb
źródło
źródło
od
...Odpowiedzi:
Spowoduje to wydrukowanie przesunięcia i bajtów w postaci szesnastkowej:
Lub zrób,
$1-1
aby pierwsze drukowane przesunięcie zaczynało się od 0.Niestety,
strtonum()
jest specyficzny dla GAWK, więc w innych wersjach awk - np. Mawk - będziesz musiał użyć funkcji konwersji ósemkowej na dziesiętną. Na przykład,Podział na czytelność:
źródło
strtonum
jest specyficzny dla GAWK. Wierzę, że Ubuntu poprzednio używał GAWK jako domyślnego, ale w pewnym momencie zmienił namawk
. W każdym razie GAWK może zostać zainstalowany i ustawiony na domyślny (patrz takżeman update-alternatives
). Zobacz moją zaktualizowaną odpowiedź na rozwiązanie, które nie wymagastrtonum
.Jak wskazał ~ kwak :
I wtedy
lub
źródło
diff <(xxd b1) <(xxd b2)
ale format wyjściowy tego (lub twojego) nie jest bliski żądaniu OP.opendiff
OS X zamiastvimdiff
) - domyślny widokxxd
zapewnia utrzymanie mechanizmu różnicowego na ścieżce porównywania bajt po bajcie. Przy zwykłym (surowym) heksie po prostu dopasowanym do kolumnyfold
,diff
próbowałbym składać / grupować losowe rzeczy w plikach, które porównywałem.diff
. Rozwiązaniem jest wstawienie 1 bajtu na wiersz i usunięcie kolumny adresu, jak zaproponowali John Lawrence Aspden i ja .diff
+xxd
Wypróbuj
diff
następującą kombinację podstawienia procesu zsh / bash:Gdzie:
-y
pokazuje różnice obok siebie (opcjonalnie).xxd
jest narzędziem CLI do tworzenia pliku zrzutu heksadecymalnego pliku binarnego.-W200
do, abydiff
uzyskać szerszy wynik (200 znaków w wierszu).colordiff
jak pokazano poniżej.colordiff
+xxd
Jeśli masz
colordiff
, może pokolorowaćdiff
dane wyjściowe, np .:Inaczej zainstalować poprzez:
sudo apt-get install colordiff
.Przykładowe dane wyjściowe:
vimdiff
+xxd
Możesz także użyć
vimdiff
npPoradnik:
-l1000
) dla każdegoxxd
źródło
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
lub--brief
, który wyświetli dane wyjściowe tylko wtedy, gdy pliki się różnią.xxddiff
dla tego funkcję za pomocą:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
to wykona dobrą robotęIstnieje narzędzie o nazwie DHEX, które może wykonać tę pracę, oraz inne narzędzie o nazwie VBinDiff .
Aby uzyskać podejście oparte wyłącznie na wierszu poleceń, wypróbuj jojodiff .
źródło
Metoda, która działa w przypadku dodawania / usuwania bajtów
Wygeneruj przypadek testowy z pojedynczym usunięciem bajtu 64:
Wynik:
Jeśli chcesz również zobaczyć wersję ASCII znaku:
Wynik:
Testowane na Ubuntu 16.04.
Wolę
od
sięxxd
, ponieważ:xxd
nie jest (pochodzi z Vimem)-An
usunąć kolumnę adresu bezawk
.Wyjaśnienie polecenia:
-An
usuwa kolumnę adresu. Jest to ważne, w przeciwnym razie wszystkie wiersze będą się różnić po dodaniu / usunięciu bajtu.-w1
wstawia jeden bajt na linię, aby diff mógł go wykorzystać. Ważne jest, aby mieć jeden bajt na linię, w przeciwnym razie każda linia po usunięciu stanie się poza fazą i będzie inna. Niestety nie jest to POSIX, ale występuje w GNU.-tx1
to reprezentacja, którą chcesz, zmień na dowolną możliwą wartość, o ile zachowasz 1 bajt na linię.-v
zapobiega skrótowi powtórzeń gwiazdki,*
który może zakłócać różnicępaste -d '' - -
łączy się co dwie linie. Potrzebujemy go, ponieważ hex i ASCII przechodzą w oddzielne sąsiednie linie. Zaczerpnięte z: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()
aby zdefiniowaćbdiff
zamiast{}
ograniczać zakres funkcji wewnętrznejf
, patrz również: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashZobacz też:
źródło
Krótka odpowiedź
Kiedy używasz zrzutów szesnastkowych i różnic tekstowych do porównywania plików binarnych, zwłaszcza
xxd
dodawanie i usuwanie bajtów zmienia się w adresowaniu, co może utrudnić ich dostrzeżenie. Ta metoda każe xxd nie wysyłać adresów i wypisywać 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, wyszukując interesujące sekwencje bajtów w bardziej „normalnym” zrzutie szesnastkowym (wynikxxd first.bin
).źródło
diff
zamiastvimdiff
.)Polecam hexdump do zrzucania plików binarnych do formatu tekstowego i kdiff3 do przeglądania różnic.
źródło
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
bez potrzeby tworzenia plikówmyfile1.hex
imyfile2.hex
.hexdiff
To program przeznaczony do zrobić dokładnie to, czego szukasz.Stosowanie:
Wyświetla szesnastkowy (i 7-bitowy ASCII) dwóch plików jeden nad drugim, z zaznaczonymi różnicami. Poszukaj
man hexdiff
poleceń do poruszania się w pliku, a prosteq
zostanie zamknięte.źródło
Może nie ściśle odpowiada na pytanie, ale używam tego do różnicowania plików binarnych:
Drukuje oba pliki jako wartości szesnastkowe i ASCII , jeden bajt na linię, a następnie używa funkcji różnicowania Vima do renderowania ich wizualnie.
źródło
dhex http://www.dettus.net/dhex/
DHEX to coś więcej niż kolejny edytor szesnastkowy: zawiera tryb różnicowy, za pomocą którego można łatwo i wygodnie porównywać dwa pliki binarne. Ponieważ jest oparty na ncurses i jest tematyczny, może działać na dowolnej liczbie systemów i scenariuszy. Dzięki wykorzystaniu dzienników wyszukiwania możliwe jest łatwe śledzenie zmian w różnych iteracjach plików.
źródło
Możesz użyć narzędzia gvimdiff , które jest zawarte w pakiecie vim-gui-common
Następnie możesz porównać 2 pliki szesnastkowe za pomocą następujących poleceń:
To wszystko. Mam nadzieję, że pomoże!
źródło
Narzędzie do analizy oprogramowania układowego
binwalk
ma tę funkcję również za pomocą opcji-W
/--hexdump
wiersza poleceń, która oferuje opcje takie jak wyświetlanie tylko różnych bajtów:W przykładzie OP podczas wykonywania
binwalk -W file1.bin file2.bin
:źródło
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff to świetne narzędzie interfejsu użytkownika do porównywania plików binarnych, które zostały ostatnio otwarte.
źródło
Przejście do produktu open source w Linuksie (i wszystkim innym) to Radare, który zapewnia to
radiff2
wyraźnie. Głosowałem za jej zamknięciem, ponieważ ja i inni mamy to samo pytanie w pytaniu, które zadajeszTo szalone. Ponieważ, zgodnie z pytaniem, jeśli wstawisz jeden bajt na pierwszym bajcie w pliku, przekonasz się, że każdy kolejny bajt był inny, więc diff powtórzyłby cały plik, z faktyczną różnicą jednego bajta.
Nieco bardziej praktyczny jest
radiff -O
. Jest-O
to dla „Wykonuj różnicę kodu wszystkimi bajtami zamiast tylko ustalonymi bajtami opcode” ”Podobnie jak IDA Pro, Radare jest narzędziem podstawowym do analizy binarnej, możesz także pokazywać różnicowanie delty za pomocą
-d
lub wyświetlać zdemontowane bajty zamiast szesnastkowego za pomocą-D
.Jeśli jednak zadajesz tego rodzaju pytania, sprawdź
radiff2
dla binarnego różnicowaniaźródło