Na pětidílný miniseriál o debuggerech dostupných programátorům v Linuxu navazuje článek, v němž se budeme zabývat popisem nástrojů určených pro prohlížení a případnou editaci binárních souborů. Tyto nástroje mohou svým uživatelům nabízet různá rozhraní, ovšem významné místo zde náleží takzvaným hexa prohlížečům a hexa editorům, s nimiž se dnes taktéž seznámíme.

Obsah

1. Hexa editory a další nástroje pro práci s binárními soubory

2. Standardní operace podporované většinou hexa editorů

3. Nástroje používané pro prohlížení a editaci binárních souborů v minulosti

4. Typický zástupce pokročilého hexa editoru: HIEW

5. Hexa prohlížeče a editory pro Linux

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

7. Filtr xxd pro převod mezi binární a zvolenou číselnou reprezentací

8. Hexa editor dhex

9. Hexa editor bvi

10. Textový editor Vim ve funkci hexa editoru

11. Obsah druhé části článku

12. Odkazy na Internetu

1. Hexa editory a další nástroje pro práci s binárními soubory

V dnešním článku se opět budeme věnovat specializovaným nástrojům, které je možné v Linuxu použít jak při vývoji, tak i při administraci systému popř. při hledání chyb a testování různých aplikací, přenosových protokolů či souborových formátů. V předchozím pětidílném miniseriálu byly popsány vybrané debuggery a nadstavby nad těmito debuggery, dnes se budeme zabývat nástroji používanými pro prohlížení popř. pro editaci binárních souborů, tj. takových souborů, které není možné jednoduše zpracovat běžným textovým editorem. Mezi tyto nástroje patří především hexa prohlížeče a hexa editory.

01_vc1

Obrázek 1: 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ů.

Označení „hexa“ si tyto aplikace vysloužily díky tomu, že se v nich původně binární data zobrazovala 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ů. 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é).

02_vc2

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

2. Standardní operace podporované většinou hexa 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ů.

03_hiew0

Obrázek 3: Výběr souboru pro editaci hexa editorem HIEW. Tento nástroj bude sloužit jako etalon při porovnávání vlastností dalších (Linuxových) hexa prohlížečů a editorů.

Některé hexa prohlížeče a hexa editory navíc zobrazují vybrané hodnoty v desítkové soustavě, což se hodí například při editaci uložených stavů her (změna skóre, energie, počtu životů...). Dále by hexa prohlížeče či editory měly zobrazit i pozici v souboru (offset), popř. hodnotu jednotlivých bajtů interpretovat jako řetězec (vhodné při zkoumání různých protokolů). Bohužel mnoho těchto aplikací doposud neumí dobře zpracovat Unicode a jeho různá kódování. Přidanou hodnotou může být disassembler či jednoduchý dekódovací program.

04_hiew1

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

3. Nástroje používané pro prohlížení a editaci binárních souborů v minulosti

Hexa prohlížeče a hexa editory za sebou mají poměrně dlouhý vývoj, ostatně jejich vznik lze datovat ještě do dob, kdy neexistovaly ani dnes 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. 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, textový editor či grafický (bitmapový) editor.

05_hiew2

Obrázek 5: 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.

Hexa prohlížeče a hexa editory se částečně 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 hexa 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 hexa editorů tak rozsáhlé, že se rozdíly částečně smazávají. A je nutné poznamenat, že hexa monitor kombinovaný s disassemblerem popř. dokonce s jednoduchým assemblerem je velmi mocným nástrojem.

06_hiew3

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

4. Typický zástupce pokročilého hexa editoru: HIEW

Většina hexa editorů stále využívá textový režim. Vzhledem k tomu, že standardní textový režim (realizovaný přímo hardwarovými prostředky) dokáže 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.

07_hiew4

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

