Original English version: http://www.backerstreet.com/decompiler/introduction.htm
Introduksjon
Dekompilering er en form for reverse engineering av dataprogrammer. Målet er å konvertere en kompilert binær fil til en kildefil. Det kan være lurt å gjøre dette av flere grunner, for eksempel å forstå hvordan et program fungerer, eller å prøve å endre et program for å forbedre det eller fikse en feil.
Dekompilering har eksistert i mange år, sannsynligvis helt siden folk begynte å kompilere programmer fra høynivåspråk til lavere nivåformater som montering og maskinkode.
Det er utført flere forsøk på å skrive binære kjørbare dekompilatorer. Denne siden har noen eksempler.
Det er enda flere dekompilatorer tilgjengelig for administrerte miljøer som bruker byte-kode, som Java og C#. En omfattende liste er tilgjengelig på programmet transformasjon wikien.
På disse sidene vil vi fokusere på dekompilering av binære kjørbare filer, eller fra maskinkode til kildekode, siden dette er mye vanskeligere enn å dekompilere Java-byte-kode eller C#.
Flere språk og kompilatorer kan produsere maskinkode, inkludert noen Java, C# og Visual Basic-kompilatorer. Derfor vil dekompilatoren måtte vite hvilket språk som ble brukt til å kompilere programmet, og må ha støtte for å generere det språket. Imidlertid vises de fleste av de vanskelige problemene i dekompilering når du bruker mindre restriktive språk, nemlig C, Pascal eller C++.
De fleste av algoritmene kan brukes på alle språk, så vi vil for det meste bruke eksempler skrevet i C. Når vi viser en algoritme, bruker vi C eller C++, siden dette er de mest tilgjengelige språkene på både Linux og Windows.
Uansett målspråk, handler en dekompilator for det meste med tre slags enheter:
- Kodeobjekter (funksjoner, utsagn)
- Dataobjekter (globale og lokale variabler)
- Typer (variabeltyper, funksjonsprototyper)
Det konstante problemet med en dekompilator er å prøve å utlede en eller flere av de tre enhetene over fra en sekvens av bytes som finnes i den binære filen. For å gjøre dette, er det nyttig å vite hvordan utviklingsverktøy (som vi kaller verktøy for “fremoverutvikling”) brukes når du skriver et program, siden det er prosessen vi prøver å tilbakestille.