Hlavní navigace

Hexadecimální prohlížeče a editory s textovým uživatelským rozhraním

21. 11. 2017
Doba čtení: 29 minut

Sdílet

 Autor: Pavel Tišnovský
V dnešním článku si popíšeme některé nástroje určené pro prohlížení a případnou editaci binárních souborů. Významné (a nezastupitelné) místo mezi těmito nástroji náleží takzvaným hexadecimálním prohlížečům a editorům.

Obsah

1. Hexadecimální prohlížeče a editory s textovým uživatelským rozhraním

2. Operace, které jsou podporované většinou hexadecimálních editorů

3. Krátká exkurze do minulosti

4. Hexadecimální prohlížeče dostupné pro Linux

5. Nástroj od

6. Nástroj hexdump

7. Filtr xxd určený pro převod mezi binárním souborem a zvolenou číselnou reprezentací

8. Prohlížeč binárních souborů zabudovaný do Midnight Commanderu

9. Nástroj pro porovnání dvou binárních souborů – hexdiff

10. Hexadecimální editory dostupné pro Linux

11. Hexadecimální editor nazvaný bvi

12. Nástroj hexer

13. Nástroj hexedit

14. Podobné jméno i funkce nabízené nástrojem hexeditor

15. Hexadecimální editor pojmenovaný dhex

16. Pokročilejší hexadecimální editory

17. Druhé krátké ohlédnutí do minulosti – pokročilý hexadecimální editor HIEW

18. Hexadecimální editor HT (HTE)

19. Linuxový hexadecimální editor Beye/Biew

20. Odkazy na Internetu

1. Hexadecimální prohlížeče a editory s textovým uživatelským rozhraním

V tomto článku si popíšeme některé zajímavé hexadecimální prohlížeče a editory dostupné pro Linux. Přitom se zaměříme na ty aplikace, které používají buď pouhý textový výstup (filtry) či celoobrazovkové textové uživatelské rozhraní (TUI). Co si však pod pojmenováním „hexadecimální prohlížeč“ nebo „hexadecimální editor“ máme představit? Jedná se o aplikace, které vstupní binární soubor (tj. soubor, který může mít libovolný obsah, jenž není nijak interpretován) zobrazí typickým způsobem ve formě hexadecimálních hodnot (tj. číselných hodnot využívajících při zobrazení šestnáctkovou soustavu) umístěných do sloupců (viz též první obrázek). Ve skutečnosti je však možné mnoho těchto prohlížečů a editorů nakonfigurovat takovým způsobem, že se namísto hexadeciálních hodnot používají hodnoty reprezentované v osmičkové soustavě, v soustavě dvojkové či dokonce v desítkové soustavě (což ovšem v naprosté většině případů není moc praktické).

Obrázek 1: Pohled na typický hexadecimální editor spuštěný na terminálu s osmdesáti sloupci a dvaceti pěti textovými řádky. Plocha terminálu je rozdělena do čtyř oblastí – sloupec adres, sloupec s hexadecimálními hodnotami, sloupec s textovou reprezentací bajtů a konečně na stavový a příkazový řádek (v některých případech obsahují hexadecimální editory i řádek s menu).

Ve stručnosti – alespoň jeden hexadecimální prohlížeč (pravděpodobně hexdump) a editor (možná bvi, dhex nebo ht?) by se měl stát součástí „toolboxu“ každého vývojáře, i když se s poměrně velkou pravděpodobností nebude jednat o dennodenně používanou utilitu.

2. Operace, které jsou podporované většinou hexadecimálních editorů

Jaké operace vlastně můžeme od hexa prohlížečů a hexa editorů očekávat? Především by mělo být možné zobrazit obsah vybraného (binárního) souboru ve formě sekvence bajtů či širších slov, přičemž číselná hodnota každého bajtu či slova může být zobrazena v binární, osmičkové či šestnáctkové (hexadecimální) soustavě. Na většině dnes používaných architektur se ponejvíce používá šestnáctková soustava, a to mj. i z toho důvodu, že tyto architektury zpracovávají slova rozdělená do bajtů a hodnotu každého bajtu je možné v šestnáctkové soustavě zobrazit pouhými dvěma číslicemi a navíc je po krátkém tréninku možné jednoduše při přečtení šestnáctkové číslice zjistit nastavení jednotlivých bitů. Hexadecimální editory také mnohdy nedokážou do souborů přidat či z nich ubírat bajty; tj. povolují jen přepis. Toto omezení však má svůj důvod – pokud se nemění délka editovaného souboru, je snadné do paměti načítat jen menší bloky a tudíž zpracovat soubor mnohonásobně větší, než je kapacita operační paměti. A protože i k celým souborovým systémům lze v Linuxu přistupovat jako k souborům (/dev/sdXY apod.), automaticky to znamená možnost přímé práce s celými souborovými systémy, s uloženými obrazy virtuálních strojů atd.

Obrázek 2: Kombinace hexadecimálního editoru s disassemblerem a dalšími specializovanými nástroji určenými pro ladění a úpravu nativních programů pro osmibitové mikropočítače Atari. Podobné nástroje však existují i pro další platformy, včetně starších herních konzolí (NES, SNES, …).

3. Krátká exkurze do minulosti

Hexadecimální prohlížeče a hexadecimální editory za sebou mají poměrně dlouhý vývoj, ostatně jejich vznik je možné datovat ještě do dob, kdy neexistovaly ani dnes již zcela běžné textové editory. Jeden z prvních programů tohoto typu se jmenoval SUPERZAP a používat se mohl na mainframech řady IBM OS/360 (existují i jeho verze pro další mainframy řady 370, 390 atd.). Podobné nástroje se později používaly i na domácích osmibitových mikropočítačích, a to mnohdy i ve chvíli, kdy by se dnes s velkou pravděpodobností využila jiná vhodnější aplikace, například assembler, disassembler, textový editor či grafický (bitmapový) editor. Ovšem kdo by čekal několik minut na nahrání grafického editoru z kazety, když si mohl postavičku do hry nakreslit na čtverečkovaný papír a potom napsat do hexadecimálního editoru? :-)

Obrázek 3: Mnohé hexadecimální editory dokázaly přistupovat přímo na sektory diskety a později i pevného disku. Vžil se pro ně název „diskeditory“ (a ne vždy sloužily ke zcela legálním činnostem).

S rozšířením IBM PC a operačního systému DOS samozřejmě vznikly hexa editory i pro tyto stroje. Většina klasických hexadecimálních editorů stále využívá textový režim. Vzhledem k tomu, že standardní textový režim (realizovaný přímo hardwarovými prostředky) dokázal na osobních mikropočítačích IBM PC zobrazit 80 znaků na textovém řádku, byla obrazovka těchto editorů rozdělena na tři části, které tvořily: sloupec s adresou (pořadím bajtu v souboru, tj. vlastně offsetem), 48 sloupců se šestnácti hexadecimálními hodnotami a konečně šestnáct znaků s ASCII hodnotami editovaných bajtů – podobný formát je ostatně dodržen dodnes, jak bude patrné ze screenshotů uvedených v navazujících kapitolách.

Obrázek 4: Prohlížeč binárních souborů implementovaný ve Volkov Commanderu (DOS/Windows). Ze screenshotu je patrné „klasické“ rozdělení okna na tři sloupce: adresy, hodnoty bajtů a jednotlivé znaky odpovídající pozicím bajtů. Toto rozdělení není typické pouze pro Volkov Commander, ale najdeme ho i v mnoha dalších nástrojích.

Samozřejmě nesmíme zapomenout ani do osobní mikropočítače Amiga a Atari ST, na nichž se tyto nástroje už začaly kombinovat s disassemblery a jednoduššími řádkovými assemblery. I zde docházelo ke slučování klasických hexadecimálních editorů s editory sektorů disket a disků.

Obrázek 5: Hexadecimální editor spuštěný ve Workbenchi (Amiga).

