15
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri Usporedba i mogućnosti Jan Kelemen Zagreb, siječanj 2018.

Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

SVEUČILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

Seminarski rad u okviru predmeta "Računalna forenzika"2017/18

DekompajleriUsporedba i mogućnosti

Jan Kelemen

Zagreb, siječanj 2018.

Page 2: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

Sadržaj

1. Uvod 1

2. Razine programskih jezika 22.1. Programski jezici niske razine . . . . . . . . . . . . . . . . . . . . 22.2. Programski jezici visoke razine . . . . . . . . . . . . . . . . . . . . 2

3. Dekompajliranje 43.1. Problemi kod dekompajliranja . . . . . . . . . . . . . . . . . . . . 43.2. Vrste dekompajlera . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4. Postojeći alati 64.1. Snowman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.2. RetargetableDecompiler . . . . . . . . . . . . . . . . . . . . . . . 84.3. dotPeek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

5. Primjene dekompajliranja 105.1. Ispravljanje grešaka u programima . . . . . . . . . . . . . . . . . 105.2. Detekcija autora programa . . . . . . . . . . . . . . . . . . . . . . 10

6. Zaključak 12

7. Literatura 13

ii

Page 3: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

1. Uvod

Ovaj rad bavi se dekompajlerima1, alatima koji na temelju izvršnih datoteka (ilineke razine međukoda) rekonstruiraju izvorni kod programa. Na početku radadan je pregled razina programskih jezika i jezici koji tim razinama pripadaju. Unastavku je dan općenit pregled procesa dekompajliranja i njegove faze. Nakončega slijedi pregled i prikaz mogućnosti nekih postojećih alata za dekompajliranjete moguće primjene dekompajliranja u računalnoj forenzici.

1Dekompajler - engl. decompiler

1

Page 4: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

2. Razine programskih jezika

Programski jezici mogu se podijeliti na dvije razine, na programske jezike niže ina programske jezike više razine.

2.1. Programski jezici niske razine

U programske jezike niske razine pripadaju strojni kod i asembler. Strojni kodje način zapisa izvršnih programa koji računala razumiju i mogu izvršavati bezdodatnih transformacija. On se sastoji niz bitova koji predstavljaju određeneinstrukcije procesora. Asembler1 je razina apstrakcije iznad strojnog koda, čestojedna naredba u asembleru odgovara jednoj naredbi procesora u strojnom kodu,odnosno pružaju mapiranje iz strojnog koda u oblik koji čovjek može jednostavniječitati [2]. Isječak koda 2.1 prikazuje asemblerski kod za računanje kvadrata broja.

Isječak koda 2.1: Kod za arhitekturu x86 u asembleru

square(int ):imul edi , edimov eax , ediret

2.2. Programski jezici visoke razine

U programske jezike visoke razine pripadaju svi programski jezici koji su iznadasemblera. Prema načinu izvršavanja dijele se na kompajlirane2, interpretirane3 itranspajlirane4. Kompajlirani jezici prevode se izravno iz izvornog koda u izvršni

1Asembler - engl. assembly2Kompajlirani - engl. compiled3Interpretirani - engl. interpreted4Transpajlirani - engl. transpiled

2

Page 5: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

odnosno strojni kod, u ovu kategoriju spadaju jezici poput C i C++. Interpre-tirani jezici se prilikom izvršavanja prevode u izvršni kod, izvršni kod kod ovihjezika stvara se pomoću JIT5 kompajlera iz izvornog koda, kao što je slučaj kodPythona, ili se stvara iz međukoda kao što je slučaj kod Jave ili C#. Trans-pajlirani programski jezici su oni koji se prije izvođenja prevode u neki drugiprogramski jezik, primjer ovakvog jezika jest TypeScript koji se prevodi u JavaS-cript [4]. Isječak koda 2.2 prikazuje C++ kod za računanje kvadrata broja.

Isječak koda 2.2: Kod u programskom jeziku C++

int square(int num) {return num * num;

}

5JIT - engl. Just In Time

3

Page 6: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

3. Dekompajliranje

