Hexdump je nástroj, který zobrazuje obsah binárních souborů v šestnáctkové, desítkové, osmičkové soustavě nebo ASCII. Je to nástroj pro kontrolu a lze jej použít pro obnovu dat, reverzní inženýrství a programování.
Základy
Hexdump poskytuje výstup s velmi malým úsilím z vaší strany a v závislosti na velikosti souboru, na který se díváte, může být výstup hodně. Pro účely tohoto článku vytvořte soubor PNG 1x1. Můžete to udělat pomocí grafické aplikace, jako je GIMP nebo Mtpaint, nebo ji můžete vytvořit v terminálu pomocí ImageMagick.
Zde je příkaz pro vygenerování 1x1 pixelu PNG pomocí ImageMagick:
$ convert -velikost 1x1 canvas:black pixel.png
Pomocí souboru můžete potvrdit, že se jedná o soubor PNG příkaz:
$ file pixel.png
pixel.png:obrazová data PNG, 1 x 1, 1bitový odstín šedi, neprokládaný
Možná se divíte, jak soubor příkaz je schopen určit, o jaký druh souboru se jedná. Shodou okolností to je to, co hexdump odhalí. Prozatím můžete svou jednopixelovou grafiku zobrazit v prohlížeči obrázků dle vašeho výběru (vypadá takto: . ), nebo můžete obsah souboru zobrazit pomocí hexdump :
$ hexdump pixel.png
0000000 5089 474E 0A0D 0A1A 0000 0d00 4849 5244
0000010 0000 3700 0100 0000010 0000 3700 0100 0000010 0000 3700 F96E
0000020 0024 0000 6704 4d41 0041 B100 0B8F 61FC
0000030 0005 0000 6320 5248 0026 8000 004d 7a00
0000040 0084 fa00 0000 8000 7500 0030 00e8 ea00
0000050 0060 3a00 0098 1700 9c70 51ba 003c 0000
0000060 6202 474b 0044 dd01 138a 00a4 0000 7407
0000070 4d49 0745 07e3 081a 3539 a487 46b0 0000
0000080 0a00 4449 5441 6063 0000 0200 d708 0100
0000090 21e2 33bc 2500 4574 7458 0000 6164 6574
00000a0 633a 6572 7461 0065 3032 3931 302d 2d37
00000b0 3532 3254 3a30 3735 353a 2b33 3231 303a
00000c0 AC30 5dcd 00c1 7425 5845 6474 0000 7461
00000d0 3a65 6f6d 6964 7966 3200 3130 3730 2d39
00000e0 322d 5435 3032 353a 3a37 3335 312b 3a32
00000f0 3030 90dd 7de5 0000 0000 4549 444e 42ae
0000100 8260
0000102
To, co vidíte, je obsah ukázkového souboru PNG objektivem, který jste možná nikdy předtím nepoužili. Jsou to přesně stejná data, která vidíte v prohlížeči obrázků, zakódovaná způsobem, který vám pravděpodobně není známý.
Extrahování známých řetězců
To, že výchozí výpis dat vypadá nesmyslně, neznamená, že postrádá cenné informace. Tento výstup nebo alespoň části, které se skutečně překládají, můžete přeložit do známější znakové sady pomocí --canonical možnost:
$ hexdump --canonical foo.png
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR0|
00 00 00 01 00 00 00 01 01 00 00 00 00 37 6e f9 |.............7n.|
00000020 24 00 00 00 04 67 41 40 0 8f 0b fc 61 |$....gAMA......a|
00000030 05 00 00 00 20 63 48 52 4d 00 00 7a 26 00 00 80 |.... cHRM..z ..|
00000040 84 00 00 fa 00 00 00 80 e8 00 00 75 30 00 00 ea |..........u0...|
00000050 60 00 00 98 00 00 17 70 9c ba 51 3c 00 00 00 |`..:....p..Q<...|
00000060 02 62 4b 47 44 00 01 dd 80 00 01 dd 80 000 07 a 4 74 |.bKGD..........t|
00000070 49 4d 45 07 e3 07 1a 08 39 35 87 a4 b0 46 00 00 |IME.....95...F. .|
00000080 00 0a 49 44 41 54 08 d7 63 60 00 00 00 02 00 01 |..IDAT..c`......|
00000090 b0c e302 25 74 45 58 74 64 61 74 65 |.!.3...%tEXtdate|
000000a0 3a 63 72 65 61 74 65 00 32 30 31 07 20 27 29 31-07 20 21 3
000000b0 32 35 54 32 30 3a 35 37 3a 35 33 2b 31 32 3a 30 |25T20:57:53+12:0|
000000c0 30 ac cd 5d c1 00 00 00 25 74 45 58]...|07 4 64. ... tEXtdat|
000000d0 65 3a 6d 6f 64 69 66 79 00 32 30 31 39 2d 30 37 |e:modify.2019-07|
00 333 53 50 3 00 20000 3 3 31 32 3a |-25T20:57:53+12:|
000000f0 30 30 dd 90 e5 7d 00 00 00 00 49 45 4e 44 ae 42...|IENDB...} br />00000100 60 82 |`.|
00000102
V pravém sloupci vidíte stejná data, která jsou vlevo, ale jsou prezentována jako ASCII. Pokud se podíváte pozorně, můžete si vybrat některé užitečné informace, jako je formát souboru (PNG) a – směrem dolů – datum a čas vytvoření a poslední úpravy souboru. Tečky představují symboly, které se nevyskytují ve znakové sadě ASCII, což lze očekávat, protože binární formáty nejsou omezeny na obyčejná písmena a čísla.
soubor příkaz ví z prvních 8 bajtů, co je tento soubor. Specifikace libpng upozorňuje programátory, co mají hledat. Můžete vidět, že v prvních 8 bytech tohoto souboru obrázku je konkrétně řetězec PNG . Tato skutečnost je významná, protože odhaluje, jak soubor příkaz ví, jaký typ souboru má nahlásit.
Můžete také řídit, kolik bajtů má hexdump zobrazí, což je užitečné u souborů větších než jeden pixel:
$ hexdump --délka 8 pixelů.png
0000000 5089 474e 0a0d 0a1a
0000008
hexdump nemusíte omezovat do PNG nebo grafických souborů. Můžete spustit hexdump proti binárním souborům, které denně spouštíte, jako je ls, rsync nebo jakýkoli binární formát, který chcete zkontrolovat.
Implementace kočky pomocí hexdump
Linuxový terminál
- 7 nejlepších emulátorů terminálu pro Linux
- 10 nástrojů příkazového řádku pro analýzu dat v systému Linux
- Stáhnout nyní:SSH cheat sheet
- Cheat sheet pro pokročilé příkazy systému Linux
- Výukové programy příkazového řádku systému Linux
Pokud si přečtete specifikaci PNG, můžete si všimnout, že data v prvních 8 bajtech vypadají jinak než hexdump poskytuje. Ve skutečnosti jsou to stejná data, ale jsou prezentována pomocí jiné konverze. Takže výstup hexdump je pravdivé, ale ne vždy pro vás přímo užitečné, v závislosti na tom, co hledáte. Z tohoto důvodu hexdump má možnosti formátovat a převádět nezpracovaná data, která vypisuje.
Možnosti převodu mohou být složité, takže je užitečné si nejprve procvičit něco triviálního. Zde je jemný úvod do formátování hexdump výstup reimplementací cat příkaz. Nejprve spusťte hexdump v textovém souboru, abyste viděli jeho nezpracovaná data. Kopii licence GNU General Public License (GPL) obvykle najdete někde na pevném disku nebo můžete použít jakýkoli textový soubor, který máte po ruce. Váš výstup se může lišit, ale zde je návod, jak najít kopii GPL ve vašem systému (nebo alespoň její části):
$ find /usr/share/doc/ -type f -name "KOPÍROVÁNÍ" | tail -1
/usr/share/doc/libblkid-devel/COPYING
Spusťte hexdump proti:
$ hexdump / usr / share / doc / libblkid-devel / kopírování
0000000 6854 7369 6269 6172 7972 6c20 6920 2073
0000010 7266 6565 7320 7774 7261 666f 3b65 7920
0000020 756f 6320 6e61 6465 7369 7274 7220 6269
0000030 7475 2065 7469 6120 646e 6f2f 0a72 6f6d
0000040 6964 7966 6920 2074 6564 2072 6874 6e75
0000050 2065 6574 2073 6d72 666f 7420 6568 4720
0000060 554E 4C20 7365 6573 2072 6547 6560
0000070 206CS 6369 6E069 6369
6369
6369
>>>Pokud je výstup souboru velmi dlouhý, použijte --length (nebo -n zkráceně), abyste to zvládli sami.
Nezpracovaná data pro vás pravděpodobně nic neznamenají, ale už víte, jak je převést do ASCII:
hexdump --canonical /usr/share/doc/libblkid-devel/KOPÍROVÁNÍ
00000000 54 68 69 73 20 6c 69 62 72 61 72 79 20 69 73 20 01 |0 /0 01 Tato knihovna is0 /0 |0 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 |svobodný software; y|
00000020 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 |f můžete přerozdělit|
00000030 75 74 64 65 6 62 ute it and/or.mo|
00000040 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 74 68 |změňte to pod th|
00000050 65 766 20 74 68 65 20 47 |e podmínky G|
00000060 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 72 61 |0 07 07 06 06 07 07 06 06 69 63 0a 4c 69 63 65 6e 73 65 |l Public.License|
[...]Tento výstup je užitečný, ale nepraktický a obtížně čitelný. Chcete-li formátovat hexdump výstup nad rámec toho, co nabízí jeho vlastní možnosti, použijte --format (nebo -e ) spolu se specializovanými formátovacími kódy. Zkratka použitá pro formátování je podobná jako u printf příkaz používá, takže pokud jste obeznámeni s printf výpisy, můžete najít hexdump snazší naučit se formátování.
V hexdump , posloupnost znaků %_p říká hexdump vytisknout znak ve výchozí znakové sadě vašeho systému. Všechny formátovací zápisy pro --format možnost musí být uzavřena v jednoduchých uvozovkách :
$ hexdump -e'"%_p"' /usr/share/doc/libblkid-devel/COPYING
Tato knihovna je zdarma*
software; můžete jej dále distribuovat a/nebo upravovat v souladu s podmínkami licence GNU Les*
er General Public.License vydané nadací Fre*
Software Foundation; buď.verze 2.1 licence, nebo (dle vašeho uvážení) kteroukoli pozdější.verze..*
Úplný text licence je k dispozici v..*
/Documentation/licenses/COPYING.LGPL -2.1-nebo-novější soubor..Tento výstup je lepší, ale stále nepohodlný ke čtení. Textové soubory UNIX tradičně předpokládají výstupní šířku 80 znaků (protože před dlouhou dobou měly monitory tendenci se vejít pouze 80 znaků).
I když tento výstup není vázán formátováním, můžete vynutit hexdump pro zpracování 80 bajtů najednou s dalšími možnostmi. Konkrétně vydělením 80 jednou zjistíte hexdump zacházet s 80 bajty jako s jednou jednotkou:
$ hexdump -e'80/1 "%_p"' /usr/share/doc/libblkid-devel/COPYING
Tato knihovna je svobodný software; můžete jej dále distribuovat a/nebo upravovat za podmínek GNU Lesser General Public.License, jak je vydává Free Software Foundation; buď.verze 2.1 licence, nebo (dle vašeho uvážení) kteroukoli pozdější.verze...Úplný text licence je k dispozici v souboru.../Documentation/licenses/COPYING.LGPL-2.1-or-later. .Nyní je soubor zpracováván v 80bajtových blocích, ale ztrácí smysl pro nové řádky. Pomocí \n můžete přidat vlastní znak, který v UNIXu představuje nový řádek:
$ hexdump -e'80/1 "%_p""\n"'
Tato knihovna je svobodný software; můžete jej dále distribuovat a/nebo upravovat podle
podmínek GNU Lesser General Public.License, jak je vydává Free Softwa
re Foundation; buď.verze 2.1 licence, nebo (dle vašeho uvážení) kdykoli později.
verze...Úplný text licence je k dispozici v.../Documentation/
licenses/COPYING.LGPL -2.1-nebo-novější soubor..Nyní jste (přibližně) implementovali kočku příkaz s hexdump formátování.
Ovládání výstupu
Formátování je realisticky způsob, jakým vytvoříte hexdump užitečný. Nyní, když jste alespoň v principu obeznámeni s hexdump formátování, můžete vytvořit výstup hexdump -n 8 odpovídat výstupu hlavičky PNG, jak je popsáno v oficiálním libpng spec.
Nejprve víte, že chcete hexdump pro zpracování souboru PNG v 8bajtových blocích. Kromě toho můžete pomocí rozpoznávání celého čísla vědět, že specifikace PNG je zdokumentována v desítkové soustavě, která je reprezentována %d podle hexdump dokumentace:
$ hexdump -n8 -e'8/1 "%d""\n"' pixel.png
13780787113102610Výstup můžete zdokonalit přidáním mezery za každé celé číslo:
$ hexdump -n8 -e'8/1 "%d ""\n"' pixel.png
137 80 78 71 13 10 26 10Výstup nyní dokonale odpovídá specifikaci PNG.
Hexdumping pro zábavu a zisk
Hexdump je fascinující nástroj, který vás nejen naučí více o tom, jak počítače zpracovávají a převádějí informace, ale také o tom, jak fungují formáty souborů a kompilované binární soubory. Měli byste zkusit spustit hexdump na souborech náhodně během dne při práci. Nikdy nevíte, jaké informace můžete najít, ani kdy se vám takový náhled může hodit.
Linux