Vyšlo v týdeníku Computerworld č. 50/94 v roce 1994
Vytištěno z adresy: http://www.earchiv.cz/a94/a450c120.php3

Disassembly

Napsat dobře fungující program nemusí být žádný velký problém. Ten však může nastat v okamžiku, kdy se od takovéhoto programu ztratí jeho zdrojový tvar, autor je neznámo kde a zmíněný program je zapotřebí nějakým velmi jednoduchým způsobem pozměnit, upravit, rozšířit, doplnit či jinak modifikovat. Nebo ještě jinak: nejmenovaný hacker získá z nejmenovaného zdroje nejmenovaný program - samozřejmě bez oprávnění a bez zdrojového tvaru - a chce se mu "podívat na zoubek".

Podobných situací bychom zřejmě mohli nalézt ještě více, ale zastavme se raději u toho, co je pro ně podstatné a co mají společného - je potřeba "vidět" do takového programu, který je k dispozici jen ve spustitelném (tj. binárním) tvaru. Motivace přitom může být různá, v prvním případě legitimní, ve druhém již méně, ale v obou případech by přišel velmi vhod takový prostředek, který by dokázal převést jednou přeložený program z jeho binárního tvaru zpět do tvaru zdrojového.

Pokud byl příslušný program napsán v některém vyšším programovacím jazyku, pak takováto možnost nikdy nebude k dispozici - již jen z toho prostého důvodu, že vztah mezi zdrojovými a přeloženými programy není jednoznačný, v tom smyslu, že překladem mnoha různých zdrojových programů může vzniknout jeden a tentýž přeložený program. Proces překladu tedy bohužel není obecně vratný - kromě případů, kdy pro potřeby nejrůznějších ladicích programů překladač úmyslně zachová vedle zdrojového textu programu i ta kové informace o překladu, které zpětnou rekonstrukci umožňují.

V principu však možné je - a to pro každý program v binárním (spustitelném) tvaru - převést jej do jazyka symbolických instrukcí neboli do asembleru (viz minule). Tedy nahradit číselné tvary jednotlivých strojových instrukcí jejich symbolickým vyjádřením, které je pro člověka samozřejmě mnohem srozumitelnější a již samo o sobě výrazně přispívá k možnosti "vidět do" příslušného programu. Tím ale možnosti převodu z binárního tvaru do asembleru ještě nemusí končit: další možností je i nahrazení číselných adres (použitých v roli operandů skokových instrukcí a instrukcí volání podprogramů) vhodnými symbolickými návěštími.

Právě naznačený převod se v angličtině označuje jako disassembly (jako protiklad k procesu sestavení neboli "assembly") a program, který jej provádí, je tzv. disassembler. V češtině se často hovoří nepříliš správně o zpětném překladu (přičemž věcně správnější by asi bylo označení ve smyslu "překlad opačným směrem", protože například program napsaný původně v Pascalu se tímto způsobem nepřekládá zpět).

Se zpětným překladem jsou ovšem i některé principiální problémy. Ten největší vyplývá již ze samotné koncepce dnešních počítačů, stanovené ke konci druhé světové války americkým matematikem von Neumannem: ten totiž zavedl zásadu, že program a data jsou ve své podstatě jedno a totéž a že se mají uchovávat stejným způsobem na stejném místě (tj. v operační paměti); o tom, zda jde skutečně o program či data, rozhoduje pouze způsob jejich interpretace procesorem. Nyní, při zpětném překladu, je ovšem správn á interpretace ponechána na disasembleru. Ten se ale opravdu nemá "čeho chytit", resp. nemá podle čeho poznat, zda to, co v rámci binárního tvaru programu najde, jsou instrukce, nebo data. Uživatel mu může pomoci tím, že mu sám řekne, kde jsou data a kde instrukce - samozřejmě pokud to sám ví. V opačném případě se pak může snadno stát, že disasembler nechtěně "zabrousí" do dat a bude je interpretovat jako instrukce.