Dekompilátor

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Dekompilátor je v informatice počítačový program, který provádí opačnou činnost než kompilátor (překladač). Dekompilátor překládá nízkoúrovňový kód (strojový kód) programu do vyššího programovacího jazyka, který je snadno čitelný pro člověka. Dekompilátory většinou nezrekonstruují kód do původní podoby a mohou se výrazně lišit ve srozumitelnosti dekompilovaného kódu. Dekompilátory jsou důležitým nástrojem reverzního inženýrství.

Úvod[editovat | editovat zdroj]

Výraz dekompilátor je nejčastěji používán ve smyslu programu, který překládá spustitelné programy (výstup z kompilátoru) do zdrojového kódu (napsaného ve vysokoúrovňovém programovacím jazyce), který při překladu vyprodukuje spustitelný kód se stejnou funkcionalitou jako původní program.

Dekompilace je akt použití dekompilátoru a může být využita pro získání ztraceného zdrojového kódu nebo počítačovou bezpečnost a opravu chyb.[1]. Úspěch dekompilace spočívá v množství informací obsažených v kódu, který je dekompilován a sofistikovanosti prováděné analýzy. Mezikód využívaný JVM nebo .NET Framework Common Language Runtime často poskytuje rozsáhlé množství metadat a vysokoúrovňových funkcí, které pomáhají při dekompilaci. Přítomnost ladících informací umožňuje zjistit původní názvy proměnných a dokonce i řádky kódu. Strojový kód bez uvedených metadat je mnohem složitější dekompilovat.

Některé kompilátory a nástroje produkují kód, který je složitý pro dekompilaci a tím tak chrání spustitelný kód před reverzním inženýrstvím.

Fáze dekompilace[editovat | editovat zdroj]

Dekompilace probíhá v několika fázích, které jsou popsány níže.

Zavaděč[editovat | editovat zdroj]

Zavaděč (loader) je první fáze dekompilace načte a projde vstupní strojový kód nebo binární soubor mezijazyka. V této fázi je možné zjistit základní informace o vstupním programu, jako například architekturu a vstupní bod. Zároveň lze nalézt ekvivalent funkce main u programu napsaného v jazyce C, který označuje počátek uživatelem napsaného kódu. Načtená je také tabulka symbolů, debug data, knihovny a jejich rozhraní.[2]

Disassemblování[editovat | editovat zdroj]

Disassemblování je převod strojového kódu do strojově nezávislé intermediální reprezentace (IR, intermediate represantation).

Idiomy[editovat | editovat zdroj]

Sekvence idiomatického strojového kódu jsou sekvence kódu, u kterých není určen jasný význam z jednotlivých významů instrukcí. Idiomatický strojový kód musí být přeložen do shodné IR. Některé idiomatické sekvence jsou strojově nezávislé a některé obsahují pouze jedinou instrukci. Obecně je nejlepší pozdržet detekci idiomatických sekvencí a provést ji až v pozdějších fázích dekompilace, které nejsou tolik ovlivněny pořadím instrukcí.

Analýza programu[editovat | editovat zdroj]

Na IR lze provést několik programových analýz. Některé skupiny instrukcí je možno zkombinovat do složitějších výrazů.

Analýza datových toků[editovat | editovat zdroj]

V místě kde jsou definovány obsahy registrů a jejich použití je nutné provést analýzu toku dat. Uvedenou analýzu je také možné provést v místech dočasných a místních dat. Každému takovému datovému toku lze přiřadit odlišné jméno. Je možné, že některé místní proměnné byly použity pro více proměnných v různých částech původního programu. Dokonce je možné, že jsou detekovány cesty, kde hodnoty mohou v takovýchto případech cestovat a to i přesto, že ve skutečnosti by k takovému jevu nedošlo nebo by takový jev neměl žádný vliv. Uvedený jev může v některých případech vést k potřebě nadefinovat místo jako sjednocení typů. Kompilátor poté umožňuje uživateli roztrhnout takovéto závislosti, což ve výsledku vede k jasnějšímu kódu, ale také naznačuje možné použití proměnné bez inicializace, které indikuje chybu v původním programu.

Typová analýza[editovat | editovat zdroj]

Typová analýza umožňuje rozpoznat datové typy. Rozpoznání datových typů lze odvodit ze způsobu použití registrů nebo umístění v paměti.

Strukturování[editovat | editovat zdroj]

Předposlední dekompilační fáze zahrnuje strukturování IR do konstruktů vyšších programovacích jazyků např. while smyčky nebo podmínkové výrazy if/then/else.

Generování kódu[editovat | editovat zdroj]

Obdobně jako kompilátor tak dekompilátor může disponovat tzv. backendy pro generování kódu pro různé vyšší programovací jazyky. Těsné před generováním kódu by mělo být uživateli umožněno editovat IR, nejlépe pomocí grafického rozhraní (GUI). Editace umožňuje uživateli vložit komentáře a nastavit vhodné názvy proměnných a funkcí. Nakonec je potřeba opravit chyby v IR.

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Decompiler na anglické Wikipedii.

  1. Why Decompilation [online]. Program-transformation.org, 2005-04-11, [cit. 2010-09-15]. Dostupné online. (anglicky) 
  2.  "Decompilation of Binary Programs"(July 1995). Software Practice and Experience 25 (7): 811–829. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.8073.