Movatterモバイル変換


[0]ホーム

URL:


Přeskočit na obsah
WikipedieWikipedie: Otevřená encyklopedie
Hledání

Dekompilátor

Z Wikipedie, otevřené encyklopedie

Dekompilátor je vinformaticepočí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ástrojemreverzního inženýrství.

Úvod

[editovat |editovat zdroj]

Výrazdekompilátor je nejčastěji používán ve smyslu programu, který překládá spustitelné programy (výstup z kompilátoru) dozdrojového kódu (napsaného ve vysokoúrovňovémprogramovací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 FrameworkCommon Language Runtime často poskytuje rozsáhlé množstvímetadat a vysokoúrovňových funkcí, které pomáhají při dekompilaci. Přítomnostladí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ředreverzní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í soubormezijazyka. 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 funkcemain 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ýrazyif/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žitpřeklad textu z článkuDecompiler na anglické Wikipedii.

  1. Why Decompilation [online]. Program-transformation.org, 2005-04-11 [cit. 2010-09-15].Dostupné online. Je zde použita šablona{{Cite web}} označená jako k „pouze dočasnému použití“.
  2. CIFUENTES, Cristina; GOUGH, K. John. Decompilation of Binary Programs.Software Practice and Experience. 1995, s. 811–829.http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.8073. Je zde použita šablona{{Cite journal}} označená jako k „pouze dočasnému použití“.
Autoritní dataEditovat na Wikidatech
Citováno z „https://cs.wikipedia.org/w/index.php?title=Dekompilátor&oldid=24658034
Kategorie:
Skryté kategorie:

[8]ページ先頭

©2009-2025 Movatter.jp