Jedním z nejpoužívanějších hexa editorů určených pro domácí mikropočítače IBM PC byl HIEW (Hacker's View), jenž se souborem dokázal pracovat ve čtyřech režimech. Šlo 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 80x86. 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í.

08_hiew5

Obrázek 8: 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 hexa editoru nenalezneme.

5. Hexa prohlížeče a editory pro Linux

Po úvodních informacích se konečně dostáváme k ústřednímu tématu tohoto článku, tj. k popisu hexa editorů dostupných pro operační systém Linux. Hexa prohlížečů a hexa editorů pro Linux existuje poměrně velké množství, přičemž se od sebe jednotlivé nástroje odlišují jak použitím terminálu či plnohodnotného grafického uživatelského rozhraní, tak i nabízenými funkcemi, možnosti interpretovat binární data různými způsoby, nabídkou režimu disassembleru apod. Dnes se zaměříme především na ty hexa prohlížeče a hexa editory, které jsou určeny pro práci v konzoli (terminálu), což je podle mého názoru zrovna pro tento typ aplikací nejlepší (resp. přesněji řečeno nejpraktičtější) volba, zejména ve chvíli, kdy je nutné pracovat s binárními daty na vzdáleném serveru.

09_mc1

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

Pro Linux však vzniklo i mnoho hexa prohlížečů a editorů, které svým uživatelům nabízí grafické uživatelské rozhraní. Tyto nástroje budou popsány příště. V navazující kapitole bude popsán hexa prohlížeč, který je součástí Midnight Commanderu, dále se zmíníme o hexa editorech s názvy dhex a bvi a na závěr si ukážeme, jak je možné nakonfigurovat známý a oblíbený textový editor Vim pro editaci binárních souborů.

10_mc2

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

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

První aplikací dostupnou (nejenom) pro Linux a schopnou zobrazit obsah binárních souborů ve formě hexadecimálního výpisu, je interní prohlížeč, který je součástí známého a mnohými uživateli oblíbeného Midnight Commanderu. Tento prohlížeč je možné využít ve dvou režimech: buď je obsah zvoleného souboru zobrazen jako text nebo se prohlížeč přepne do téměř klasického pohledu používaného i mnohými dalšími hexa prohlížeči a hexa editory. Za zmínku stojí dvě zajímavé vlastnosti. První vlastností je velmi dobrá podpora pro hledání řetězců či sekvence bajtů (viz též obrázek číslo 10 uvedený na konci předchozí kapitoly). Další užitečná vlastnost spočívá v možnosti volby kódování znaků (obrázek číslo 11), 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ů spíše výjimečné).

11_mc3

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

12_mc4

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

7. Filtr xxd pro převod mezi binární a zvolenou číselnou reprezentací

Ani druhý nástroj, o němž se v dnešním článku zmíníme, nepatří mezi běžné hexa editory. Tímto nástrojem je filtr nazvaný xxd. Slovo „filtr“ jsem 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ů). 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 :-).

13_xxd1

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

14_xxd2

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

15_xxd3

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

16_xxd4

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

17_xxd5

Obrázek 17: Zajímavá může být i kombinace voleb -g1 -b, kdy se namísto šestnáctkové soustavy použije soustava dvojková.

8. Hexa editor dhex

Konečně se dostáváme ke skutečnému a plnohodnotnému Linuxovému hexa editoru. Tento editor se jmenuje dhex a některými svými vlastnosti je podobný výše zmíněnému DOSovému hexa 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čí“. Kromě režimu prohlížení a editace najdeme v tomto hexa 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í :-).

18_dhex1

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

19_dhex2

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

20_dhex3

Obrázek 20: Hexa editor dhex: základní způsob zobrazení nabízený tímto hexa editorem.

21_dhex4

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

22_dhex5

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

23_dhex6

Obrázek 23: Hexa editor dhex: průběh vlastní editace binárního souboru.

9. Hexa editor bvi

Druhým plnohodnotným hexa 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ší hexa editory, což je ostatně patrné i při pohledu na screenshoty zobrazené pod tímto odstavcem. 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 hexa editorech nedostupná).

24_bvi1

Obrázek 24: Hexa 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.

25_bvi2

Obrázek 25: Hexa editor bvi: textové uživatelské rozhraní binárního editoru Bvi.

26_bvi3

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

27_bvi4

Obrázek 27: Hexa editor bvi: vlastní editace binárního souboru.

28_bvi5

Obrázek 28: Hexa editor bvi: režim přepisu znaků.

10. Textový editor Vim ve funkci hexa editoru

Poslední pomůckou programátora, kterou si v dnešním článku stručně popíšeme, je způsob editace binárních souborů ve známém textovém editoru Vim. Vim sice ve skutečnosti není přímo určen pro editaci binárních dat, ovšem v kombinaci s výše popsaným externím nástrojem xxd ho je možné využít jako poměrně vyspělý hexa editor, protože nástroj xxd pracuje jako filtr převádějící binární data na jejich hexadecimální, osmičkovou či binární podobu a dokáže provést i zpětný převod. Pokud se při zavolání xxd použije volba -g 1, bude na standardní výstup vytištěn transformovaný obsah souboru rozdělený na jednotlivé bajty. Následně je možné tento výstup zobrazit ve Vimu a při ukládání provést zpětný převod. Důležité je si uvědomit, že xxd při zpětném převodu bude ignorovat poslední sloupec (se zobrazením znaků), což může být pro mnoho aplikací významné omezení. Další omezení spočítá v tom, že převod binárního souboru na jeho „textovou“ podobu je velmi neefektivní z paměťového hlediska. Jinými slovy to znamená, že ve Vimu je možné měnit řádově menší soubory, než ve skutečném (plnohodnotném) hexa editoru.

29_vim1

Obrázek 29: Textový editor Vim při zobrazení binárního souboru po jeho filtraci přes externí nástroj xxd. Pokud je Vim správně nakonfigurován, dokáže při ukládání souboru provést automatickou zpětnou filtraci z hexa formátu do původního binárního tvaru.