Dekompajliranje je suprotan postupak od kompajliranja, njime se od izvršnogprograma stvara izvorni kod. Cilj dekompajliranja dobiti je izvorni kod, koji jeistovjetan kodu iz kojeg je bio stvoren izvršni program. Postupak rada dekom-pajlera može se podijeliti u nekoliko faza. Prva faza je predprocesiranje u kojojse obrađuje ulazna datoteka, pregledavaju se metapodaci i ostale informacije kojebi mogle pomoći prilikom obrade. Druga faza je leksička analiza u kojoj se nizovibitova grupiraju u instrukcije. Treća faza je sintaksna analiza u kojoj se gradisintaksno stablo. Četvrta faza je stvaranje koda visoke razine, nakon čega slijedioptimizacija u kojoj se pokušava dobiti više čitljiv programski kod [7].

3.1. Problemi kod dekompajliranja

Iako sam postupak dekompajliranja ima vrlo slične korake kao i postupak kom-pajliranja1, sam proces dekompajliranja je složeniji i teži od kompajliranja. Jedanod problema koji dekompajleri moraju rješiti je razdvajanje instrukcija i poda-taka, za svaki bajt ulaznog programa potrebno je odlučiti da li se radi o instrukcijiili podatku, rješavanju ovog problema također ne pomaže da su formati ulaznihdatoteka često nedokumentirani. Postoji i problem izgubljenih informacija, pri-likom kompjaliranja izvornog koda sve pomoćne informacije poput komentara iliimena varijabli i funkcija su odbačene, a mogle bi pomoći u rekonstrukciji izvor-nog programa. Problem vezan uz gubitak informacija jest i optimizacija, ukolikoje prilikom stvaranja izvršnog programa bila uključena optimizacija, neke struk-ture i funkcije koje se nalaze u izvornom kodu nepovratno su izgubljene, dok jenjegovo semantičko značenje ostalo nepromijenjeno [3, 7].

1Postupkak kompajliranja dijeli se na iste faze, međutim rezultati pojedinih faza se razlikujuod onih prilikom dekompajliranja [1].

4

Page 7: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

3.2. Vrste dekompajlera

S obzirom na mogućnost rekonstrukcije izvornog programa alate za dekompajlira-nje izvršnog programa možemo podijeliti na dekompajlere i disasemblere2. Disa-sembleri nude mogućnost rekonstrukcije izvršnog programa do razine asemblera,dok je dekompajlerima moguće rekonstruirati i izvorni kod programa. Zbog pro-blema prilikom postupka dekompajliranja, spomenutih u poglavlju 3.1, današnjidekompajeri se najčešće mogu koristiti samo kao pomoć pri reverznom inženjer-stvu programa koji se analizira [3]. Većina dekompajlera podržava kao izlaznijezik samo jedan programski jezik koji je najčešće C ili C++.

2Disasembler - engl. disassembler

5

Page 8: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

4. Postojeći alati

U ovome poglavlju predstavljeno je par dekompajlera, te njihove mogućnosti naprimjeru kratkog programa koji radi sortiranje bubble-sort algoritmom. Svi alatipredstavljeni u ovome poglavlju testirani su na Windows računalu s x86-64 arhi-tekturom.

4.1. Snowman

Snowman1 je besplatan disasembler i dekompajler, koji podržava ARM, x86 ix86-64 arhitekture računala. Kao ulazne formate moguće je koristiti ELF, Mach-O i PE izvršne datoteke, te radi na Windows i Linux operacijskim sustavima.Rekonstruirani izvorni kod biti će u jeziku C++. Alat nudi grafičko i konzolnosučelje. Slika 4.1 prikazuje grafičko sučelje alata Snowman.

Slika 4.1: Grafičko sučelje alata Snowman

1Snowman - https://derevenets.com/

6

Page 9: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

Alat je testiran na programu prikazanom u isječku koda 4.1.

Isječak koda 4.1: C++ program na kojem je testiran Snowman

void bubble(int* list , int n) {for(auto i = 0; i < n - 1; ++i) {

for(auto j = 0; j < n - 1; ++j) {if(list[j] > list[j + 1]) {

auto temp = list[j];list[j] = list[j + 1];list[j + 1] = list[j];

}}

}}

Ovaj program kompajliran je s MSVC2 i gcc kompajlerom, rezultat dobivenalatom u oba slučaja bio je sličan, rekonstruirani asemblerski kod imao je oko13000 linija, dok je C++ kod imao oko 4000 linija. Rekonstruirani kod je znatnoduži, nego što je bio izvorni kod, zbog toga što izvršni program ne sadrži samo naškod već i kod iz standardne biblioteke jezika. Unatoč tome, moguće je pronaćirekonstruirani kod bubble funkcije, prikazan u isječku koda 4.2.