Obrázek 6: Velmi užitečná vlastnost některých hexadecimálních prohlížečů a editorů: možnost volby kódování znaků (kupodivu jen poměrně malé množství hexadecimálních editorů podporuje například UTF-8 či UTF-16).

4. Hexadecimální prohlížeče dostupné pro Linux

V následujících pěti kapitolách se seznámíme s nástroji určenými pro prohlížení obsahu binárních souborů. První dva nástroje nazvané od a hexdump (zkráceně hd) pracují jako relativně jednoduché jednosměrné filtry, ovšem další nástroj pojmenovaný xxd již může být použit pro obousměrný převod (filtraci), tj. jak pro transformaci původního binárního souboru do čitelného tvaru (většinou s využitím šestnáctkové soustavy), tak i pro zpětný převod. Díky tomu je možné xxd použít například ve funkci pluginu do běžných textových editorů. Další nástroj pojmenovaný hexdiff dokáže porovnat obsah dvou binárních souborů a poslední zmíněný nástroj mcview je, na rozdíl od předchozí čtveřice, aplikací s interaktivním ovládáním a plnohodnotným textovým uživatelským prostředím.

Obrázek 7: Další diskeditor dostupný pro osmibitové mikropočítače Atari.

5. Nástroj od

První utilita, kterou si dnes ve stručnosti představíme, se jmenuje od, což je zkratka vytvořená ze sousloví „octal dump“. Již fakt, že jméno této utility má pouhá dvě písmena, napovídá, že se jedná o nástroj pocházející již z prvních verzí Unixu. Původní varianty utility od vypisovaly obsah zvoleného souboru (alternativně standardního vstupu či zvoleného zařízení) s využitím osmičkové soustavy, ovšem GNU verze od nabízí uživatelům mnohem víc možností, a to včetně včetně použití hexadecimální soustavy (ostatně i proto o této utilitě dnes píšeme), zformátování sousedních čtyř bajtů do čísla typu single/float, dtto pro osm bajtů a čísla typu double apod.

Obrázek 8: Výchozí způsob zobrazení používaný nástrojem od se již mnoho desetiletí nezměnil.

Podívejme se na několik možností použití. Vždy budeme pracovat s binárním spustitelným souborem určeným pro 32bitovou architekturu ARM. Tento soubor vznikl překladem a slinkováním následujícího kódu naprogramovaného v assembleru:

# Syscall Linuxoveho jadra
sys_exit=1
 
.section .text
        .global _start       @ tento symbol ma byt dostupny i z linkeru
 
_start:
        mov   r7,$sys_exit   @ cislo sycallu pro funkci "exit"
        mov   r0,#0          @ exit code = 0
        svc   0              @ volani Linuxoveho kernelu

Výsledný binární soubor má délku 312 bajtů.

Obrázek 9: Přepnutí na zobrazení obsahu souboru pomocí šestnáctkové soustavy.

Výpis obsahu binárního souboru v osmičkové soustavě s použitím výchozího nastavení (povšimněte si oddělení hvězdičkou po 256 bajtech, což je historicky daná hodnota odpovídající jedné stránce paměti a/nebo jednomu sektoru):

od a.out
 
0000000 042577 043114 000401 000001 000000 000000 000000 000000
0000020 000002 000050 000001 000000 100124 000000 000064 000000
0000040 000230 000000 001000 002400 000064 000040 000001 000050
0000060 000004 000003 000001 000000 000000 000000 100000 000000
0000100 100000 000000 000140 000000 000140 000000 000005 000000
0000120 100000 000000 070001 161640 000000 161640 000000 167400
0000140 011501 000000 060400 060545 064542 000400 000011 000000
0000160 000406 000410 027000 064163 072163 072162 061141 027000
0000200 062564 072170 027000 051101 027115 072141 071164 061151
0000220 072165 071545 000000 000000 000000 000000 000000 000000
0000240 000000 000000 000000 000000 000000 000000 000000 000000
*
0000300 000013 000000 000001 000000 000006 000000 100124 000000
0000320 000124 000000 000014 000000 000000 000000 000000 000000
0000340 000004 000000 000000 000000 000021 000000 000003 070000
0000360 000000 000000 000000 000000 000140 000000 000024 000000
0000400 000000 000000 000000 000000 000001 000000 000000 000000
0000420 000001 000000 000003 000000 000000 000000 000000 000000
0000440 000164 000000 000041 000000 000000 000000 000000 000000
0000460 000001 000000 000000 000000
0000470

Přepnutí do šestnáctkové soustavy, ovšem se sdružením bajtů do 16bitových slov:

od -h a.out
 
0000000 457f 464c 0101 0001 0000 0000 0000 0000
0000020 0002 0028 0001 0000 8054 0000 0034 0000
0000040 0098 0000 0200 0500 0034 0020 0001 0028
0000060 0004 0003 0001 0000 0000 0000 8000 0000
0000100 8000 0000 0060 0000 0060 0000 0005 0000
0000120 8000 0000 7001 e3a0 0000 e3a0 0000 ef00
0000140 1341 0000 6100 6165 6962 0100 0009 0000
0000160 0106 0108 2e00 6873 7473 7472 6261 2e00
0000200 6574 7478 2e00 5241 2e4d 7461 7274 6269
0000220 7475 7365 0000 0000 0000 0000 0000 0000
0000240 0000 0000 0000 0000 0000 0000 0000 0000
*
0000300 000b 0000 0001 0000 0006 0000 8054 0000
0000320 0054 0000 000c 0000 0000 0000 0000 0000
0000340 0004 0000 0000 0000 0011 0000 0003 7000
0000360 0000 0000 0000 0000 0060 0000 0014 0000
0000400 0000 0000 0000 0000 0001 0000 0000 0000
0000420 0001 0000 0003 0000 0000 0000 0000 0000
0000440 0074 0000 0021 0000 0000 0000 0000 0000
0000460 0001 0000 0000 0000
0000470

Explicitní žádost, aby hodnoty bajtů nebyly spojovány do větších slov:

od -t x1 a.out
 
0000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
0000020 02 00 28 00 01 00 00 00 54 80 00 00 34 00 00 00
0000040 98 00 00 00 00 02 00 05 34 00 20 00 01 00 28 00
0000060 04 00 03 00 01 00 00 00 00 00 00 00 00 80 00 00
0000100 00 80 00 00 60 00 00 00 60 00 00 00 05 00 00 00
0000120 00 80 00 00 01 70 a0 e3 00 00 a0 e3 00 00 00 ef
0000140 41 13 00 00 00 61 65 61 62 69 00 01 09 00 00 00
0000160 06 01 08 01 00 2e 73 68 73 74 72 74 61 62 00 2e
0000200 74 65 78 74 00 2e 41 52 4d 2e 61 74 74 72 69 62
0000220 75 74 65 73 00 00 00 00 00 00 00 00 00 00 00 00
0000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0000300 0b 00 00 00 01 00 00 00 06 00 00 00 54 80 00 00
0000320 54 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00
0000340 04 00 00 00 00 00 00 00 11 00 00 00 03 00 00 70
0000360 00 00 00 00 00 00 00 00 60 00 00 00 14 00 00 00
0000400 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
0000420 01 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00
0000440 74 00 00 00 21 00 00 00 00 00 00 00 00 00 00 00
0000460 01 00 00 00 00 00 00 00
0000470

Zákaz výpisu oddělovací hvězdičky:

od -v -t x1 a.out
 