Ruční volání filtru xxd s přesměrováním standardního výstupu a otevřením tohoto výstupu ve Vimu je však ve skutečnosti zbytečně složité a vzhledem k tomu, že si my uživatelé Vimu rádi věci ulehčíme (jinak by ostatně pro editaci textu postačoval Notepad :-), je možné využít automatické příkazy volané při načítání, popř. při ukládání souborů. Následující sekvence příkazů zapsaná do konfiguračního souboru .vimrc (uloženého v domácím adresáři) zajistí, že se při načítání souborů *.class (což je jen příklad) tyto soubory automaticky převedou do hexa podoby a při ukládání se opět transformují do původní binární podoby:

" vim -b : edit binary using xxd-format!
augroup Binary_Java_Class
    au!
    au BufReadPre   *.class let &bin=1
    au BufReadPost  *.class if &bin | %!xxd -g1
    au BufReadPost  *.class set ft=xxd | endif
    au BufWritePre  *.class if &bin | %!xxd -g1 -r
    au BufWritePre  *.class endif
    au BufWritePost *.class if &bin | %!xxd -g1
    au BufWritePost *.class set nomod | endif
augroup END

Převod přeložené javovské třídy (tj. binárního souboru) do podoby editovatelné Vimem vypadá takto:

0000000: ca fe ba be 00 00 00 32 00 0f 0a 00 03 00 0c 07  .......2........
0000010: 00 0d 07 00 0e 01 00 06 3c 69 6e 69 74 3e 01 00  ........<init>..
0000020: 03 28 29 56 01 00 04 43 6f 64 65 01 00 0f 4c 69  .()V...Code...Li
0000030: 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 01 00 04  neNumberTable...
0000040: 6d 61 69 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c  main...([Ljava/l
0000050: 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a  ang/String;)V...
0000060: 53 6f 75 72 63 65 46 69 6c 65 01 00 09 54 65 73  SourceFile...Tes
0000070: 74 2e 6a 61 76 61 0c 00 04 00 05 01 00 04 54 65  t.java........Te
0000080: 73 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f  st...java/lang/O
0000090: 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00  bject.!.........
00000a0: 02 00 01 00 04 00 05 00 01 00 06 00 00 00 1d 00  ................
00000b0: 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 01  .......*........
00000c0: 00 07 00 00 00 06 00 01 00 00 00 01 00 09 00 08  ................
00000d0: 00 09 00 01 00 06 00 00 00 19 00 00 00 01 00 00  ................
00000e0: 00 01 b1 00 00 00 01 00 07 00 00 00 06 00 01 00  ................
00000f0: 00 00 03 00 01 00 0a 00 00 00 02 00 0b           .............

Pomocná proměnná bin je zde použita proto, aby se převod náhodou neprovedl dvakrát za sebou.

Podobným způsobem lze zajistit načítání i dalších typů binárních souborů, například:

augroup Binary
  au!
  au BufReadPre   *.gif let &bin=1
  au BufReadPost  *.gif if &bin | %!xxd -g1
  au BufReadPost  *.gif set ft=xxd | endif
  au BufWritePre  *.gif if &bin | %!xxd -g1 -r
  au BufWritePre  *.gif endif
  au BufWritePost *.gif if &bin | %!xxd -g1
  au BufWritePost *.gif set nomod | endif
augroup END
endif

11. Obsah druhé části článku

Ve druhé části článku o hexa prohlížečích a hexa editorech se zaměříme mj. na ty nástroje dostupné pro Linux, které využívají plnohodnotné grafické uživatelské rozhraní. Uvidíme, že těchto nástrojů kupodivu existuje poměrně velké množství. Velmi jednoduchý na ovládání (ovšem funkčně omezený) je například prohlížeč a editor nazvaný ghex, více funkcí nabízí khex určený pro konkurenční desktopové prostředí, dále je možné vyzkoušet wxhexer. Taktéž si popíšeme nástroje se jménem okteta a beye. Nesmíme zapomenout ani na další typ aplikací – na nástroje použitelné pro zobrazení rozdílů mezi dvěma binárními soubory (v tomto případě nebývá běžný diff tím nejlepším řešením).

12. Odkazy na Internetu

  1. Hex Editors for Lin/unixhttp://blog.sourcepole.com/2006/09/07/hex-editors/
  2. dhex (home page)http://freecode.com/projects/dhex
  3. Hex editor (Wikipedia)https://en.wikipedia.org/wiki/Hex_editor
  4. Comparison of hex editors (Wikipedia)https://en.wikipedia.org/wiki/Comparison_of_hex_editors
  5. bvi Home Pagehttp://bvi.sourceforge.net/
  6. bvi (Wikipedia)https://en.wikipedia.org/wiki/Bvi
  7. xxd (man page)http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=xxd
  8. vim (man page)http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=vim