Isječak koda 4.2: Rekonstruirani kod bubble funkcije dobiven Snowmanom

void fun_4112ad ( int32_t * a1 , int32_t a2) {int32_t ecx3; int32_t v4; int32_t v5;ecx3 = 57; while (ecx3) { --ecx3; }v4 = 0;while (v4 < a2 - 1) {

v5 = 0;while (v5 < a2 - 1) {

if (a1[v5] > (a1 + v5 )[1]) {a1[v5] = (a1 + v5 )[1];(a1 + v5 )[1] = a1[v5];

}++v5;

}++v4;

}}

2MSVC - Microsoft Visual C++

7

Page 10: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

4.2. RetargetableDecompiler

RetargetableDecompiler3 je besplatan disasembler i dekompajler s podrškom zaIntel x86, ARM, MIPS, PIC32 i PowerPC arhitekture, a podržava ELF, PE,Mach-O, COFF, AR i strojni kod kao ulazne formate izvršnih datoteka. Dodatnemogućnosti koje nudi su statička analiza izvršnih datoteka, korištenje informacijaza debugiranje4 i detekciju C++ hijerarhija klasa. Osim što podržava Windowsi Linux operacijske sustave, nudi i web sučelje na kojem se može testirati većinafunkcionalnosti ovog alata.

Ovaj alat testiran je na istom izvršnom programu kao i Snowman alat, čiji jeizvorni kod prikazan u isječku koda 4.1. Unatoč tome što je kao ulaznu datotekudobio i datoteku s informacijama za debugiranje, rezultati su slični rezultatimakoji su bili dobiveni i sa Snowman alatom.

4.3. dotPeek

dotPeek5 je besplatan disasembler i dekompajler, za razliku od prethodno prika-zanih alata koji su podržavali izvršne datoteke pisane stvorene iz kompajliranihjezika, dotPeek namijenjen je za .NET platformu. Izvršne datoteke koje se ko-riste na ovoj platformi pokreću se unutar virtualnog stroja. Ovaj alat omogućavarekonstrukciju međukoda koji se izvršava unutar ovog virtualnog stroja i rekons-trukciju C# koda. Ovaj alat radi isključivo na Windows operacijskom sustavu,a dolazi kao samostalan alat ili dodatak razvojnom okruženju Microsoft VisualStudio. Slika 4.2 prikazuje sučelje alata dotPeek.

3RetargetableDecompiler - https://retdec.com/4Debugiranje - engl. debugging5dotPeek - https://www.jetbrains.com/decompiler/

8

Page 11: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

Slika 4.2: Sučelje alata dotPeek

dotPeek testiran je na izvršnom programu stvorenom iz C# koda koji imple-mentira bubble-sort algoritam, prikazan na isječku koda 4.3, koji je bio uspješnorekreiran u potpunosti, uz razliku da nije bio u mogućnosti rekonstruirati imenavarijabli, koje su u rekonstruiranom kodu imale nazive index1 i index2 umjestooriginalnih i i j.

Isječak koda 4.3: C# program na kojem je testiran dotPeek

static void Bubble(int [] list) {for (var i = 0; i < list.Length - 1; ++i) {

for (var j = 0; j < list.Length - 1; ++j) {if (list[j] > list[j + 1]) {

var temp = list[j];list[j] = list[j + 1];list[j + 1] = list[j];

}}

}}

9

Page 12: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

5. Primjene dekompajliranja

U ovome poglavlju predstavljene su dvije moguće uporabe dekompajliranja kojesu vezane uz računalnu forenziku i reverzno inženjerstvo, prva primjena je isprav-ljanje grešaka u programima čiji izvorni kod nije dostupan, a druga primjena jedetektiranje autora programa.

5.1. Ispravljanje grešaka u programima

Prilikom korištenja nekog programa, moguće je da naići na neku grešku koja one-mogućava daljnju uporabu tog programa, ukoliko se taj program više ne održavai izvorni kod nije dostupan, jedina mogućnost je da tu samostalno ispravljanje tegreške.