0000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
0000020 02 00 28 00 01 00 00 00 54 80 00 00 34 00 00 00
0000040 98 00 00 00 00 02 00 05 34 00 20 00 01 00 28 00
0000060 04 00 03 00 01 00 00 00 00 00 00 00 00 80 00 00
0000100 00 80 00 00 60 00 00 00 60 00 00 00 05 00 00 00
0000120 00 80 00 00 01 70 a0 e3 00 00 a0 e3 00 00 00 ef
0000140 41 13 00 00 00 61 65 61 62 69 00 01 09 00 00 00
0000160 06 01 08 01 00 2e 73 68 73 74 72 74 61 62 00 2e
0000200 74 65 78 74 00 2e 41 52 4d 2e 61 74 74 72 69 62
0000220 75 74 65 73 00 00 00 00 00 00 00 00 00 00 00 00
0000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000300 0b 00 00 00 01 00 00 00 06 00 00 00 54 80 00 00
0000320 54 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00
0000340 04 00 00 00 00 00 00 00 11 00 00 00 03 00 00 70
0000360 00 00 00 00 00 00 00 00 60 00 00 00 14 00 00 00
0000400 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
0000420 01 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00
0000440 74 00 00 00 21 00 00 00 00 00 00 00 00 00 00 00
0000460 01 00 00 00 00 00 00 00
0000470

Výpis 128 bajtů od offsetu 64 (počet bajtů i offset se zadává desítkově):

od -j 64 -N 128 -v -t x1 a.out
 
0000100 00 80 00 00 60 00 00 00 60 00 00 00 05 00 00 00
0000120 00 80 00 00 01 70 a0 e3 00 00 a0 e3 00 00 00 ef
0000140 41 13 00 00 00 61 65 61 62 69 00 01 09 00 00 00
0000160 06 01 08 01 00 2e 73 68 73 74 72 74 61 62 00 2e
0000200 74 65 78 74 00 2e 41 52 4d 2e 61 74 74 72 69 62
0000220 75 74 65 73 00 00 00 00 00 00 00 00 00 00 00 00
0000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000300

Výpis 128 bajtů od offsetu 64 (počet bajtů i offset se zadává v šestnáctkové soustavě):

od -j 0x40 -N 0x80 -v -t x1 a.out
 
0000100 00 80 00 00 60 00 00 00 60 00 00 00 05 00 00 00
0000120 00 80 00 00 01 70 a0 e3 00 00 a0 e3 00 00 00 ef
0000140 41 13 00 00 00 61 65 61 62 69 00 01 09 00 00 00
0000160 06 01 08 01 00 2e 73 68 73 74 72 74 61 62 00 2e
0000200 74 65 78 74 00 2e 41 52 4d 2e 61 74 74 72 69 62
0000220 75 74 65 73 00 00 00 00 00 00 00 00 00 00 00 00
0000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000300

Každé čtyři bajty jsou považovány za číslo ve formátu single/float podle IEEE 754. Zde se sice jedná o zcela nesmyslný výstup, ovšem při načítán binárních souborů s poli se může hodit:

od -t f4 a.out
 
0000000       13073.374      9.2196e-41               0               0
0000020    3.673423e-39           1e-45      4.6035e-41         7.3e-44
0000040        2.13e-43   6.0188984e-36    2.938809e-39    3.673421e-39
0000060     2.75512e-40           1e-45               0      4.5918e-41
0000100      4.5918e-41        1.35e-43        1.35e-43           7e-45
0000120      4.5918e-41  -5.9190996e+21   -5.902958e+21  -3.9614081e+28
0000140       6.907e-42   2.6445587e+20   2.3585495e-38         1.3e-44
0000160    2.497999e-38   4.5935344e+24    7.683702e+31    2.919121e-11
0000200    7.871993e+31   2.0742511e+11   7.1362664e+31  1.07658465e+21
0000220   1.8179291e+31               0               0               0
0000240               0               0               0               0
*
0000300         1.5e-44           1e-45           8e-45      4.6035e-41
0000320        1.18e-43         1.7e-44               0               0
0000340           6e-45               0         2.4e-44   1.5845638e+29
0000360               0               0        1.35e-43         2.8e-44
0000400               0               0           1e-45               0
0000420           1e-45           4e-45               0               0
0000440        1.63e-43         4.6e-44               0               0
0000460           1e-45               0
0000470

Následující příklad vypíše část sektoru ze zvoleného blokového zařízení, dejte si ovšem pozor, že od bude poctivě „seekovat“ na zadaný offset:

sudo od -j 100000000 -N 256 -v -t x1 /dev/sda1
 
...
...
...

Obrázek 10: Alternativní způsob, kdy se kromě kódů znaků zobrazí i jejich jméno v ASCII.

6. Nástroj hexdump

Druhá utilitka, kterou si dnes popíšeme, se jmenuje hexdump, zkráceně též hd (druhé zmíněné jméno tvoří symbolický odkaz na binární spustitelný soubor hexdump). Podobně jako u výše popsaného nástroje od je i jméno hexdump poněkud matoucí, protože hexdump dokáže vypsat obsah vybraného binárního souboru jak s využitím šestnáctkové soustavy, tak i s využitím soustavy desítkové a osmičkové. Kromě toho dokáže hexdump zobrazit obsah souboru s využitím „kanonického zobrazení“, což u hexadecimálních prohlížečů a editorů znamená s použitím tří sloupců: adres (offsetů), obsahu šestnácti bajtů a znaků reprezentovaných těmito bajty. Specifikovat je možné jak počáteční adresu (offset od začátku souboru), tak i počet vypsaných bajtů, podobně jako ve výše zmíněné utilitě od. Pokud navíc nějaký formát výstupu používáte častěji, lze ho uložit do souboru a ten potom použít pro formátování.

Obrázek 11: Výpis obsahu souboru v šestnáctkovém režimu, ovšem se sdružením bajtů do dvojic.

Opět si ukažme několik příkladů použití utility hexdump:

Pokud se použije příkaz hd, je implicitně povolen „kanonický formát“:

hd a.out
 
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 28 00 01 00 00 00  54 80 00 00 34 00 00 00  |..(.....T...4...|
00000020  98 00 00 00 00 02 00 05  34 00 20 00 01 00 28 00  |........4. ...(.|
00000030  04 00 03 00 01 00 00 00  00 00 00 00 00 80 00 00  |................|
00000040  00 80 00 00 60 00 00 00  60 00 00 00 05 00 00 00  |....`...`.......|
00000050  00 80 00 00 01 70 a0 e3  00 00 a0 e3 00 00 00 ef  |.....p..........|
00000060  41 13 00 00 00 61 65 61  62 69 00 01 09 00 00 00  |A....aeabi......|
00000070  06 01 08 01 00 2e 73 68  73 74 72 74 61 62 00 2e  |......shstrtab..|
00000080  74 65 78 74 00 2e 41 52  4d 2e 61 74 74 72 69 62  |text..ARM.attrib|
00000090  75 74 65 73 00 00 00 00  00 00 00 00 00 00 00 00  |utes............|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  0b 00 00 00 01 00 00 00  06 00 00 00 54 80 00 00  |............T...|
000000d0  54 00 00 00 0c 00 00 00  00 00 00 00 00 00 00 00  |T...............|
000000e0  04 00 00 00 00 00 00 00  11 00 00 00 03 00 00 70  |...............p|
000000f0  00 00 00 00 00 00 00 00  60 00 00 00 14 00 00 00  |........`.......|
00000100  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00000110  01 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00000120  74 00 00 00 21 00 00 00  00 00 00 00 00 00 00 00  |t...!...........|
00000130  01 00 00 00 00 00 00 00                           |........|
00000138

Standardní formát použitý při volbě příkazu hexdump a nikoli hd:

hexdump a.out
 
0000000   17791   17996   00257   00001   00000   00000   00000   00000
0000010   00002   00040   00001   00000   32852   00000   00052   00000
0000020   00152   00000   00512   01280   00052   00032   00001   00040
0000030   00004   00003   00001   00000   00000   00000   32768   00000
0000040   32768   00000   00096   00000   00096   00000   00005   00000
0000050   32768   00000   28673   58272   00000   58272   00000   61184
0000060   04929   00000   24832   24933   26978   00256   00009   00000
0000070   00262   00264   11776   26739   29811   29810   25185   11776
0000080   25972   29816   11776   21057   11853   29793   29300   25193
0000090   29813   29541   00000   00000   00000   00000   00000   00000
00000a0   00000   00000   00000   00000   00000   00000   00000   00000
*
00000c0   00011   00000   00001   00000   00006   00000   32852   00000
00000d0   00084   00000   00012   00000   00000   00000   00000   00000
00000e0   00004   00000   00000   00000   00017   00000   00003   28672
00000f0   00000   00000   00000   00000   00096   00000   00020   00000
0000100   00000   00000   00000   00000   00001   00000   00000   00000
0000110   00001   00000   00003   00000   00000   00000   00000   00000
0000120   00116   00000   00033   00000   00000   00000   00000   00000
0000130   00001   00000   00000   00000
0000138

Při použití hexdump musíme kanonický formát povolit volbou -C:

hexdump -C a.out
 
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 28 00 01 00 00 00  54 80 00 00 34 00 00 00  |..(.....T...4...|
00000020  98 00 00 00 00 02 00 05  34 00 20 00 01 00 28 00  |........4. ...(.|
00000030  04 00 03 00 01 00 00 00  00 00 00 00 00 80 00 00  |................|
00000040  00 80 00 00 60 00 00 00  60 00 00 00 05 00 00 00  |....`...`.......|
00000050  00 80 00 00 01 70 a0 e3  00 00 a0 e3 00 00 00 ef  |.....p..........|
00000060  41 13 00 00 00 61 65 61  62 69 00 01 09 00 00 00  |A....aeabi......|
00000070  06 01 08 01 00 2e 73 68  73 74 72 74 61 62 00 2e  |......shstrtab..|
00000080  74 65 78 74 00 2e 41 52  4d 2e 61 74 74 72 69 62  |text..ARM.attrib|
00000090  75 74 65 73 00 00 00 00  00 00 00 00 00 00 00 00  |utes............|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  0b 00 00 00 01 00 00 00  06 00 00 00 54 80 00 00  |............T...|
000000d0  54 00 00 00 0c 00 00 00  00 00 00 00 00 00 00 00  |T...............|
000000e0  04 00 00 00 00 00 00 00  11 00 00 00 03 00 00 70  |...............p|
000000f0  00 00 00 00 00 00 00 00  60 00 00 00 14 00 00 00  |........`.......|
00000100  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00000110  01 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00000120  74 00 00 00 21 00 00 00  00 00 00 00 00 00 00 00  |t...!...........|
00000130  01 00 00 00 00 00 00 00                           |........|
00000138

Zákaz použití oddělovací hvězdičky:

hd -v a.out
 
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 28 00 01 00 00 00  54 80 00 00 34 00 00 00  |..(.....T...4...|
00000020  98 00 00 00 00 02 00 05  34 00 20 00 01 00 28 00  |........4. ...(.|
00000030  04 00 03 00 01 00 00 00  00 00 00 00 00 80 00 00  |................|
00000040  00 80 00 00 60 00 00 00  60 00 00 00 05 00 00 00  |....`...`.......|
00000050  00 80 00 00 01 70 a0 e3  00 00 a0 e3 00 00 00 ef  |.....p..........|
00000060  41 13 00 00 00 61 65 61  62 69 00 01 09 00 00 00  |A....aeabi......|
00000070  06 01 08 01 00 2e 73 68  73 74 72 74 61 62 00 2e  |......shstrtab..|
00000080  74 65 78 74 00 2e 41 52  4d 2e 61 74 74 72 69 62  |text..ARM.attrib|
00000090  75 74 65 73 00 00 00 00  00 00 00 00 00 00 00 00  |utes............|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000c0  0b 00 00 00 01 00 00 00  06 00 00 00 54 80 00 00  |............T...|
000000d0  54 00 00 00 0c 00 00 00  00 00 00 00 00 00 00 00  |T...............|
000000e0  04 00 00 00 00 00 00 00  11 00 00 00 03 00 00 70  |...............p|
000000f0  00 00 00 00 00 00 00 00  60 00 00 00 14 00 00 00  |........`.......|
00000100  00 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00000110  01 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00000120  74 00 00 00 21 00 00 00  00 00 00 00 00 00 00 00  |t...!...........|
00000130  01 00 00 00 00 00 00 00                           |........|
00000138

Použití osmičkové soustavy:

hexdump -b a.out
 
0000000 177 105 114 106 001 001 001 000 000 000 000 000 000 000 000 000
0000010 002 000 050 000 001 000 000 000 124 200 000 000 064 000 000 000
0000020 230 000 000 000 000 002 000 005 064 000 040 000 001 000 050 000
0000030 004 000 003 000 001 000 000 000 000 000 000 000 000 200 000 000
0000040 000 200 000 000 140 000 000 000 140 000 000 000 005 000 000 000
0000050 000 200 000 000 001 160 240 343 000 000 240 343 000 000 000 357
0000060 101 023 000 000 000 141 145 141 142 151 000 001 011 000 000 000
0000070 006 001 010 001 000 056 163 150 163 164 162 164 141 142 000 056
0000080 164 145 170 164 000 056 101 122 115 056 141 164 164 162 151 142
0000090 165 164 145 163 000 000 000 000 000 000 000 000 000 000 000 000
00000a0 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
*
00000c0 013 000 000 000 001 000 000 000 006 000 000 000 124 200 000 000
00000d0 124 000 000 000 014 000 000 000 000 000 000 000 000 000 000 000
00000e0 004 000 000 000 000 000 000 000 021 000 000 000 003 000 000 160
00000f0 000 000 000 000 000 000 000 000 140 000 000 000 024 000 000 000
0000100 000 000 000 000 000 000 000 000 001 000 000 000 000 000 000 000
0000110 001 000 000 000 003 000 000 000 000 000 000 000 000 000 000 000
0000120 164 000 000 000 041 000 000 000 000 000 000 000 000 000 000 000
0000130 001 000 000 000 000 000 000 000
0000138

Výpis znaků popř. jejich symbolických jmen v ASCII:

hexdump -c a.out
 
0000000 177   E   L   F 001 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000010 002  \0   (  \0 001  \0  \0  \0   T 200  \0  \0   4  \0  \0  \0
0000020 230  \0  \0  \0  \0 002  \0 005   4  \0      \0 001  \0   (  \0
0000030 004  \0 003  \0 001  \0  \0  \0  \0  \0  \0  \0  \0 200  \0  \0
0000040  \0 200  \0  \0   `  \0  \0  \0   `  \0  \0  \0 005  \0  \0  \0
0000050  \0 200  \0  \0 001   p       ă  \0  \0       ă  \0  \0  \0   ď
0000060   A 023  \0  \0  \0   a   e   a   b   i  \0 001  \t  \0  \0  \0
0000070 006 001  \b 001  \0   .   s   h   s   t   r   t   a   b  \0   .
0000080   t   e   x   t  \0   .   A   R   M   .   a   t   t   r   i   b
0000090   u   t   e   s  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
00000a0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
00000c0  \v  \0  \0  \0 001  \0  \0  \0 006  \0  \0  \0   T 200  \0  \0
00000d0   T  \0  \0  \0  \f  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
00000e0 004  \0  \0  \0  \0  \0  \0  \0 021  \0  \0  \0 003  \0  \0   p
00000f0  \0  \0  \0  \0  \0  \0  \0  \0   `  \0  \0  \0 024  \0  \0  \0
0000100  \0  \0  \0  \0  \0  \0  \0  \0 001  \0  \0  \0  \0  \0  \0  \0
0000110 001  \0  \0  \0 003  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000120   t  \0  \0  \0   !  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000130 001  \0  \0  \0  \0  \0  \0  \0
0000138

Obrázek 12: Výpis obsahu souboru s využitím osmičkové soustavy.

Obrázek 13: „Kanonický“ režim výstupu, který je použit i v prakticky všech ostatních dnes popisovaných nástrojích.

7. Filtr xxd určený pro převod mezi binárním souborem a zvolenou číselnou reprezentací

Ani další nástroj, o němž se v dnešním článku zmíníme, nepatří mezi běžné hexadecimální editory, vlastně se nejedná ani o plnohodnotný prohlížeč. Tímto nástrojem je filtr nazvaný xxd. Slovo „filtr“ jsem na tomto místě použil záměrně, neboť xxd slouží k převodu binárního souboru na textový soubor, v němž jsou původní data uložena do třech sloupců: adresy, číselných hodnot jednotlivých bajtů či slov a řetězcové podoby těchto bajtů. Co činí xxd užitečným je možnost zpětného převodu takto zformátovaného textového souboru zpět do binární podoby (přičemž se v úvahu bere jen prostřední sloupec s číselnými hodnotami bajtů).

Obrázek 14: Nápověda k filtru xxd.

Díky této vlastnosti je možné jakýkoli binární soubor převést do textové podoby, změnit tento soubor v libovolném oblíbeném textovém editoru a následně provést zpětný převod. Aby toho nebylo málo, je možné použít několik voleb ovlivňujících tvar textového souboru: změnit lze číselnou soustavu, sdružování bajtů do slov atd. Perlička na závěr: xxd je jedním z mála programů rozpoznávajících kromě ASCII kódování i EBCDIC (jednou jsem tuto vlastnost dokonce využil pro export dat z mainframu do PC :-).

Na dalších screenshotech je ukázáno, jaký vliv mají různé volby na způsob zobrazení binárního souboru:

Obrázek 15: Volbou -g1 je možné xxd donutit ke způsobu zobrazení známého z ostatních hexadecimálních editorů.

Obrázek 16: Volba -g2 je vhodná v případě, že jsou v binárním souboru uložena 16bitová data.

Obrázek 17: Sdružování bajtů do čtyřbajtových (32bitových) slov.

Obrázek 18: Zajímavá může být i kombinace voleb -g1 -b, kdy se namísto šestnáctkové soustavy použije soustava dvojková. Je tak například možné hledat obrázky a sprity v maskách ROM starých her.

8. Prohlížeč binárních souborů zabudovaný do Midnight Commanderu

Prohlížeč binárních souborů mohou používat i uživatelé stále velmi oblíbeného Midnight Commanderu. Tento prohlížeč, který se implicitně spouští klávesovou zkratkou F3 (popř. z příkazového řádku pomocí mcview, což je symbolický odkaz na mc), je možné využít ve třech režimech: buď je obsah zvoleného souboru zobrazen jako text přímo načtený ze souboru a nijak dál nezpracovaný (raw), popř. prohlížeč zavolá externí nástroj pro filtraci vstupního souboru na text (příkladem je zobrazení HTML, konfiguruje se v souboru mc.ext), nebo se prohlížeč přepne do téměř klasického pohledu používaného i mnohými dalšími hexadecimálníni prohlížeči a hexadecimálními editory.

Obrázek 19: Hexadecimální prohlížeč, který je součástí souborového manažeru Midnight Commander.

Za zmínku stojí dvě zajímavé vlastnosti. První vlastností je velmi dobrá podpora pro hledání řetězců či sekvence bajtů (viz též příslušný obrázek). Další užitečná vlastnost spočívá v možnosti volby kódování znaků (opět zobrazeno na screenshotu), protože například při opravě databázových souborů či uložených stavů her je nutné zvolit stejné kódování, jaké je interně použito v dané aplikaci (a ne vždy se jedná o UTF-8, dokonce bych řekl, že toto kódování je u binárních souborů stále spíše dosti výjimečné).

Obrázek 20: Možnosti prohledávání nabízené interním hexadecimálním prohlížečem Midnight Commanderu.

V následující tabulce jsou zobrazeny nejdůležitější klávesové zkratky tohoto prohlížeče, a to včetně poněkud skryté zkratky pro volbu kódování (tato zkratka totiž není mapována na funkční klávesy F1F10):

Klávesa Význam
F2 přepnutí režimu odřádkování při zobrazení textu
F4 přepnutí mezi textovým a hexa režimem
F8 přepnutí mezi „raw“ režimem (zobrazení obsahu souboru) a filtrovaným vstupem
F9 přepnutí mezi interpretací některých znaků speciálním způsobem (příkladem jsou man stránky, obrázek 23)
Alt+E přepnutí znakové sady
Alt+R zobrazení pravítka nahoře/dole/nikde
   
F5 přechod na řádek
F6 vyhledávání s využitím regulárních výrazů
/ vyhledávání s využitím regulárních výrazů
? vyhledávání, ale opačným směrem
F7 vyhledávání (včetně možnosti práce s hexa kódy)

Obrázek 21: Velmi důležitá funkce interního hexadecimálního prohlížeče – volba kódování znaků.

Obrázek 22: Nyní se obsah binárního souboru zobrazuje s použitím azbuky (pravý sloupec se znaky).

Obrázek 23: Zobrazení manuálové stránky se zapnutou volbou „Format“ [F9].

Obrázek 24: Zobrazení manuálové stránky s vypnutou volbou „Format“ [F9].

9. Nástroj pro porovnání dvou binárních souborů – hexdiff

Utilitka nazvaná přímočaře hexdiff již svým názvem napovídá, k čemu je určena – k porovnání dvou (typicky binárních) souborů. Oproti známé utilitě diff se však v případě hexdiffu zobrazí interaktivní prostředí využívající celou plochu terminálu, v němž se obsah obou porovnávaných souborů zobrazí podobně, jako v běžných hexadecimálních prohlížečích a editorech, což je ostatně patrné i z následujícího screenshotu:

Obrázek 25: Porovnání dvou spustitelných souborů určených pro Linux běžící na 32bitové architektuře ARM. Oba soubory mohly vzniknout překladem stejného zdrojového kódu, ovšem s jinými volbami.

Pomocí klávesy n je možné se přesunout na další nalezenou změnu, což je velmi užitečné, především při hledání rozdílů mezi velkými soubory. Poněkud netypickým příkladem použití může být oprava struktury FAT na paměťové kartě (samotná FAT existuje ve dvou kopiích), protože tento souborový systém se bohužel stále používá (fotoaparáty atd.), i když je z technologického hlediska pro paměťové karty zcela nevhodný.

Klávesové zkratky této utility:

Zkratka Význam
0 $ přesun kurzoru na začátek/konec řádku
u d přesun pohledu nahoru/dolů o jeden řádek
j k dtto (pozor – přesně opačně než ve Vimu!)
   
n přesun na další nalezenou změnu (nejužitečnější příkaz)
i zobrazení informací o inode prvního souboru
I zobrazení informací o inode obou souborů
TAB přepnutí mezi soubory (vlastně jen zobrazení změn ve druhém souboru)
   
H přepnutí zobrazení offsetů (první sloupec) mezi hexadecimální a desítkovou soustavou
g umožní zadání offsetu (adresy, od které se prohlíží)
   
x q ukončení prohlížeče

Obrázek 26: Po stisku klávesové zkratky I (velké I) se zobrazí informace o inodech obou porovnávaných souborů.

10. Hexadecimální editory dostupné pro Linux

V navazujících kapitolách si popíšeme vybrané hexadecimální editory dostupné pro Linux. Zaměříme se přitom na ty nástroje, které pro komunikaci s uživatelem používají textové uživatelské rozhraní. Všechny dále zmíněné hexadecimální editory dokážou správně pracovat při jakékoli (rozumné) velikosti terminálu, i když screenshoty byly kvůli možnosti porovnání se staršími programy určenými pro textový režim IBM PC pořízeny na terminálu s pouhými dvaceti pěti textovými řádky a osmdesáti znaky na řádek. Většina editorů využívá „klasické“ rozložení obrazovky na tři sloupce (adresy, hexa/deci/binární data, znaky), ovšem jejich ovládání se odlišuje – u některých nástrojů najdeme emulaci klávesových zkratek editoru Vi, u dalších pak spíše návaznost na Emacs či na velmi populární DOSovský hexadecimální editor HIEW.

Obrázek 27: Hexadecimální editor bvi: důležitá sekce nápovědy, ve které se popisuje rozdíl mezi textovým editorem Vi a binárním editorem Bvi.

U většiny hexadecimálních editorů s textovým uživatelským rozhraním se setkáme s velmi důležitou vlastností – tyto editory se nesnaží načíst celý editovaný soubor (či dokonce celý souborový systém), ale pracují vždy pouze s vybraným blokem, což může být řádově několik (desítek) sektorů. Díky této vlastnosti je možné efektivně pracovat i se soubory, které jsou mnohonásobně větší, než je volná kapacita operační paměti. U běžných textových editorů je implementace této vlastnosti mnohem složitější, neboť se při editaci mění (a to prakticky neustále) délka souboru.

Obrázek 28: Důležitá vlastnost většiny běžných hexadecimálních editorů – i při editaci obrovského souboru (zde konkrétně videa) nebo dokonce souborového systému se do paměti načítá jen krátký blok, nikoli celý soubor/systém.

11. Hexadecimální editor nazvaný bvi

Prvním plnohodnotným hexadecimálním editorem, který si dnes popíšeme, je nástroj nazvaný bvi. Jméno této aplikace je odvozeno od dvojice slov „binary“ a „vi“, což již naznačuje, že se jedná o nástroj, jehož ovládání bude do značné míry podobné ovládání textových editorů Vi a Vim. Skutečně je tomu tak, samozřejmě s tím rozdílem, že bvi používá stejný způsob zobrazení jako mnohé další hexadecimální editory, což je ostatně patrné i při pohledu na screenshoty zobrazené v této kapitole.

Obrázek 29: Hexadecimální editor bvi: textové uživatelské rozhraní binárního editoru Bvi.

Dalším rozdílem mezi Vi a Bvi je změněné chování některých operací, což je ale pochopitelné, neboť binární soubory jsou zpracovávány jako jeden dlouhý blok bajtů a nikoli jako sekvence textových řádků. Zajímavé ovšem je, že bvi je možné volbou „memmove“ přepnout do režimu, v němž je možné jednotlivé bajty přidávat či naopak umazávat (což je operace, která je v některých dalších hexadecimálních editorech nedostupná a v mnoha případech vlastně i nesmyslná).

Obrázek 30: Hexadecimální editor bvi: výpis všech parametrů editoru, které je možné kdykoli změnit.

V následující tabulce naleznete základní příkazy editoru bvi, které se skutečně příliš neliší od originálního vi:

# Příkaz Význam
1 r přepis bajtu (režim replace)
2 R přepis většího množství bajtů (režim replace)
     
3 i vkládání bajtů (režim insert), musí se povolit pomocí memmove
4 x smazání bajtu, musí se povolit pomocí memmove
     
5 / vyhledávání (směrem dopředu)
6 ? vyhledávání (směrem dozadu)
7 n posun kurzoru na následující výskyt hledaného řetězce/hodnoty
8 N posun kurzoru na předchozí výskyt hledaného řetězce/hodnoty
     
9 . opakování posledního příkazu (ideální v kombinaci s r)
10 u undo (poslední změna)
11 TAB přesun mezi hexa hodnotami a znaky (druhý a třetí sloupec)

Obrázek 31: Hexadecimální editor bvi: vlastní editace binárního souboru.

Druhá tabulka obsahuje příkazy pro pohyb v souboru:

# Příkaz Význam
1 h j k l posun kurzoru po jednotlivých znacích či bajtech
2 ^ $ posun kurzoru na začátek/konec řádku
3 w posun kurzoru na další slovo (platí pro pravý sloupec)
4 e posun kurzoru na konec slova (platí pro pravý sloupec, pokud je kurzor na slovu)
5 b posun kurzoru na začátek slova (platí pro pravý sloupec)
     
6 Ctrl+B scrollování směrem nahoru o celou obrazovku
7 Ctrl+F scrollování směrem nahoru o celou obrazovku
8 Ctrl+U scrollování směrem nahoru o polovinu obrazovky
9 Ctrl+D scrollování směrem nahoru o polovinu obrazovky
     
10 H přesun na první řádek na obrazovce
11 L přesun na poslední řádek na obrazovce
12 M přesun na prostřední řádek

Obrázek 32: Hexadecimální editor bvi: režim přepisu znaků.

12. Nástroj hexer

Další hexadecimální editor dostupný pro operační systém Linux se nazývá příznačně hexer. Tato aplikace je opět určena pro spuštění v terminálu (konzoli) a způsob jejího ovládání je velmi podobný výše popsanému nástroji bvi. Je tomu tak z toho důvodu, že jak hexer tak i bvi používají klávesové zkratky (příkazy) odvozené od zkratek využívaných v textovém editoru vi i v jeho následovnících (pozor ovšem na to, že existuje stejnojmenný hexadecimální editor vybavený grafickým uživatelským rozhraním, který se však ovládá poněkud odlišně). Oba zmíněné hexadecimální editory, tj. jak bvi, tak i hexer, taktéž zobrazují obsah editovaného binárního souboru podobným způsobem, což je ostatně velmi dobře patrné při pohledu na screenshoty, které můžete najít pod tímto odstavcem.

Obrázek 33: Manuálová stránka k nástroji hexer.

Mezi důležité vlastnosti editoru hexer (které nejsou patrné na první pohled) patří podpora většího množství bufferů, mezi nimiž je možné se přepínat. Zajímavé přitom je, že i některé na první pohled vyspělejší hexa editory tuto možnost postrádají. Dále je možné používat operaci typu undo se zvoleným počtem zapamatovaných minulých stavů. Další velmi užitečnou vlastností je podpora pro takzvané binární regulární výrazy, které jsou obdobou běžných regulárních výrazů, ovšem s tím rozšířením, že je do nich možné zapisovat i číselné kódy bajtů s využitím různých číselných základů (osmičková soustava, šestnáctková soustava), tyto kódy se v případě potřeby zapisují i ve formě „řetězců“ stylem „\xxff fe*“ atd.

Obrázek 34: Takto vypadá uživatelské prostředí nástroje hexer.

V předchozím textu jsme si řekli, že aplikace hexer používá podobné příkazy jako známý textový editor vi či Vim. V následující tabulce jsou vybrané příkazy vypsány, takže je velmi snadné porovnat, do jaké míry je hexer z hlediska ovládání editoru vi podobný či naopak rozdílný:

# Příkaz Význam
1 h j k l posun kurzoru po jednotlivých znacích či bajtech
2 w posun kurzoru na další slovo (platí pro pravý sloupec)
3 e posun kurzoru na konec slova (platí pro pravý sloupec)
4 b posun kurzoru na začátek slova (platí pro pravý sloupec)
5 n posun kurzoru na následující výskyt hledaného řetězce/hodnoty
6 N posun kurzoru na předchozí výskyt hledaného řetězce/hodnoty
     
7 r přepis bajtu (režim replace)
8 R přepis většího množství bajtů (režim replace)
9 i vkládání bajtů (režim insert)
10 v vizuální režim (výběr bloku)
11 x smazání bajtu
     
12 / vyhledávání (směrem dopředu)
13 ? vyhledávání (směrem dozadu)
14 . opakování posledního příkazu
     
15 y yank (odpovídá příkazu copy)
16 p paste

Obrázek 35: Hexer podporuje i vizuální bloky, podobně jako textový editor Vim.

Velmi užitečné je, že před většinu příkazů je možné v případě potřeby zapsat počet opakování, opět podobně jako v textovém editoru vi. To je významný posun oproti „obyčejným“ hexadecimálním editorům.

Obrázek 36: Vyhledávání řetězce či sekvence bajtů s využitím příkazu / (search).

13. Nástroj hexedit

Další hexadecimální editor, který je možné provozovat v terminálu na Linuxu, se jmenuje hexedit. Tento editor vždy zpracovává pouze aktuálně vybranou část souboru, tj. nesnaží se načíst celý editovaný soubor do paměti. Dále je možné hexedit spustit v režimu, v němž se na obrazovce vždy zobrazí ta část souboru, která odpovídá celému sektoru (počáteční adresy budou dělitelné 512 atd.). Obě tyto vlastnosti lze velmi dobře zkombinovat ve chvíli, kdy se tímto nástrojem edituje souborový systém dostupný například přes /dev/sdb1 atd. (samozřejmě to závisí na konfiguraci vašeho počítače). Dále hexedit podporuje editaci jak ve sloupci s hexadecimálními hodnotami, tak i ve sloupci se znaky. Přepnutí mezi těmito sloupci zajišťuje klávesa TAB, což je v těchto nástrojích sice nepsaný, ale o to více dodržovaný standard.

Obrázek 37: Textové uživatelské rozhraní nástroje hexedit při editaci binárního spustitelného souboru pro ARMovskou architekturu.

I další vlastnost je velmi užitečná. Hexedit totiž umožňuje vybrat určitou část editovaného souboru a tuto část přenést jinam či ji vyplnit (fill) zvoleným vzorkem. Jakým způsobem se tato operace provádí je naznačeno na dalších třech screenshotech. Doplňme jen, že výběr bloku se provádí klávesovou zkratkou Ctrl+mezera převzatou z Emacsu. Po výběru bloku se pomocí Esc+I či Alt-I provede jeho vyplnění zvoleným vzorkem, pomocí Esc+W či Alt-W kopie (copy) a klávesovou zkratkou Ctrl-Y přesun obsahu bloku na jiné místo v souboru (paste).

Obrázek 38: Interaktivní výběr bloku.

Obrázek 39: Užitečná funkce pro vyplnění vybraného bloku.

Obrázek 40: Výsledek vyplnění bloku konstantou.

Tento editor je možné alespoň do jisté míry ovládat i funkčními klávesami:

Klávesa Význam
F1 zobrazení nápovědy
F2 uložení změn
F3 otevření jiného souboru
F4 skok na zvolenou adresu
F5 přechod na předchozí stránku
F6 přechod na další stránku
F7 kopie vybraného bloku (copy)
F8 vložení vybraného bloku (paste)
F9 začátek výběru bloku
F10 ukončení aplikace

Obrázek 41: Režim zobrazení po jednotlivých sektorech.

14. Podobné jméno i funkce nabízené nástrojem hexeditor

Po popisu utility pojmenované hexedit si ve stručnosti popíšeme další nástroj, který je nazvaný velmi podobně – hexeditor. Tento nástroj pro zobrazení textového uživatelského rozhraní využívá knihovnu ncurses, což mj. znamená podporu zobrazení barevného textu a pozadí v terminálu (to lze sice zařídit i bez ncurses, ale většina aplikací tuto knihovnu používá). Zajímavé je, že hexeditor podporuje i takzvaný „bufferovaný režim“ v němž je celý editovaný soubor načtený do operační paměti. Díky tomu jsou podporovány i operace pro mazání bajtů či naopak pro jejich přidávání. Vzhledem k tomu, že tento režim není možné použít například při přístupu k blokovým zařízením, je nutné ho explicitně zapnout přepínačem -b či –buffer.

Obrázek 42: Textové uživatelské rozhraní nástroje hexeditor.

Pro ovládání tohoto editoru se používají klávesové zkratky, které se do značné míry podobají zkratkám textového editoru Pico a od něj odvozeného editoru Nano (přesněji GNU Nano). To je samozřejmě výhodné pro uživatele těchto editorů (které se stávají standardní součástí desktopových instalací Linuxu), naopak pro ostatní uživatele jsou tyto klávesové zkratky spíš matoucí.

Obrázek 43: Stránka s vestavěnou nápovědou.

Obrázek 44: Dialog pro zadání adresy, od níž se má zobrazit obsah souboru.

Obrázek 45: Jednoduchá kalkulačka.

Obrázek 46: Obrazovka s výběrem souboru, jehož obsah se má zobrazit.

15. Hexadecimální editor pojmenovaný dhex

Další hexadecimální editor, který se jmenuje dhex, je některými svými vlastnosti podobný dále zmíněnému DOSovému hexadecimálnímu editoru HIEW. dhex totiž využívá terminál (konzoli) a mnohé jeho funkce jsou namapovány na funkční klávesy F1 až F10. Vzhledem k tomu, že na různých emulátorech terminálu se mohou tyto klávesy chovat odlišným způsobem (posílají jiné sekvence znaků apod.), zobrazí dhex při svém prvním spuštění konfigurační dialog, ve kterém uživatel jednotlivé klávesy stlačí a dhex se je tak jednoduše „naučí“.

Obrázek 47: Hexadecimální editor dhex: integrovaná nápověda (vypisovaná na standardní výstup).

Kromě režimu prohlížení a editace najdeme v tomto hexadecimálním editoru i užitečnou kalkulačku, která kromě běžných aritmetických operací používá i bitové posuny a taktéž bitové operace AND, OR, XOR. Změnu barevné palety dhexu je možné provést ruční editací jeho konfiguračního souboru, který je kupodivu textový a nikoli binární :-).

Obrázek 48: Hexadecimální editor dhex: při prvním spuštění je možné tento nástroj nakonfigurovat, zejména si zvolit mapování funkčních kláves.

Obrázek 49: Hexadecimální editor dhex: základní způsob zobrazení nabízený tímto nástrojem.

Obrázek 50: Hexadecimální editor dhex: ruční úpravou konfiguračního souboru jsem dosáhl změny barvy pruhu s funkcemi tlačítek.

Obrázek 51: Hexadecimální editor dhex: užitečná binární a hexa kalkulačka, která nabízí i bitové operace a posuny.

Obrázek 52: Hexadecimální editor dhex: průběh vlastní editace binárního souboru.

16. Pokročilejší hexadecimální editory

Hexadecimální prohlížeče a hexadecimální editory se v některých případech transformovaly na komplexnější nástroje nazývané monitory (ty sice byly navrženy především pro modifikaci obsahu operační paměti, ovšem taktéž umožňovaly načítání a ukládání souborů, takže rozdíly ve skutečnosti nejsou tak velké). Jednou z funkcí odlišujících hexadecimální editor od monitoru je většinou existence disassembleru a možnost spouštění nativních (samozřejmě binárních) programů od určité adresy. Jak však bude patrné z dalšího textu, dnes jsou možnosti některých hexadecimálních editorů tak rozsáhlé, že se rozdíly částečně smazávají. A je nutné poznamenat, že hexadecimální monitor kombinovaný s disassemblerem popř. dokonce s jednoduchým assemblerem je velmi mocným nástrojem.

Obrázek 53: Kontextová nápověda k editoru HIEW.

Pokročilejší hexadecimální editory, s nimiž se seznámíme v navazujících kapitolách, se většinou snaží na editovaný binární soubor pohlížet sofistikovaněji než na pouhou sekvenci nic neznamenajících bajtů. Proto podporují režim disassembleru (dnes většinou dokonce pro větší množství architektur, mnohdy i se snahou správně rozpoznat cíle skoků), některé hexa editory správně interpretují hlavičky spustitelných souborů pro různé operační systémy (DOS, Windows, Linux, …), dokonce se setkáme s hexadecimálními editory s disassemblingem Javovských tříd atd. (kupodivu však nikoli s možností disassemblingu bajtkódu Pythonu či jazyka Lua). Opět se jedná o operace, které sice v naprosté většině případů nevyužijeme každý den, ovšem občas mohou být nedocenitelné.

Obrázek 54: HIEW pracující v režimu zobrazení textu bez zapnutého word-wrappingu. Zobrazen je elektronický manuál dodávaný k tomuto editoru.

17. Druhé krátké ohlédnutí do minulosti – pokročilý hexadecimální editor HIEW

Než se začneme zabývat popisem pokročilejších hexadecimálních editorů pro Linux, seznámíme se s dnes již klasickým (a stále vyvíjeným) hexadecimálním editorem nazvaným HIEW (Hacker's View). Ostatně mnoho Linuxových hexadecimálních editorů do značné míry kopíruje textové uživatelské rozhraní HIEWu. Tento editor je dnes nabízen pro Microsoft Windows, ovšem jeho první verze vznikly pro domácí mikropočítače IBM PC a systém DOS. HIEW se soubory dokázal pracovat ve čtyřech režimech.

Obrázek 55: HIEW pracující v režimu zobrazení textu se zapnutým word-wrappingem. Toto je dosti neobvyklý režim, který prakticky u žádného dalšího hexadecimálního editoru nenalezneme.

Jednalo se o textový režim bez zalamování řádků, textový režim se zalamováním řádků, hexadecimální režim a konečně režim dissasembleru, v němž se jednotlivé bajty v souboru interpretovaly jako instrukce procesoru 80×86. HIEW bylo možné použít mnoha různými způsoby: pro úpravu vlastních binárních souborů, crackování programů (například náhradou některých skoků instrukcemi NOP), úpravu souborů s uloženými stavy různých her (v mém případě například pro zvýšení počtu kreditů v Duně II) či pro opravu poškozených binárních souborů, například po pádu databázových aplikací.

Obrázek 56: HIEW pracující v režimu disassembleru, zde konkrétně se jedná o disassembler 16bitového režimu mikroprocesorů řady 80×86.

Vzhledem k omezení systému DOS však nebylo možné HIEW použít pro přímý přístup k obsahu zvoleného zařízení, tj. většinou diskety či pevného disku. V případě nutnosti ručních oprav souborového systému, zkoumání disket chráněných proti kopírování (resp. přesněji řečeno ne chráněných, ale upravených tak, aby se kopie lišila od originálu) apod. tedy bylo nutné použít specializované nástroje typu Diskedit, které – což asi není žádné velké překvapení – taktéž obsahovaly hexadecimální editor.

Obrázek 57: HIEW pracující v hexa režimu. Můžeme zde opět, podobně jako u prohlížeče Volkov Commanderu, vidět „klasické“ rozdělení okna na tři sloupce: adresy, hodnoty bajtů a jednotlivé znaky.

Toto omezení u Linuxových editorů vlastně odpadá, protože s příslušným oprávněním je možné přistupovat přímo na zvolené zařízení přes jeho ovladač. Ovšem je nutné použít takový editor, který se nesnaží o načtení obsahu celého souboru/speciálního souboru do operační paměti.

Obrázek 58: Výběr souboru pro editaci hexadecimálním editorem HIEW.

18. Hexadecimální editor HT (HTE)

Předposledním hexadecimálním editorem zmíněným v tomto článku je HT popř. HTE (druhé jméno je používáno při pojmenování balíčku, protože jméno „ht“ je již obsazeno). Tento nástroj je možné použít jak ve funkci klasického hexadecimálního editoru, tak i jako interaktivně ovládaný disassembler s analyzátorem strojového kódu či jako disassembler pro soubory .class určené pro zpracování virtuálním strojem Javy. Kromě toho tato utilita umožňuje otevřít větší množství oken a pracovat tak současně na několika souvisejících blocích binárního souboru či souborů.

Obrázek 59: Uživatelské rozhraní editoru HT s informacemi o autorech i o konfiguračním souboru.

Pro ovládání se používají klávesové zkratky, které připomínají původní DOSovské editory odpovídající specifikaci CUA. Ostatně i celé textové uživatelské rozhraní obsahující mj. i interaktivní nápovědu, připomíná DOSovská IDE.

Obrázek 60: Základní pohled na editovaný soubor – hexadecimální prohlížeč.

Obrázek 61: Přepínač režimů zobrazení.

Obrázek 62: Zobrazení hlavičky souborů .class určených pro JVM.

Obrázek 63: Disassembler souborů .class určených pro JVM.

Obrázek 64: Disassembler souborů .class určených pro JVM.

Obrázek 65: Disassembler nativních spustitelných souborů.

Obrázek 66: Dialog pro vyhledávání v binárních souborech.

Obrázek 67: Disassembler nativních spustitelných souborů pro platformu x86–64.

19. Linuxový hexadecimální editor Beye/Biew

Posledním hexadecimálním editorem, s nímž se v dnešním článku seznámíme, je nástroj nazvaný Biew nebo též Beye. Původní jméno Biew naznačovalo, že se jeho autor snažil vytvořit editor, který by se svými vlastnostmi přibližoval výše popsanému etalonu HIEW. To se skutečně povedlo, protože dnes umí Beye/Biew zobrazovat editovaný binární soubor ve všech standardních režimech, dokáže zobrazit hlavičky souborů (ELF, COFF, staré dobré MZ z DOSu, ME atd.) a dokonce obsahuje i disassemblery pro některé standardní architektury (i386, x86–64, 32bitový ARM, PPC64, dokonce i AVR) a taktéž disassembler pro soubory .class určené pro JVM.

Obrázek 68: Informace o hlavičce spustitelného binárního souboru.

Zdálo by se tedy, že Biew/Beye je nejdokonalejším nástrojem; proč je tedy popsán až na konci? Jediným problémem je, že se tato utilita již aktivně nevyvíjí, což by až tak nevadilo (uživatelé těchto nástrojů nemusí být každý den na technology edge), ale některé distribuce již balíček s touto utilitou neobsahují, takže se musí provést lokální překlad.

Obrázek 69: Dialog o hexadecimálním editoru Beye/Biew ukazuje, že tento nástroj již není příliš aktivně vyvíjen.

Obrázek 70: Původní i noví spoluautoři editoru Beye/Biew.

Cloud23

Obrázek 71: Přepínání režimů zobrazení obsahu binárního souboru.

Obrázek 72: Disassembler pro 32bitové mikroprocesory ARM pracuje korektně i na architektuře x86–64.

20. Odkazy na Internetu

  1. Bless Hex Editor
    http://home.gna.org/bless/
  2. hexer (man page)
    http://manpages.ubuntu.com/man­pages/natty/man1/hexer.1.html
  3. GHex – a hex editor for GNOME
    https://wiki.gnome.org/Apps/Ghex
  4. GHex na GitHubu
    https://github.com/GNOME/ghex
  5. Ghex
    http://directory.fsf.org/wiki/Ghex
  6. Okteta
    https://utils.kde.org/pro­jects/okteta/
  7. Okteta – Hex Editor
    https://www.kde.org/appli­cations/utilities/okteta/
  8. Okteta (KDE UserBase Wiki)
    https://userbase.kde.org/Okteta
  9. Hex Editors for Lin/unix
    http://blog.sourcepole.com/2006/09/07/hex-editors/
  10. Beye (home page)
    https://sourceforge.net/p/be­ye/wiki/Home/
  11. Beye (Wikipedia)
    https://en.wikipedia.org/wiki/Beye
  12. HT Editor
    http://hte.sourceforge.net/
  13. dhex (home page)
    http://freecode.com/projects/dhex
  14. Hex editor (Wikipedia)
    https://en.wikipedia.org/wi­ki/Hex_editor
  15. Comparison of hex editors (Wikipedia)
    https://en.wikipedia.org/wi­ki/Comparison_of_hex_editors
  16. bvi Home Page
    http://bvi.sourceforge.net/
  17. bvi (Wikipedia)
    https://en.wikipedia.org/wiki/Bvi
  18. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  19. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  20. Hexadecimální editor (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Hexadecim%C3%A1ln%C3%AD_e­ditor
  21. od (man page)
    https://linux.die.net/man/1/od
  22. hexdump (man page)
    https://linux.die.net/man/1/hexdump
  23. bvi (man page)
    https://linux.die.net/man/1/bvi
  24. hexedit (man page)
    https://linux.die.net/man/1/hexedit

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.