Saya perlu membandingkan dua file biner dan mendapatkan output dalam bentuk:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
untuk setiap byte yang berbeda. Jadi kalau file1.bin
begitu
00 90 00 11
dalam bentuk biner dan file2.bin
adalah
00 91 00 10
Saya ingin mendapatkan sesuatu seperti
00000001 90 91
00000003 11 10
Apakah ada cara untuk melakukan ini di Linux? Saya tahu tentang cmp -l
tetapi menggunakan sistem desimal untuk offset dan oktal untuk byte yang ingin saya hindari.
linux
diff
binary-files
bertieb
sumber
sumber
od
...Jawaban:
Ini akan mencetak offset dan byte dalam hex:
Atau lakukan
$1-1
agar cetakan offset pertama mulai dari 0.Sayangnya,
strtonum()
ini khusus untuk GAWK, jadi untuk versi awk lainnya — mis. Mawk — Anda harus menggunakan fungsi konversi oktal ke desimal. Sebagai contoh,Dipatahkan untuk dibaca:
sumber
strtonum
khusus untuk GAWK. Saya percaya Ubuntu sebelumnya menggunakan GAWK sebagai default, tetapi beralih di beberapa titik kemawk
. Bagaimanapun, GAWK dapat diinstal dan diatur ke default (lihat jugaman update-alternatives
). Lihat jawaban saya yang diperbarui untuk solusi yang tidak memerlukanstrtonum
.Seperti yang ditunjukkan oleh dukun :
Lalu
atau
sumber
diff <(xxd b1) <(xxd b2)
tetapi format output ini (atau milik Anda) tidak jauh dari yang diminta OP.opendiff
menggunakan OS X bukanvimdiff
) - tampilan defaultxxd
menyediakan menjaga mesin diff pada jalur yang membandingkan byte-by-byte. Dengan hex (mentah) hex cukup kolom-cocok denganfold
,diff
akan mencoba untuk melipat / mengelompokkan hal-hal acak dalam file yang saya bandingkan.diff
. Solusinya adalah dengan meletakkan 1 byte per baris dan menghapus kolom alamat seperti yang diusulkan oleh John Lawrence Aspden dan saya .diff
+xxd
Coba
diff
dalam kombinasi subtitusi proses zsh / bash berikut:Dimana:
-y
memperlihatkan kepada Anda perbedaan berdampingan (opsional).xxd
adalah alat CLI untuk membuat output hexdump dari file biner.-W200
kediff
untuk keluaran yang lebih luas (200 karakter per baris).colordiff
seperti yang ditunjukkan di bawah ini.colordiff
+xxd
Jika sudah
colordiff
, itu dapat mewarnaidiff
keluaran, misalnya:Jika tidak menginstal melalui:
sudo apt-get install colordiff
.Output sampel:
vimdiff
+xxd
Anda juga dapat menggunakan
vimdiff
, misPetunjuk:
-l1000
) untuk masing-masing filexxd
sumber
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
atau--brief
beralih, yang hanya akan menampilkan output ketika file berbeda.xxddiff
untuk ini dengan:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
akan melakukan pekerjaan dengan baik enougAda alat yang disebut DHEX yang dapat melakukan pekerjaan itu, dan ada alat lain yang disebut VBinDiff .
Untuk pendekatan garis perintah yang ketat, coba jojodiff .
sumber
Metode yang berfungsi untuk penambahan / penghapusan byte
Buat test case dengan satu penghapusan byte 64:
Keluaran:
Jika Anda juga ingin melihat versi ASCII dari karakter:
Keluaran:
Diuji pada Ubuntu 16.04.
Saya lebih suka
od
lebihxxd
karena:xxd
bukan (dilengkapi dengan Vim)-An
untuk menghapus kolom alamat tanpaawk
.Penjelasan perintah:
-An
menghapus kolom alamat. Ini penting jika tidak semua baris akan berbeda setelah penambahan / penghapusan byte.-w1
menempatkan satu byte per baris, sehingga diff dapat mengkonsumsinya. Sangat penting untuk memiliki satu byte per baris, atau setiap baris setelah penghapusan akan keluar dari fase dan berbeda. Sayangnya, ini bukan POSIX, tetapi ada di GNU.-tx1
adalah representasi yang Anda inginkan, ubah ke nilai yang memungkinkan, selama Anda menyimpan 1 byte per baris.-v
mencegah singkatan pengulangan asterisk*
yang dapat mengganggu diffpaste -d '' - -
bergabung dengan setiap dua baris. Kami membutuhkannya karena hex dan ASCII masuk ke garis yang berdekatan yang terpisah. Diambil dari: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()
untuk menentukanbdiff
alih-alih{}
membatasi ruang lingkup fungsi dalamf
, lihat juga: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashLihat juga:
sumber
Jawaban singkat
Saat menggunakan hexdumps dan teks diff untuk membandingkan file biner, khususnya
xxd
, penambahan dan penghapusan byte menjadi pergeseran dalam pengalamatan yang mungkin membuatnya sulit untuk dilihat. Metode ini memberitahu xxd untuk tidak menampilkan alamat, dan hanya menampilkan satu byte per baris, yang pada gilirannya menunjukkan dengan tepat byte mana yang diubah, ditambahkan, atau dihapus. Anda dapat menemukan alamat nanti dengan mencari urutan byte yang menarik di hexdump (output ofxxd first.bin
) yang lebih "normal" .sumber
diff
sebagai gantivimdiff
.)Saya akan merekomendasikan hexdump untuk membuang file biner ke format tekstual dan kdiff3 untuk tampilan yang berbeda.
sumber
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
tanpa perlu membuat filemyfile1.hex
danmyfile2.hex
.Ini
hexdiff
adalah program yang dirancang untuk melakukan persis apa yang Anda cari.Pemakaian:
Ini menampilkan hex (dan 7-bit ASCII) dari dua file satu di atas yang lain, dengan perbedaan yang disorot. Lihatlah
man hexdiff
perintah untuk bergerak di dalam file, dan sederhanaq
akan berhenti.sumber
Ini mungkin tidak sepenuhnya menjawab pertanyaan, tapi saya menggunakan ini untuk membedakan biner:
Ini mencetak kedua file sebagai nilai hex dan ASCII , satu byte per baris, dan kemudian menggunakan fasilitas diff Vim untuk membuat mereka secara visual.
sumber
dhex http://www.dettus.net/dhex/
DHEX adalah lebih dari sekadar hex editor lain: Ini termasuk mode diff, yang dapat digunakan untuk membandingkan dua file biner dengan mudah dan nyaman. Karena didasarkan pada ncurses dan dapat disesuaikan, ia dapat berjalan pada sejumlah sistem dan skenario. Dengan pemanfaatan log pencarian, dimungkinkan untuk melacak perubahan di berbagai iterasi file dengan mudah.
sumber
Anda dapat menggunakan gvimdiff alat yang termasuk dalam vim-gui-umum paket
Kemudian Anda dapat membandingkan 2 file hex menggunakan perintah berikut:
Itu saja. Semoga bantuan!
sumber
Alat analisis firmware
binwalk
juga memiliki ini sebagai fitur melalui opsi-W
/--hexdump
perintahnya yang menawarkan opsi seperti hanya menampilkan byte yang berbeda:Dalam contoh OP saat melakukan
binwalk -W file1.bin file2.bin
:sumber
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff adalah alat UI yang hebat untuk membandingkan file biner yang telah bersumber terbuka baru-baru ini.
sumber
Pergi ke produk open source di Linux (dan yang lainnya) adalah Radare yang menyediakan
radiff2
secara eksplisit untuk tujuan ini. Saya memilih untuk menutup ini karena saya dan orang lain memiliki pertanyaan yang sama, dalam pertanyaan yang Anda ajukanTapi itu gila. Karena seperti yang diminta, jika Anda memasukkan satu byte pada byte pertama dalam file, Anda akan menemukan bahwa setiap byte berikutnya berbeda dan jadi diff akan mengulangi seluruh file, untuk perbedaan sebenarnya dari satu byte.
Agak lebih praktis
radiff -O
. Ini-O
untuk "" Lakukan perbedaan kode dengan semua byte, bukan hanya byte opcode yang diperbaiki ""Seperti IDA Pro, Radare adalah alat utama untuk analisis biner, Anda juga dapat menampilkan delta diffing with
-d
, atau menampilkan byte yang dibongkar alih-alih hex-D
.Jika Anda mengajukan pertanyaan semacam ini, lihat
radiff2
untuk pembedaan binersumber