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

Hoe vergelijk ik binaire bestanden in Linux?

Ik moet twee binaire bestanden vergelijken en de uitvoer krijgen in de vorm:

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

voor elke verschillende byte. Dus als file1.bin

00 90 00 11

in binaire vorm is en file2.bin is 00 91 00 10

wil ik zoiets als

00000001 90 91
  00000003 11 10

Is er een manier om dit in Linux te doen? Ik weet van cmp -l maar het gebruikt een decimaal systeem voor offsets en een octaal voor bytes die ik graag wil vermijden.

Antwoorden (14)

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

Dit zal de offset en bytes afdrukken in hex:

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

of do $1-1 om de eerste gedrukte offset te laten beginnen op 0.

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

Helaas is strtonum() specifiek voor GAWK, dus voor andere versies van awk-bijvoorbeeld, zal mawk-je een octale-naar-decimale conversie functie moeten gebruiken. Bijvoorbeeld,

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

Uitgebroken voor de leesbaarheid:

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

Zoals ~quack aangaf:

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

en dan

% diff b1.hex b2.hex

of

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

diff + xxd

Probeer diff in de volgende combinatie van zsh/bash procesvervanging:

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

Waarbij:

  • -y je verschillen naast elkaar laat zien (optioneel).
  • xxd is een CLI tool om een hexdump uitvoer van het binaire bestand te maken.
  • Voeg -W200 toe aan diff voor een bredere uitvoer (van 200 karakters per regel).
  • Voor kleuren, gebruik colordiff zoals hieronder getoond.

colordiff + xxd

Als je colordiff hebt, kan het de uitvoer van diff inkleuren, bijvoorbeeld:

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

.

Voorbeeldweergave:

sudo apt-get install colordiff + vimdiff

U kunt xxd ook gebruiken, bijv.

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

Hints:

  • als bestanden te groot zijn, voeg dan limiet toe (bijv. vimdiff) voor elke -l1000
60
60
60
2010-03-29 15:41:30 +0000

Er is een hulpmiddel genaamd DHEX dat de klus kan klaren, en er is nog een ander hulpmiddel genaamd VBinDiff .

Voor een strikte opdrachtregelbenadering probeert u 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

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

Bij het gebruik van hexdumps en tekstdiff om binaire bestanden te vergelijken, vooral xxd, worden de toevoegingen en verwijderingen van bytes verschuivingen in de adressering die het moeilijk kunnen maken om te zien. Deze methode vertelt xxd om geen adressen uit te voeren, en slechts één byte per regel uit te voeren, wat op zijn beurt weer precies laat zien welke bytes zijn gewijzigd, toegevoegd of verwijderd. Je kunt de adressen later vinden door te zoeken naar de interessante sequenties van bytes in een meer “normale” hexdump (uitvoer van xxd first.bin).

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

Ik adviseer hexdump voor het dumpen van binaire bestanden naar tekstueel formaat en kdiff3 voor diff weergave.

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

De hexdiff is een programma dat is ontworpen om precies te doen wat je zoekt.

Gebruik:

hexdiff file1 file2

Het toont de hex (en 7-bits ASCII) van de twee bestanden boven elkaar, met eventuele verschillen gemarkeerd. Kijk op man hexdiff voor de commando’s om te verplaatsen in het bestand, en een eenvoudige q zal stoppen.

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

Het geeft misschien geen strikt antwoord op de vraag, maar ik gebruik dit voor differentiële binaire bestanden:

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

Het print beide bestanden uit als hex- en ASCII -waarden, een byte per regel, en gebruikt dan de diff-faciliteit van Vim om ze visueel weer te geven.

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

De firmware analyse tool binwalk heeft dit ook als functie via de -W/--hexdump opdrachtregel optie die opties biedt om alleen de verschillende bytes te tonen:

-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

In OP’s voorbeeld bij het doen van binwalk -W file1.bin file2.bin:

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

U kunt gvimdiff gebruiken dat is opgenomen in vim-gui-common pakket

sudo apt-get update

sudo apt-get install vim-gui-common

Dan kunt u 2 hex bestanden vergelijken met behulp van de volgende commando’s :

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

Tha’s all. Ik hoop dat dit helpt!

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

dhex http://www.dettus.net/dhex/ DHEX is meer dan alleen maar een hex-editor: het bevat een diff-modus, die kan worden gebruikt om gemakkelijk en gemakkelijk twee binaire bestanden te vergelijken. Aangezien het gebaseerd is op ncurses en thematisch is, kan het op een willekeurig aantal systemen en scenario’s draaien. Met het gebruik van zoeklogs is het mogelijk om veranderingen in verschillende iteraties van bestanden eenvoudig te volgen.

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

Het go to open source-product op Linux (en al het andere) is Radare dat radiff2 expliciet voor dit doel ter beschikking stelt. Ik heb gestemd om dit af te sluiten omdat ik en anderen dezelfde vraag hebben, in de vraag die u aan

stelt > _ voor elke verschillende byte_

Dat is echter krankzinnig. Want zoals gevraagd, als je een byte invoegt bij de eerste byte in het bestand, zou je merken dat elke volgende byte anders was en dus zou het verschil het hele bestand herhalen, voor een daadwerkelijk verschil van een byte.

Iets praktischer is radiff -O. De -O is voor “"Doe code diffing met alle bytes in plaats van alleen de vaste 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

Net als IDA Pro is Radare een primaire tool voor binaire analyse, je kunt ook delta diffing laten zien met -d, of de gedemonteerde bytes laten zien in plaats van hexen met -D.

Als je dit soort vragen stelt, kijk dan op

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

https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html ](https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html) BinDiff is een geweldige UI-tool voor het vergelijken van binaire bestanden die recentelijk open sourced zijn.