Primjena dekompajlera u svrhe reverznog inženjerstva prikazana je u videu[6] korisnika ExileLord1 koji je koristeći dekompajler popravio grešku u igri Gu-itar Hero III: Legends of Rock, gdje se s tokom igranja smanjivao maksimalnibroj pjesama koje su mogle biti pridružene listi pjesama. U ovome videu prika-zan je jedan od spomenutih problema prilikom procesa dekompajliranja, korištenidekompajler prepoznao kod za konstruktor klase, kao niz podataka umjesto ins-trukcija.

5.2. Detekcija autora programa

Prilikom analize zloćudnih programa korisno bi bilo saznati tko je originalanautor tog programa. Primjenom disasemblera i dekompajlera uz pomoć strojnogučenja pokazano je da se uz određene granice preciznosti može odrediti tko jeautor originalnog programa.

1ExileLord (YouTube kanal) - https://www.youtube.com/channel/

UCfNRZxjhslYzbbsM-0ha4BA

10

Page 13: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

Rad [8] prikazuje tehniku u kojoj se uspoređuju stilističke značajke koda,poput grafova poziva funkcija, ova metoda je na setu programa od 20 autoraispravno odredila izvornog autora u 77% slučajeva, a u 94% slučajeva se izvorniautor nalazio u 5 najvjerojatnijih autora za taj program. Međutim kada se setautora programa povećao na 191, korištena metoda je ispravno odredila autora u51% slučajeva.

Rad [5] prikazuje tehniku u kojoj se uz stilističkih značajki koda uspoređujui sintaksna stabla i tok kontrole dekompajliranog koda. Primjenom ove metodena setu programa od 20 autora ispravno su određeni autori u 99% slučajeva, dokje na setu programa od 191 autora točno određen autor u 92% slučaja.

Obje ove metode koristile su kao set za učenje koji je sadržavao barem 8programa od svakog autora.

11

Page 14: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

6. Zaključak

Dekompajliranje je metoda koja može biti vrlo korisna u računalnoj forenzici iu reverznom inženjerstvu. Iako današnje implementacije dekompajlera još uvijeknisu dovoljno sofisticirane da bi omogućile rekonstrukciju cijelog izvršnog pro-grama u korektan istovjetan kod, svejedno mogu biti korisni u praksi kao alatkojime je moguće detektirati zašto dolazi do pogreške u izvršnom programu ilimogu pomoći u otkrivanju tko je autor zloćudnog programa.

12

Page 15: Dekompajleri - LSSnevena.lss.hr/recordings/fer/predmeti/racfor/2018/... · Seminarski rad u okviru predmeta "Računalna forenzika" 2017/18 Dekompajleri ... 2.1. Programski jezici

7. Literatura

[1] A. V. Aho, R. Sethi, i J. D. Ullman. Compilers principles, techniques, andtools. Addison-Wesley, Reading, MA, 2006.

[2] Nepoznat autor. Low-level programming, language. https://en.

wikipedia.org/wiki/Low-level_programming_language, 2017. Pristup-ljeno: 18/01/2018.

[3] Nepoznat autor. x86 disassembly/disassemblers and decompilers.https://en.wikibooks.org/wiki/X86_Disassembly/Disassemblers_

and_Decompilers, 2017. Pristupljeno: 18/01/2018.

[4] Nepoznat autor. High-level programming language. https://en.

wikipedia.org/wiki/High-level_programming_language, 2018. Pristup-ljeno: 18/01/2018.

[5] Aylin Caliskan-Islam, Fabian Yamaguchi, Edwin Dauber, Konrad Rieck, Ric-hard Harang, Rachel Greenstadt, i Arvind Narayanan. When coding stylesurvives compilation: De-anonymizing programmers from executable bina-ries, 2015.

[6] ExileLord. How i fixed a 10 year old guitar hero bug without the sourcecode. https://www.youtube.com/watch?v=A9U5wK_boYM, 2017. Pristup-ljeno: 20/01/2018.

[7] Ilfak Guilfanov. Decompilers and beyond. http://www.hex-rays.com/

products/ida/support/ppt/decompilers_and_beyond_white_paper.pdf,2008. Pristupljeno: 18/01/2018.

[8] Nathan Rosenblum, Xiaojin Zhu, i Barton P. Miller. Who wrote this code?identifying the authors of program binaries, 2011.

13