Packeri i mehanizmi zaštite izvršnog koda
Sveučilište u Zagrebu
Fakultet organizacije i informatike Varaždin
Tema: Packeri i mehanizmi zaštite izvršnog koda
Projektni zadatak
Članovi tima:
Grudiček Tomislav,
Ivanović Nebojša,
Kresonja Dario,
Kučina Dario;
Studij: Diplomski
Kolegij: Sigurnost informacijskih sustava
Akademska godina: 2012./2013.
Svrha korištenja mehanizama zaštite programa
Iz dana u dan, računarstvo i informacijske tehnologije sve više se razvijaju. Računalna industrija jedna je od najvećih i također jedna od profitabilnijih industrija u svijetu. Dostignuća koje dovode do gotovo revolucionarnih promjena, pomažu u gotovo svakom aspektu života i rješavaju neki problem osobne ili profesionalne naravi. U isto vrijeme informacijska dostignuća koja su svakim danom sve izraženija, zloupotrebljavaju se na različite načine. Razlog zloupotrebe je najčešće prihodovne prirode, to jest, pokušavanje ostvarenja zarade na neovlaštenim kopijama različitih vrsta programskih proizvoda. Računalna industrija, naročito industrija softvera je industrija u kojoj se kreću velike svote novca. Razvojem kroz povijest, proizvodnja softvera postajala je sve naprednija, ali također je iziskivala sve veće svote novca. Iz tog razloga javljali su se ljudi koji su pokušali zaraditi na novim vrstama softvera tako da su ilegalno kopirali i distribuirali softverske proizvode na tržište, u svoju korist. Da bi mogli neki softver ilegalno prodati, bilo je potrebno probiti sigurnosne postavke ciljanog softvera, da bi ga kasnije na lakši način mogli distribuirati dalje po tržištu. Iz tog razloga smišljeni su različiti načini zaštite računalnih programa, to jest softvera, da bi se postupak njihovog ilegalnog otvaranja što duže povećao i čim više otežao. Postoji sve više ljudi koji se bave probijanjem programske zaštite, te svoje probijene izvršne datoteke vrlo često postavljaju na internet stranice, da bi bile dostupne široj javnosti. Na takvim internet stranicama osim probijenih izvršnih datoteka često možemo susresti različite vrste ilegalnih programa, datoteke za automatsko probijanje zaštite, registracijske ključeve, kao i generatore ključeva, te mnoge druge programske alate koji nama običnim korisnicima, na lak način omogućavaju da i sami možemo otključati neki program i započeti s njegovim korištenjem. Danas je gotovo normalno, da kad nakon što izađe neki novi programski paket, vrlo ubrzo možemo pronaći i njegovu nelegalnu inačicu, koja je zapravo ilegalna kopija izvornog programskog paketa. Do uklanjanja zaštite, sigurno će proći neko određeno vrijeme, no u krajnjem slučaju, do probijanja zaštitnih mehanizama doći će prije ili kasnije, što ovisi o resursima, strpljenju i vremenu, kada će netko uspjeti probiti i naizgled vrlo štićenu inačicu nekog programskog koda. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 3]
Kučina D.
Zakonski okvir zaštite programa
Razvojem softvera sve više dolazi do značaja i njegova zaštita. Jedna vrsta zaštite softvera je zakonodavstvo, to jest donošenje različitih zakona koji pomažu u procesu štićenja softvera. Zakoni bi trebali regulirati prava autora, kao i prava korisnika softvera. Softver možemo promatrati kao autorsko djelo i kao patent. Softver kao autorsko djelo jest izvorni kod koji se može pomoću pravilne sintakse unijeti u brojne programske jezike, te ga se tako promatra kao literalno djelo, te ga je kao takvog moguće zaštititi pomoću autorskog prava. Patent bi trebao po definiciji obaviti neku vrstu korisnog posla za njegova korisnika, te iz tog razloga možemo softver zaštititi patentom, ako će obavljati posao koji korisnik zahtjeva. Danas je sve više aktualno kako pravilno zaštititi softver, te koja je razina zaštite dovoljna. S jedne strane autori softvera, programeri, žele svoj softver što bolje zaštititi da bi mogli ostvariti čim veću novčanu dobit, dok korisnici s druge strane žele pristupačan softver, bez velikih financijskih ulaganja. Često je u praksi teško zadovoljiti obje strane, te je potrebno pronaći svojevrsnu ravnotežu između odgovarajuće razine zaštite koja bi programerima pružila određenu sigurnost, te tako stimulirala njihov daljnji rad, kao i korisnika, koji bi željeli upotrebljavati željeni softver iz razloga što je jednostavan za rad, te pristupačan za dobavu. [Zaštita softvera, 2004., str 5]
Autorsko pravo
Autorsko pravo predstavlja najrašireniji oblik zaštite softvera bilo kojeg intelektualnog vlasništva. Autorskim pravom djelo se štiti od nelegalnog korištenja. Definirana su sljedeća prava kada se softver štiti na ovaj način [Zaštita softvera, 2004. str 5]:
• pravo umnažanja djela,
• pravo distribucije djela,
• pravo na dopune i izmjene djela,
• pravo javnog izvođenja i prikazivanja djela,
• pravo autora da spriječi iskrivljavanje ili uništavanje svog djela.
Načelno, autorsko pravo štiti originalnu implementaciju i način prikaza ideje, a ne ideju kao zasebno djelo. Ovo znači da je autorskim pravom moguće zaštititi izvorni i izvršni kod programa, organizaciju i strukturu programa, kao i korisničko sučelje, te sve priručnike, upute i svu ostalu dokumentaciju, bila ona u pismenom ili digitalnom obliku. No autorskim pravom ne možemo zaštititi različite matematičke postupke ili programske algoritme ili metode ako smo ih koristili pri stvaranju softvera. Autorskim pravom softver bi trebao biti zaštićen od neovlaštenog kopiranja ili oponašanja koda, ali autorsko pravo ne štiti softver tako da konkurencija razvije svoju inačicu, a da ne imaju uvid u kod štićenog softvera. Vrlo često autorsko pravo koristi ako želimo zaštititi ovim načinom bilo kakav oblik softvera. Autorsko pravo za softver moguće je brzo i relativno jeftino dobiti. Softver koji je zaštićen autorskim pravom treba imati valjanu oznaku, a treba biti i označena godina i autor ili naziv tvrtke koja ga plasira na tržište. [Zaštita softvera, 2004. str 5]
Autorsko pravna zaštita regulirana je Zakonom o autorskom pravu i srodnim pravima. Ovaj zakon donesen je 1. listopada 2003. godine, te je po njegovu donošenju prestao važiti Zakon o autorskom pravu. U narednom tekstu biti će prikazani značajna prava i obveze koje se odnose na zaštitu računalnih programa. [Narodne novine, Zakon o autorskom pravu i srodnim pravima, 2003., članak 5, 9, 13, 15, 18, 41, 44, 75, 107, 108, 112, 189]
Članak 5.
Autorsko djelo je originalna intelektualna tvorevina iz književnoga, znanstvenog i umjetničkog područja koja ima individualni karakter, bez obzira na način i oblik izražavanja, vrstu, vrijednost ili namjenu ako ovim Zakonom nije drukčije određeno. Autorska djela jesu osobito: jezična djela (pisana djela, govorna djela, računalni programi).
Članak 9.
Autor djela je fizička osoba koja je autorsko djelo stvorila. Autoru pripada autorsko pravo na njegovu autorskom djelu činom samog stvaranja autorskog djela.
Članak 13.
Autorsko pravo sadržava moralna prava autora, imovinska prava autora i druga prava autora. Autorskim pravom štite se osobne i duhovne veze autora s njegovim autorskim djelom (moralna prava autora), imovinski interesi autora u pogledu njegovoga autorskog djela (imovinska prava autora) i ostali interesi autora u pogledu njegovoga autorskog djela (druga prava autora). Za svako korištenje autorskog djela autoru pripada naknada, ako ovim Zakonom ili ugovorom nije drukčije određeno.
Članak 15.
Osoba koja javno koristi autorsko djelo dužna je pri svakom korištenju naznačiti autora, osim ako autor u pisanom obliku izjavi da ne želi biti naveden ili ako način pojedinoga javnog korištenja autorskog djela onemogućava navođenje autora.
Članak 18.
Autor ima isključivo pravo sa svojim autorskim djelom i koristima od njega činiti što ga je volja, te svakoga drugog od toga isključiti, ako zakonom nije drukčije određeno. To pravo obuhvaća, osobito: pravo reproduciranja, distribucije, priopćavanja autorskog djela javnosti i pravo prerade.
Članak 41.
Autorsko pravo je nasljedivo. Nasljednicima autora pripadaju sva prava koja bi pripadala autoru, ako ovim Zakonom nije drukčije određeno.
Članak 44.
Autor može za drugoga osnovati pravo iskorištavanja autorskog djela ili mu prepustiti ostvarivanje autorskog prava ugovorom, davanjem odobrenja (dozvole) za korištenje ili drugim pravnim poslom.
Članak 75.
Autorsko djelo stvoreno u radnom odnosu, po ovom Zakonu, označava djelo koje za vrijeme trajanja radnog odnosa kod određenog poslodavca stvori autor - zaposlenik izvršavajući svoje obveze ili po uputama toga poslodavca. Odnosi u pogledu autorskog djela stvorenog u radnom odnosu uređuju se ovim Zakonom, ugovorom o radu ili drugim aktom kojim se uređuje radni odnos.
Članak 107.
Računalni program je zaštićen kao jezično djelo po ovom Zakonu ako je izvoran u smislu da predstavlja vlastitu intelektualnu tvorevinu svog autora. Pojam računalni program obuhvaća izražaj računalnog programa u bilo kojem obliku uključujući i pripremni dizajnerski materijal. Ideje i načela na kojima se zasniva bilo koji element računalnog programa, uključujući i ona na kojima se zasnivaju njegova sučelja, nisu zaštićena autorskim pravom.
Članak 108.
Ako je računalni program stvorio zaposlenik u izvršavanju svojih obveza ili slijedeći upute poslodavca, poslodavac je isključivo ovlašten izvršavati sva imovinska prava na tako stvorenom programu, ako ugovorom nije drugačije određeno.
Članak 112.
Povreda prava na računalnom programu čini se osobito: bilo kojom radnjom distribucije primjerka računalnog programa za koji se zna ili ima razloga vjerovati da je to primjerak kojim je povrijeđeno tuđe pravo; posjedovanjem, u komercijalne svrhe, primjerka računal¬nog programa za koji se zna ili ima razloga vjerovati da je to primjerak kojim je povrijeđeno tuđe pravo; bilo kojom radnjom distribucije ili posjedovanjem u komercijalne svrhe bilo kojeg sredstva čija je jedina namjena olakšati neovlašteno uklanjanje tehničkog uređaja koji služi za zaštitu raču¬nalnog programa ili osujetiti rad toga uređaja.
Članak 189.
Novčanom kaznom od 5.000,00 do 50.000,00 kuna kaznit će se za prekršaj pravna osoba ako distribuira ili posjeduje u komercijalne svrhe primjerak računalnog programa za koji zna ili ima razloga vjerovati da je to primjerak kojim je povrijeđeno tuđe pravo, distribuira ili posjeduje u komercijalne svrhe bilo koje sredstvo čija je jedina namjena olakšati neovlašteno uklanjanje tehničkog uređaja koji služi za zaštitu računalnog programa.
Patent
Po definiciji patent je zaštita nekog izuma koju izdaje vlada države u kojoj je napravljen, te ima ulogu sprječavati da druge osobe ili pak organizacije proizvode ili prodaju isti ili slični proizvod. Zaštita patentom se može primijeniti na svaki novi mehanizam ili koristan princip ili pak proizvodni proces, a da je nov i nije sadržan u nijednom do sada objavljenom patentu. Ako uspoređujemo patent s autorskim djelom, razlika je u tome što patent zabranjuje objavu bilo kakvog sličnog rada, bez obzira što je on neovisno razvijen. Patentom štitimo algoritme, ideje i matematičke postupke korištene u programu, a ne sam kod kao što je to bio slučaj kod štićenja autorskim pravom. Nedostatak patenta je njegova dugotrajna procedura za priznavanje i samim time visoka cijena izdavanja. Softverska industrija se svakim danom sve brže razvija, pa je vrlo teško neko softversko rješenje zaštititi patentom, pošto njegova procedura izdavanja može potrajati nekoliko godina. Traženje patenta za softver u većini slučajeva nije isplativo, pa se patentiraju samo neki algoritmi i postupci za koje se smatra da su dovoljno fundamentalni da bi mogli ostati u upotrebi deset godina a i više. Patent je po zakonskoj strani najjači oblik zaštite softvera, jer zabranjuje objavu sličnih programa. To je vrlo delikatno pitanje koje dovodi do mnogih rasprava o patentiranju softvera. U softverskoj industriji zagovaraju patentiranje softvera, jer žele zaštititi originalnost i inovativnost koja je utrošena u razvoj softvera. Patentom se jedino može zaštititi da konkurencija promatranjem funkcionalnosti originalnog rješenja, stvori sličan softver i tako stekne prihod. Danas u Europi softver nije moguće zaštititi patentom, dok je u SAD-u to moguće. [Zaštita softvera, 2004., str 6]
Licenca
Licenca kao oblik zaštite daje pravo korištenja softvera prema pravilima kako je to navedeno u licencnom ugovoru. Licenca je zapravo proširenje autorskog prava na neki softver. Prodajom licenciranog softvera, korisnik ne postaje vlasnikom samog softvera već on kupuje licencu za njegovo korištenje. Licencom je definirano na koji način korisnik može koristiti traženi softver. Prema njoj je definirano na koliko računala se može pokretati softver, kako dugo je licenca važeća te da li se softver smije koristiti u osobne, komercijalne ili obrazovne svrhe.
Svaki licenciran komercijalni softver bi trebao imati licencni ugovor, certifikat autentičnosti, originalni medij, originalni korisnički priručnik, prateću dokumentaciju i potvrdu o kupnji ili račun. Licenciranje autorskih djela moguće je od 14. siječnja 2005. godine i na hrvatskom jeziku. [Požgaj Ž. Normativna zaštita softvera, 2009., str 4]
Vrste softvera
Prema zakonskom obliku zaštite softver se može podijeliti u sljedeće kategorije [Zaštita softvera, 2004., str 7] :
• komercijalni softver,
• komercijalni (licencirani) softver,
• public domain,
• open source,
• freeware,
• shareware.
Komercijalni softver je softver koji korisnik treba kupiti, da bi ga mogao (imao dopuštenje) koristiti. Postoje dva tipa komercijalnog softvera, a tu spadaju softver koji korisnik može kupiti i komercijalni softver. Kupnjom kopije softvera, korisnik može istog upotrebljavati na način kako je to zakonom propisano (Zakon o autorskim pravima). Na tržištu danas možemo pronaći gotovo sve vrste softvera a da je i licenciran. Za licencirane softvere, korisnik kupuje licencu za njegovo korištenje i može ga upotrebljavati kako je propisano licencnim sporazumom i zakonom o autorskim pravima. Public domain je pravno najslobodnija verzija softvera, to jest korisnik može s tim softverom raditi što želi. Ovaj softver moguće je koristiti, kopirati, distribuirati, pa i prodavati, bez da se od autora traži dozvola.
Open source je softver je besplatan za korištenje, distribuciju i umnožavanje. Ovu vrstu softvera moguće je mijenjati u izvornom kodu, te ga kao takvog dalje prosljeđivati, uz uvjet da i dalje ostaje open source. Distribucijom ovog softvera, treba također distribuirati i licencu u kojoj su definirana prava i obveze korisnika.
Freeware je besplatan softver koji se može distribuirati i koristiti, no ne smije se kao open source softver mijenjati. Softver se izdaje pod licencom u kojoj je definirano na koje se načine može koristiti.
Shareware softver je kombinacija freeware softvera i komercijalnog softvera. Ova vrsta softvera može se koristiti jedno određeno vrijeme potpuno besplatno, no nakon što taj rok isteče, potrebno je platiti za njegovo daljnje korištenje. Uvjeti oko vremenskog roka u kojem se može besplatno koristiti i nakon kojeg treba platiti za daljnje korištenje, te koju svotu novca treba platiti, opisano je u licencnom sporazumu. [Zaštita softvera, 2004., str 7]
Kučina D.
Metode zaštite softvera
U prethodnom poglavlju objasnile su se zakonske mjere zaštite softvera. No, zakonske mjere često nailaze na poteškoće primjenom u praksi. Bez obzira što je softver zaštićen, teško je otkriti prekršitelje, a i ukoliko ih se otkrije, nastaje velik problem kod dokazivanja krivnje. Iz ovih razloga, proizvođačima softvera lakše je ugraditi tehnološke mjere zaštite softvera, koje bi barem pokušale spriječiti piratstvo.
Danas se za zaštitu softvera koriste različite softverske, kao i hardverske metode. Sve metode imaju vrlo sličnu zadaću, a ona je da od korisnika softvera traži određenu vrstu prijave, to jest autentifikacije, da bi se softver dalje mogao koristiti. Metode zaštite zahtijevaju od korisnika da posjeduje posebnu vrstu hardvera koji povezuje s računalom radi autentifikacije ili neku vrstu registracijske datoteke. Jedna od najpoznatijih mjera zaštite softvera je upisivanje jedinstvene šifre pri procesu instalacije softvera. Osim toga, sve metode služe da zakompliciraju izvršni kod programa i na taj način spriječe razbijanje šifre. [Zaštita softvera, 2004., str. 8]
Zaštita upotrebom registracijskog ključa
Zaštita putem registracijskog ključa/broja/šifre, odnosno serijskog broja najrašireniji je oblik zaštite. Postoji više vrsta zaštite upotrebom registracijskog ključa, a neki od njih su: zaštita fiksnim registracijskim ključem, promjenjivim registracijskim ključem ovisnim o podacima poput korisničkog imena ili naziva tvrtke, zaštita promjenjivim registracijskim ključem ovisnim o internim podacima i stanju računala, te zaštita registracijskim ključem koji se provjerava putem Interneta. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 5]
Zaštita fiksnim registracijskim ključem. Ovaj oblik zaštite je najjednostavniji način zaštite registracijskim ključem, no najčešće se kombinira s nekim drugim oblikom zaštite. Postoji nekoliko prednosti i mana zaštite fiksnim registracijskim ključem. Jedna od prednosti zaštite je što ispravan registracijski broj, ne treba biti čuvan u memoriji računala za usporedbu s unesenim registracijskim brojem, jer je integriran s programskim kodom. Jedna od mana stalnog registracijskog ključa jest što je on jedinstven, a to uvelike olakšava posao probijanja, iz razloga kada se jednom sazna registracijski broj, nije ga više potrebno ponovo probijati da bi se uključile sve funkcionalnosti programa. Zbog toga se ovom metodom ne zaključava program u cjelini već se zaključavaju pojedine funkcije. Ovim načinom se pri procesu otključavanja, prema istom principu otključava pojedini dio programa kada se vrši proces prijave u sustav ili tek kada se pojedina funkcija koristi, recimo funkcija za čuvanje datoteka otključava se kada se zatraži ta funkcionalnost od programa, a ne odmah pri pokretanju programa. Još ako se funkcija dodatno enkodira nakon korištenja, u tom slučaju program neće nikada biti dekodiran u cijelosti, pa izravno dohvaćanje segmenta iz memorije neće pomoći kad se pokuša probiti zaštita. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 5]
Zaštita registracijskim ključem koji se mijenja ovisno o drugim podacima, poput korisničkog imena ili naziva tvrtke. Zaštitom softvera na ovaj način, osim unosa registracijskog ključa, unose se i druge informacije, primjerice imena, prezimena, naziv tvrtke ili slično. Kao što je bio slučaj u prethodnoj metodi, ovdje nema jedinstvenog registracijskog ključa, već programer pomoću različitih matematičkih algoritama određuje u softveru da pri svakom prijavljivanju se treba unijeti različiti ključ zavisan od informacija koje je korisnik prethodno unio, a algoritam izračunava iz tih podataka registracijski ključ, koji se onda u memoriji uspoređuje s registracijskim ključem koji je korisnik upisao na upit. Znači, pri ovom postupku jedinstven je matematički algoritam koji računa registracijski ključ, dok je ključ promjenjiv. Snaga zaštite ovisi o znanju programera i kompleksnosti algoritma. Ipak ovu metodu moguće je probiti praćenjem aktivnosti memorije (novo izračunati registracijski ključ sprema se u memoriju radi usporedbe), praćenjem izvođenja programa liniju po liniju koda, praćenjem izvođenja programa liniju po liniju koda, kao i praćenjem stanja memorijskih resursa, registara i stanja stoga. Postoje različite inačice koje poboljšavaju sigurnost kod ovog načina štićenja. Primjerice, može se algoritam isprogramirati tako da korisničko ime i registracijski ključ trebaju davati određeni rezultat. No, opet bez provjere registracijskog ključa, postoji velik broj kombinacija koje daju odgovarajuće rješenje, te se to može iskoristiti pri postupku probijanja zaštite i stvaranja vlastitog proizvoljnog registracijskog ključa. Moguće rješenje ove vrste problema jest da se u program implementira skriveni dodatni algoritam koji će naknadno provjeriti točnost registracijskog ključa. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 6]
Zaštita registracijskim ključem koji se mijenja ovisno o internim podacima i stanju računala. Ova metoda je vrlo zahtjevna za probijanje, jer registracijski ključ ovisi o računalu na kojem je softver instaliran. Kada se i uspije s probijanjem zaštite i napravi se nelegalna verzija programa, ta verzija neće raditi na drugom računalu osim na onom na kojeg je program prvotno instaliran. Princip ove metode je da se pri registraciji programa dohvaća neki dodatni podatak koji je jedinstven za baš to računalo, recimo serijski broj tvrdog diska ili serijski broj matične ploče, te se taj broj kombinira s korisničkim imenom ili nazivom tvrtke i izračunava se registracijski broj pomoću posebnog algoritma, pa se uspoređuje s upisanim registracijskim brojem. Za ovu vrstu zaštite izvršnog koda, bitno je da se sakrije dio koda u kojem se dohvaćaju informacije iz sistema, kao i dio gdje se provjerava da li je registracijski broj ispravan. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 6]
Zaštita registracijskim ključem koji se provjerava putem interneta. Ovo je još jedan način kako se može provjeravati ispravnost registracijskog ključa. Radi na principu da program prikuplja registracijske informacije od korisnika, pa ih šalje na poslužitelja posredstvom interneta, te ih poslužitelj provjerava s podacima koje ima pohranjene u bazi podataka i šalje izvještaj da li su podaci ispravni ili ne, natrag do klijenta. Naprednija verzija ovog načina zaštite izvršnog koda je konstantna slučajna provjera registracije. Ako program uoči da je ilegalno registriran, šalje podatke o korisniku autoru programa putem interneta. No, nije baš preporučljivo koristiti ovaj tip zaštite za bilo koji program. Jer je potrebna stalna veza prema internetu, ovakva zaštita trebala bi se koristiti s programima koji u svom radu zahtijevaju internet vezu, a ne u onima koji mogu raditi bez posredstva interneta. Postoji ključan problem s ovom vrstom zaštite, a on je da osoba koja pokuša probiti zaštitu presretne komunikaciju između programa i poslužitelja i programu daje informacije koje nisu odgovarajuće s obzirom na ove koje bi poslužitelj poslao. Tako bi se probila zaštita i program bi mogao funkcionirati a da nije pravilno registriran. Jedan od način poboljšanja jest da poslužitelj uz potvrdu o uspješnoj registraciji šalje ključ za dekodiranje određenih zaključanih funkcija. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 7]
Zaštita pomoću instalacijskog medija
Zaštita pomoću instalacijskog medija ostvaruje se tako da je aplikaciju potrebno distribuirati na mediju na koji je moguće pisati podatke (tvrdi disk, meki disk, izbrisivi optički medij). Na instalacijskom mediju u jednu posebnu datoteku zapisuje se broj instalacija programa (brojač koliko puta se instalira program). Nakon što svaki proces instalacije završi, brojač se povećava za jedan i zapisuje trenutni broj instalacija u tu posebnu datoteku. Kada se postigne određen broj instalacija, program više nije moguće instalirati s tog medija. No, da bi ova vrsta zaštite pravilno funkcionirala, datoteka u kojoj se nalazi brojač treba biti kriptirana, tako da joj je što teže promijeniti sadržaj i tako spriječiti više od dozvoljenog broja instalacija. Ova vrsta zaštite koristi se samo u rijetkim slučajevima, iz razloga jer je dosta nepraktična. Naime, vezana je za određenu vrstu instalacijskog medija, nije ju moguće distribuirati na internetu (otpada mogućnost preuzimanja s interneta), te je najčešće visoke cijene. [Zaštita softvera, 2004., str. 9]
Zaštita pomoću sklopovskog ključa
Zaštita pomoću sklopovskog ključa skuplja je inačica zaštite od softverskog načina štićenja, pa se i rjeđe koristi. Ako neki program štitimo ovom vrstom zaštite, pri prodaji istog, uz kopiju programa pakira se i uređaj koji se treba priključiti na neki ulazno/izlazni port na računalu (najčešće je to USB), kako bi se program mogao pokrenuti. Princip rada je jednostavan. Kada korisnik zahtijeva od programa da započinje s radom, program šalje signal do ulaza na računalu na kojem bi trebao biti sklopovski ključ i ako se ne dobije odgovor s ulaza, program se ne pokreće. Korisno je kriptirati poruke koje šalje program i sklopovski ključ međusobno razmjenjuju. Sklopovski ključ može se poboljšati EPROM memorijom, u kojoj je upisan dio koda neophodan za pravilan rad programa. Funkcije u EPROM-u su enkriptirane i dekriptiraju se direktno u radnu memoriju kod izvršenja programa, što je posljedica da pokušaj probijanja zaštite postaje gotovo nemoguć. [Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009., str. 10]
Kučina D.
Packaging vs packing
Pojmovi packing i packaging nisu sinonimi iako se možda tako čini na početku. U nastavku će biti opisani ovi pojmovi i navest će se razlika među njima. Ukoliko gledamo općenito, packaging je širi pojam od packing-a.
Pod pojmom packaging podrazumijeva se znanost i tehnologija koja se koristi za zaštitu proizvoda u procesu prodaje, distribucije te korištenja od strane korisnika. Za nas je interesantno područje zaštite programskih proizvoda, tj. software-a.
Packaging predstavlja i proces dizajniranja, razvoja i izrade paketa. Može se opisati kao sustav za pripremu proizvoda za transport, skladištenje, logistiku, prodaju te krajnju upotrebu.
Tu treba istaknuti i pojam labeliranja (Labeling). Labeliranje paketa je svaka napisana, elektronička ili grafička komunikacija na upakiranoj, odvojenoj ili pridruženoj labeli.
U području sigurnosti, packaging je važan mehanizam smanjivanja rizika dostave. Njihovom uporabom se može smanjiti rizik od krađe. Packaging je u većini slučajeva mjera prevencije.
Packaging i labeliranje paketa se koriste u praksi u raznim područjima:
• kod fizičke zaštite proizvoda ili podataka,
• kod prijevoza proizvoda ili prijenosa podataka,
• u marketinške svrhe,
• u području sigurnosti proizvoda ili podataka itd. [Wikipedia, 2011., Packaging and labeling]
Packing je tehnologija „za obmanjivanje“ koja se koristi za zloćudne programe. Ponekad se koristi u svrhu smanjivanja veličine zloćudnog koda, kako bi se kod lakše prenio preko interneta, međutim, ima i efekt da zloćudni program učini otpornijim za analizu. [Sun, Ebringer, Boztas, 2008.]
Packing predstavlja kompresiranje podataka u području računalne i informacijske znanosti. Detaljnije će biti opisan u nastavku.
Grudiček T.
Packing mehanizam
Packing je općenito program koji neku .exe datoteku kompresira i/ ili šifrira njezin sadržaj. Zatim ju pakira u novu .exe datoteku.
U računalnoj i informacijskoj znanosti kompresiranje podataka, kodiranje izvora ili redukcija bitova uključuje enkodiranje informacija pri čemu se koristi manje bitova u odnosu na originalnu, tj. cjelokupnu datoteku. Korisna strana kompresije je ušteda na memorijskom prostor tvrdog diska na kojem se nalaze datoteke, omogućuje brži prijenos podataka zbog manje veličine datoteke itd. Kako bi se datoteke mogle koristiti, prvo je potrebno napraviti dekompresiranje.
Kod pokretanja, tj. izvođenja izvršnog koda, zamjenski programski element prvo raspakira originalnu .exe datoteku, a zatim prenosi upravljanje na originalnu datoteku. Izvođenje originalne datoteke je u većini slučajeva nepromijenjeno.
Kad prevoditelj prevodi linije koda, generira jedanu objektnu datoteku koja je povezana s programom. Te datoteke imaju poseban format. U okruženju zasnovanom na Windows platformi, prevoditelj stvara tzv. COFF datoteke. Na Linux platformi su to ELF ili neke druge datoteke. COFF skraćenica dolazi od engleskog naziva Common Object File Format. ELF je engleska skraćenica za Executable and Linking Format. Na Windows platformi se koriste i PE datoteke.
ELF datoteka sadrži ELF zaglavlje koje sadrži podatke o datoteci. Zaglavlje datoteke sadrži:
• tablicu zaglavlja segmenata,
• tablicu zaglavlja sekcija,
• sadržaj samih tablica itd. [Wikipedia, 2011., Executable and Linkable Format]
Segmenti sadrže podatke koji su potrebni za vrijeme izvođenja programa. Sekcije sadrže bitne podatke uz povezivanje i premještanje.
PE format predstavlja strukturu podataka koja enkapsulira podatke potrebne za izvođenje .exe datoteke na Windows sustavu. PE je skraćenica za engleski izraz Portable Executable.
Izvršna kompresija (Executable Compression) koristi i kombinira kompresirane podatke s dekompresiranim kodom. Dekompresirani kod omogućuje pretvorbu kompresiranog koda u originalni kod.
Izvršna kompresija predstavlja arhivu koja se sama raščlanjuje, a kompresirani podaci su pakirani s pripadnim dekompresiranim kodom u istoj .exe datoteci.
Izvršna je kompresija stvorena radi kompresiranja .exe datoteka. No, ta kompresija često postiže bolji rezultat kompresije u odnosu na standardne podatkovne kompresije, npr. u odnosu na .zip. To omogućava distributerima da ostanu unutar ograničenja svojih odabranih distribucijskih medija za pohranu, poput CD, DVD medija ili da smanje vrijeme i zahtjeve korisnika koji preuzimaju software preko interneta.
Kompresija izvršnih datoteka se u većini slučajeva koristi za:
• sprečavanje promjena u programskom kodu te
• prikrivanje izvođenja programa na nekom sustavu.
Kompresija se može koristiti za sprečavanje direktnog rastavljanja i izmjene potpisa. Iako ona ne eliminira mogućnost inverznog inženjeringa, može ga učiniti kompliciranijim.
Kao što je već spomenuto, kompresirane datoteke zauzimaju manje prostora u memoriji. Zbog toga je potrebno manje vremena da se podaci premjeste na drugu lokaciju. S druge strane, potrebno je i dosta vremena za dekompresiranje prije nego što se započne s izvođenjem. Kompresija izvršnih datoteka je bila popularna kada su računala imala mali kapacitet pohrane. Danas postoje memorije i diskovi velikog kapaciteta, a pristupačni su i cijenom.
Nedostatak je i manje učinkovita kompresija izvršnih datoteka prilikom čitanja .exe slike kada operacijski sustav dobije zahtjev diska. Dekompresijski programski element alocira blok memorije dekompresiranih podataka. To ostaje alocirano tako dugo dok se program izvodi, bez obzira da li se taj blok memorije koristi ili ne.
Kako raste broj različitih programa koji se koriste za packing, raste i broj lažnih alata za tu namjenu. Mnogi packing alati implementiraju mehanizme zaštite softvera kao što su prekid i kontrola iznimkama, anti– debugging, anti– Vmware. Cilj im je ometanje analize zaštićenog programa. Neki packing alati sadrže vlastiti modificirani kod kako bi rutina unpacking-a bila dešifrirana prije izvođenja te kako bi bila ponovno šifrirana odmah nakon izvođenja. To se zove višestruko raspakiravanje ili engleski Multistage Unpacking. Novi packing alati koriste tehnologiju zaštite preko virtualnih strojeva. Postoje packing alati koji imaju implementiran svoj virtualni stroj koji prenosi dijelove originalnog koda. Na ovaj je način teško analizirati zaštićeni program. [Sun, Ebringer, Boztas, 2008.]
Anti- debugging tehnike koriste različite forme za skrivanje koda, kako bi se on zaštitio od inverznog inženjeringa. Na ovaj se način programi automatski analiziraju u virtualnim okruženjima. Koncept anti-debugging-a je bio razvijen od strane isporučitelja softverskih proizvoda koji su željeli zaštititi svoj izvorni kod. Drugim riječima, oni su htjeli zaštititi kod svojih aplikacija od izmjena. Neke tehnike anti-debugging-a uključuju detekciju kontrola debugger-a ili izvođenje koda unutar virtualnog okruženja. [Sriram, 2010.]
Kod se štiti tako što se izvodi u virtualnom okruženju na nestandardnoj arhitekturi koja ga čini iznimno složenim za analiziranje. Osim toga, na taj se način izvorni kod štiti kako bi se spriječio crack programa. Neki packing alati generiraju i verificiraju serijske brojeve te na taj način onemogućavaju nadogradnju i druge važne funkcionalnosti nekog alata.
Na problem packing-a niza blokova se također može gledati kao na poseban slučaj podjele zaliha. Kada je broj blokova ograničen na jedan i svaka stavka je kategorizirana opsegom i vrijednošću, tada se javlja problem kako prilagoditi vrijednost stavki unutar bloka, a to je poznato pod nazivom problem naprtnjače. [Wikipedia, 2011., Bin packing problem]
U teoriji računalne složenosti, problem packing-a niza blokova je kombinatorički NP-hard (Non- Deterministic Polynomial- Time Hard). To je tip problema kod kojih je najslabiji problem po jačini jednak najjačem problemu. Objekti koji su različitih opsega, moraju biti upakirani u konačan broj blokova koji su veličine ν na način da se minimizira broj blokova koji se koriste.
Postoji mnogo različitih tipova navedenog problema. Najpoznatiji su 2D packing, linear packing, packing prema težini, packing s obzirom na troškove itd.
Grudiček T.
Primjena packing-a
Distributeri softvera primarno koriste izvršnu kompresiju za kompresiranje .exe datoteka, ali i za smanjenja zahtjeva pohrane svog software-a. Tako se dolazi do uštede memorijskog prostora tvrdog diska na kojem se nalaze podaci i omogućuje brži prijenos podataka zbog manje veličine datoteke itd.
Packing bez gubitaka je tehnika za kompresiranje bez gubitaka sadržaja. Koristi se za kompresiranje PCM (Pulse- Code Modulation) audio podataka. Kod ove tehnike se bit-po-bit savršeno slažu s originalom kada su podaci dekompresirani. Osim toga, ova tehnika predstavlja standardnu metodu kompresije bez gubitaka koja se koristi za DVD- audio sadržaje i u prosjeku postiže oko 1.5:1 sažimanja za većinu glazbenih materijala. Današnji DVD player-i su opremljeni ovom tehnikom dekompresije. [Wikipedia, 2011., Meridian Lossless Packing]
Postoje kompresori koji smanjuju zalihost uklanjajući prazan prostor, komentare i skraćuju imena. Dostupni su i samodekompresirajući kompresori koji kompresiraju originalnu skriptu i izlaz nove skripte.
Grudiček T.
Primjeri packing alata
Packing alati za PE datoteke:
- UniKey Enveloper,
- Armadillo Packer,
- Enigma Protector,
- Themida,
- ASPack,
- Cexe itd.
Packing alati za ELF datoteke:
- HASP Envelope,
- Gzexe,
- UPX itd.
Grudiček T., Kučina D.
Mehanizmi zaštite izvršnog koda - Obfuskacija
Obfuskacija kao metoda zaštite koda
Ukoliko želimo da naš izvršni kod bude zaštićen, dobar način da to postignemo je da provedemo tzv. obfuskaciju koda (eng. code obfuscation). Obfuskacija koda je metoda zaštite izvršnog koda čiji cilj je „zakomplicirati“ kod odnosno učiniti ga nečitljivim za one koji ga pokušaju zloupotrijebiti. To je proces kojim se mijenja kod, ali ne i njegova semantika. Općenito govoreći obfuskacija je metoda zaštite kojom se nastoji sakriti određene informacije, a da se one pritom ne oštete. Proces obfuskacije može se provesti na dvije razine. Na razini binarnog koda, gdje se modificiraju instrukcije ili kontrola toka, i na razini izvornog koda gdje možemo mijenjati samo strukturu koda kako bi bio teži za čitanje [Ďurfina L.; Kolář D., Kybernetika, 2012. str. 494.]. Također mogli bismo reći kako se obfuskacijom nastoji ostvariti dva različita cilja:
A. Zaštita novih algoritama (kao zaštita intelektualnog vlasništva)
B. Zašita provjerenih algoritama (kao zaštita od neželjenog otkrivanja)
Dakle obfuskacijom koda nastojimo proces njegova dekompiliranja učiniti težim, otežavamo posao onima koji se bave obrnutim inženjerstvom. Kako ne bi došlo do zablude odmah napominjemo kako ova metoda zaštite koda nije rješenje koje nam garantira da je naš kod siguran. Nažalost, koliko god se potrudili i pokušali proces obfuskacije provesti što kvalitetnije, uvijek će se naći netko tko će ipak uspjeti doći do našeg originalnog koda i sav naš trud baciti u vodu. Vratimo se na podjelu obfuskacije. Napomenuli smo kako se proces obfuskacije može provesti na dvije razine, na razini binarnog i izvornog koda. Na razini izvornog koda obfuskacija se dijeli na dva tipa [Ďurfina L.; Kolář D., Kybernetika, 2012. str. 497.]:
a) obfuskacija izvornog koda kako bi se teže čitao i razumio
b) obfuskacija izvršnog koda u svrhu težeg razumijevanja
Obfuskator program
Dakle ukoliko imamo neki program (kod) koji želimo zaštititi, možemo to napraviti pomoću tzv. obfuskatora programa koji naš program pretvara u obfuscirani program. Za obfuskator programa možemo reći kako je to u jednu ruku vrsta kompajlera zbog načina na koji funkcionira. Obfuskator prvo pripremi program za obfuskaciju, zatim napravi jednu transformaciju i ponavlja drugi korak sve dok ne dođe do kraja ili zadovolji ograničenja. Dakle prvo se radi analiza input programa. Tu se stvara lista kandidata za obfuskaciju. To mogu biti klase, varijable, metode. Nakon ovog koraka stvara se interna reprezentacija programa, kao što je kontrola toka, a zatim se dodjeljuju prikladni prijedlozi obfuskacije. Kad je analiza input programa gotova, obfuskator izvršava while petlju. Prema prioritetu se dabire sljedeći element programa koji će biti obfusciran, nad njim se radi prikladna transformacija koja se nalazi u riječniku obfuskatora, zatim se originalni kod ažurira i prelazi se na sljedeći element po prioritetu za obfuskaciju. Tri najviše upotrebljavane metode koje se u obfuskaciji kodova koriste su preimenovanje, brisanje komentara i umetanje tzv. „dead code-a“ [Lifshits Y., Industrial Approach: Obfuscating Transformations, 2006. str. 13.]. Preimenovati odnosno mijenjati nazive možemo varijablama, klasama, metodama i procedurama. Brisanje komentara odnosi se na mijenjanje izgleda, također možemo brisati i razmake. Ovo zbunjuje potencijalnog hakera, a ukoliko je u komentarima informacija bez koje je nemoguće pravilno izvođenje koda tada smo ovim postupkom znatno unaprijedili sigurnost našeg originalnog programa. Umetanje „dead code-a“ nije ništa više već dodavanje dijelova koda u originalni kod čija zadaća je zbunjivanje onog koji pokuša doći do istog. Dijelovi koda koji se dodaju nemaju nikakav utjecaj na funkcionalnost našeg originalnog programa jer on i dalje radi ono za što je namijenjen. Jedini nedostatak ove metode je njezin utjecaj na vrijeme izvođenja programa jer se ono proporcionalno povećava povećanjem umetnutog koda. Što se tiče obfuskacije podataka na raspolaganju su nam sljedeće tehnike: razdvajanje varijabli, skalar/objekt pretvorba, pretvorba statičnih podataka u procedure, mijenjanje vijeka trajanja varijabli, promjena dekodiranja, i proširenje skalarnih varijabli. [Lifshits Y., Industrial Approach: Obfuscating Transformations, 2006. str. 13.]. Na sljedećoj slici možemo vidjeti jednostavnu poopćenu shemu načina funkcioniranja procesa obfuskacije.
Slika 1. Obfuskacija koda
[[1], 2013.]
Obfuskator programa obilježavaju snaga, otpornost i opterećenje. Snaga predstavlja razinu do koje bi čovjek koji bi čitao novi kod (obfuscirani) bio zbunjen. Naravno, poželjno je da se potencijalni zloupotrebljivači koda zbune što je više moguće. Otpornost obfuskatora govori o njegovom odolijevanju napadima od strane alata za deobfuskaciju. Njegovo opterećenje pak predstavlja količinu informacija koja je dodana originalnom kodu u tijeku deobfuskacije. Što manje to bolje, ali naravno, što manje proporcionalno utječe na smanjenje prva dva obilježja. Što je obfuscirani kod „manje opterećen“ time su njegova snaga i otpornost manje.
Slika 2. JavaScript kod prije i poslije obfuskacije
[[2], 2013.]
Tri su osnovna uvjeta koja bi svaki obfuskator programa morao zadovoljavati:
1) Funkcionalnost – Obfuscirani program trebao bi imati jednaku funkcionalnost kao i originalni program (jednako input/output ponašanje).
2) Učinkovitost – Obfuscirani program ne bi smio imati učinkovitost ništa manju od originalnog programa. Mogu postojati razlike u kodu, obfuscirani kod je obično duži jer ima neke nepotrebne dijelove (nepotrebne u smislu funkcioniranja originalnog programa, ali potrebne u smislu obfuskacije), ali to ne bi smjelo znatno utjecati na brzinu njegova izvođenja.
3) Obfuskacija – Ovo je naravno najvažniji uvjet koji bi svaki obfuskator programa trebao zadovoljiti. Koliko god originalni program bio lak za razumijevanje onom tko ga promatra, obfuscirani kod mora biti proporcionalno teži za razumijevanje. Cilj je obfusciranja da potencijalnog hakera tj. osobu koja pokuša razumijeti i zlouporabiti kod zaboli glava kada vidi rezultat obfusciranja.
Ivanović N.
Softveri za obfuskaciju
Postoji niz programa koji se čija je namjena obfuskacija kodova. Od onih koje su znanstvenici kreirali u eksperimentalne svrhe, pa sve do onih koje je netko kreirao jer mu je bilo dosadno. Tu je naravno i komercijalni softwer kreiran od strane profesionalaca, te open-source alati. Za početak ćemo se osvrnuti na neke komercijalne alate i ono što nam oni nude.
1. Salamander .NET obfuskator – je .NET komercijalni alat za obfuskaciju koda. Programski jezici koje ovaj alat podržava su C#, C++.NET, VB.NET, J#, MSIL i drugi. Ovaj obfuskator radi uz .NET Compact Framework tako da obfuscira kodove .NET aplikacija koji tako obfuscirani rade na WinCE uređajima. U procesu obfuskacije svi mogući simboli bivaju preimenovani tako da njihova nova imena nemaju apsolutno nikakvo značenje. Također, sve nepotrebne informacije iz originalnog koda se brišu, lokalne varijable, imena parametara metoda, neki metapodaci itd. Programi koji bivaju obfuscirani od strane Salamander .NET obfuskatora brže se pokreću i izvode jer su sve nepotrebne informacije iz koda uklonjene, a dugi opisi identifikatora su zamijenjeni manjim imenima generiranim od strane obfuskatora. Ovaj obfuskator nudi i opcije inkrementalnog obfusciranja, uklanjanje ranjivih točaka (tzv. V-spots), dodatnu zaštitu stringova te napredno grafičko sučelje u kojem korisnik sprecificira format ulaznih podataka (.exe, .xml, .dll) a obfuskator ih transformira u novi format. Ovaj alat za obfuskaciju ističu funkcionalnost koja ga razlikuje od ostalih alata iste namjene. Naime, on ima ugrađenu zaštitu od vlastitog dekompajlera, koja sprječava da vaš program bude dekompajliran od strane istog. [[3], 2013., Salamander .NET Obfuscator]
Slika 3. Remotesoft .NET Explorer grafičko sučelje za Salamander .NET obfuskator
[[4], 2013.]
2. Dotfuscator .NET obfuskator – je još jedan .NET komercijalni alat za provođenje obfuskacije. Od 2003. ovaj obfuskator integriran je unutar Visual Studia. Prošao je kroz mnoge sigurnosne provjere, kontrole koda i certificiran je od strane microsofta. Sadržan je u svakoj verziji windowsa i .NET-a. Mnoge publicirane inovacije te prakse koje ovaj alat koristi čine ga de facto standardom razvoja. Krase ga patentirani algoritam za preimenovanje, kontrola tijeka učinkovita protiv strojnog prevođenja, kriptiranje stringova, detekcija i obrana od napada te obavijest o eventualnom pokušaju neovlaštenog otkrivanja vašeg koda u gotovo realnom vremenu. Dotfuscator vam nudi mogućnost da provede obfuskaciju i nakon što ste kompajlirali vaš kod, dakle možete zaštiti bilo koju aplikaciju koju ste u prošlosti kreirali. Na sljedećem linku([5]) možete pronaći 50 razloga odnosno činjenica zašto koristiti dotfuscator, a ne neki drugi alat.
Slika 4. Dotfuskator .NET sučelje
[[6], 2013.]
3. DeployLX CodeVeil obfuskator – je još jedan u nizu komercijalnih alata za obfusciranje kodova. On izvodi potpunu analizu vaše aplikacije kako bi identificirao sve eksplicitne i implicitne zavisnosti te standardne konvencije nazivlja. Nakon što prikupi ove informacije on eliminira sve nepotrebne meta podatke iz aplikacije i obfuscirane nazive koji se ponavljaju te pritom ne utječe na izvođenje vaše aplikacije. Njezina fukcionalnost ostaje ista. Ovaj alat ne prestaje štititi vašu aplikaciju neposredno nakon isporuke kao što većina ovakvih alata prakticira već ostaje aktivan. Prilikom dekriptiranja CodeVeil dekriptira samo dio koda dovoljan za izvršenje specifične metode, a nakon toga dekriptirani sadržaj se briše iz memorije tako da se originalni kod nikada ne nalazi u memoriji 2013., Code protection – How it works.
Slika 5. Kod obfusciran pomoću CodeVeil-a
[[7], 2013.]
ZANIMLJIVOST:
Za neke programe svaki će obfuskator u potpunosti postići neuspjeh. Recimo da imamo program koji ispisuje svoj izvorni kod. Obfuskator program u tom slučaju odradi dio posla vezanog uz funkcionalnost i učinkovitost međutim kao rezultat obfusciranog programa u tom slučaju dobivamo izvorni kod originalnog programa. Dakle osoba koja pokuša zlouporabiti naš kod (koji je obfusciran) pokretanjem obfusciranog koda dobiti će ispis originalnog koda, a to je upravo ono što joj treba. Za programe čijim izvršavanjem dobijamo uvid u iste kažemo da su shvatljivi (eng. learnable programs). Svaki takav program nemoguće je dakle zaštititi upotrebom obfuskatora.
S druge strane imamo programe kod kojih je procesom obfuskacije lako postići da postotak njihova otkrivanja obrnutim inženjerstvom nikada ne bude stopostotan. Ovo se postiže programom obfuskatorom čiji je jedini zadatak brisanje svih komentara. Ukoliko u komentarima imamo tajni broj ili znak bez kojeg je onemogućeno funkcioniranje originalnog koda tada osoba koja provede tzv. deobfuskaciju našeg programa koji smo zaštitili i dođe do originalnog koda, neće imati uvid u potpuni kod jer je dio njega koji se nalazio u komentarima sada obrisan. [[8], 2013., Can we obfuscate programs?]
Ivanović N.
Sigurnost aplikacija i reverzno inženjerstvo
Što je reverzno inženjerstvo?
Danas je tržište aplikacija pokriveno nevjerojatnim brojem zaštićenih aplikacija, koje ne dopuštaju da koristite sva njihova svojstva ako niste njihov registrirani korisnik. Jednostavno rečeno, reverzno inženjerstvo je umjetnost uklanjanja zaštite iz aplikacije. Za korisnike koji to čine iz razloga kako bi dalje neovlašteno distribuirali aplikacije, takve ih koristili i slično, za reverzno inženjerstvo je poznatiji izraz „cracking“.
Drugim riječima, pojam „cracking“ se može opisati i na sljedeći način. Kada vi kreirate aplikaciju vi ste njezin inženjer, što je činjenica jer vi izgrađujete izvorni kod iz kojeg kompajler kreira izvšni kod. Reverzno inženjerstvo je pak, jednostavno rečeno, obrnuti postupak odnosno umjetnost generiranja izvornog koda iz izvršnog koda. Reverzno inženjerstvo se koristi kako bi se razumjelo kako aplikacija izvodi pojedine operacije, kako bi se zaobišla zaštita i slično. Obično nije potrebno dohvatiti sav asemblerski kod aplikacije (engl. disassemble) već onaj dio koji je korisniku iz nekog razloga zanimljiv te bi volio dobiti uvid u njega. Reverzno inženjerstvo je također korišteno od strane osobe poznatije pod engleskim nazivom „cracker“ koja želi razumjeti zaštitnu šemu aplikacije te je razbiti. Upravo zbog toga je reverzno inženjerstvo veoma važna stvar u svijetu piratstva.
Dakle, možemo zaključiti da se reverzno inženjerstvo odnosi na način koji omogućava modifikaciju aplikacije kako bi se ona ponašala na takav način kako reverzni inženjer želi.
Krekiranje (engl. cracking) je pak metoda kreiranja aplikacijske funkcije koja je drugačija od onog što je originalno zamišljeno te pridruživanje te metode originalnoj aplikaciji (engl. patching – zakrpa).
Povijest reverznog inženjerstva
Reverzno inženjerstvo je najvjerojatnije započelo sa DOS baziranim računalnim igricama. Tada je najčešći cilj bio da igrač ima svu životnu energiju 100% te da je potpuno naoružan na posljednjem nivou igrice. I što je ovdje učinilo reverzno inženjerstvo? Pomoću njega se u memoriji pronašla lokacija gdje su bili pohranjeni podaci o životu i oružju te su se tada promijenile te vrijednosti. Tada su te osobe koristile neke alate za varanje memorije. Međutim, danas je reverzno inženjerstvo postalo tegobno, zamorno, puno kompleksnije sa mnogo trikova.
Danas programeri kako bi zaštitili aplikacije koriste različite vrste tehnika. Neke od njih su stare, loše tehnike sa ponavljanjem dok su neke nove. U nastavku će biti rečeno nešto o njima.
Sheme zaštite
Najviše korištene su sljedeće šeme:
1) Serijski broj
2) Serijski broj i ime
3) Nag zaslon
4) Vremensko ograničenje (engl. time trial)
5) Dongle (hardverska zaštita)
6) Komercijalna zaštita
7) Ostale zaštite (provjera instalacijskog medija, razne ključne datoteke, onemogućavanje funkcija....)
1. Serijski broj
Serijski broj je najjednostavnija zaštita u usporedbi sa ostalima. U toj vrsti zaštite potrebno je samo unijeti serijski broj koji je jednak za sve korisnike. Serijski broj koji je unešen se pomoću algoritma uspoređuje sa originalnim serijskim brojem. Ukoliko je korinsik unio ispravan serijski broj tada je aplikacija registrirana.
2. Serijski broj i ime
U ovoj vrsti zaštite od korisnika se traži da osim serijskog broja unese i korisničko ime. Tada se unešeni serijski broj uspoređuje sa originalnim serijskim brojem koji je sada izveden iz korisničkog imena korištenjem nekog algoritma. Ova zaštita je ponekad slaba, a ponekad može biti i teška ovisno o algoritmu kojeg je programer koristio.
3. Nag zaslon
Ovakva vrsta zaštite prikazuje zaslon svaki puta kada korisnik pokrene aplikaciju kako bi ga taj zaslon podsjetio na to koliko je još dana korištenja aplikacije preostalo, ili pak da li je aplikacija neregistrirana ili prikazuje neku drugu poruku. takvu vrstu zaštite je mlao teže ukloniti. Međutim, ukoliko reverzni inženjer ima dovoljno znanja windows API-ja tada on lako može ukloniti nag zaslon.
4. Vremensko ograničenje
Ova vrsta zaštite ima neku od sljedećih zaštita ili kombinaciju sljedećih zaštita:
a) predefiniranu količinu dana za korištenje, primjerice 30 dana počevši od dana instalacije aplikacije
b) predefinirani vremenski period (koji završava specificiranim fiksnim datumom) neovisan o datumu početka korištenja aplikacije
c) predefiniranu količinu minuta i/ili sekunda svaki puta kada se pokrene aplikacija. Primjeri takvih aplikacija su neke vrste igrica i audio/video player-a koji dozvoljavaju neregistriranim korisnicima da igraju primjerice igru određenu količinu vremena, recimo 30 minuta.
d) predefiniranu količinu „broja“ njihovog korištenja, recimo 20 puta. Striktno govoreći ova zaštita nije ovisna o vremenu već samo o tome koliko ste puta pokrenuli aplikaciju.
5. Dongle (hardverska zaštita)
Pretpostavka je da je takva vrsta zaštite najteža za razbijanje. Sastoji se od EPROM-a koji je spojen sa portom na računalu. Aplikacija koja je zaštićena na takav način prvo provjerava prisutnost EPROM-a (dongle uređaj), a potom provjerava da li je registrirana ili ne. Pa ipak, implementacija takve zaštite je teška i nije naširoko rasprostranjena. Takva zaštita se koristi u nekima dobro zaštićenim aplikacijama. Najčešće koristi I/O LPT port u koji dolazi registracijska kartica koja omogućava da aplikacija radi u potpunosti. U protivnome aplikacija će raditi ograničeno vrijeme ili uopće neće raditi. Dongle uređaji kao što su HASP / Sentinel su najčešće korišteni.
6. Komercijalna zaštita
Većina programera i softverskih inženjera ne žele trošiti svoje dragocjeno vrijeme u odlučivanju koju vrstu zaštite bi trebali upotrijebiti kako bi zaštitili aplikaciju. Oni razmišljaju kako je bolje i kvalitetnije upotrijebiti vrijeme na unapređenje funkcionalnosti aplikacije nego na trošenje tog istog na dizajniranje sigurnosnog algoritma za zaštitu. I upravo ovdje na snagu stupa koncept komercijalne zaštite. Danas neke softverske kompanije dizajniraju samo sigurnosne algoritme za različite aplikacije. Isto tako oni pružaju aplikacije koje pretvaraju potpuno funkcionalne druge aplikacije u neregistrirane verzije koje je potrebno registrirati kako bi ponovo bile otpuno funkcionalne. Registracija u većini slučajeva znači izdvojiti određenu sumu novaca za aplikaciju.
Dakle, takav softver pretvara neku aplikaciju natrag u potpuno funkcionalnu registriranu aplikaciju nakon što se unesu registracijski detalji. Iako takva vrsta zaštite ima visoku sigurnost zbog toga jer je profesionalno dizajnirana, ona ima i neke nedostatke. Jedan od glavnih nedostataka je taj da ako osoba krekira samo jedan program koji je zaštićen tom zaštitom tada je probijena zaštita svim programima. Primjerice, ako u Adobe-ovom paketu osoba krekira Photoshop tada je u mogućnosti krekirati i ostale Adobe-ove alate budući da su svi oni bazirani na samo jednoj vrsti zaštite.
7. Ostale zaštite
Postoje mnoge druge tehnike koje se koriste za zaštitu softvera. One su najčešće korištene u računalnim igricama. Mnogo računalnih korisnika je primjerice vidjelo zaštitu u kojoj se traži da korisnik ima cd određene igrice, jer bez njega nije u mogućnosti igrati igru direktno sa hard diska. To je zbog toga što aplikacija odnosno igrica provjerava da li je u cd rom uređaju cd. Isto tako postoje neke zaštitne šeme koje onemogućavaju pojedine funkcije kao primjerice onemogućavanje funkcije „save“ kako korisnik ne bi mogao pohraniti svoj rad.
Sada kada su objašnjene zaštitne šeme može se pogledati kako funkcionira reverzno inženjerstvo. Prva stvar koju treba imati na umu je da crackeri uvijek rade sa dohvaćanjem asemblerskog koda te da su upoznati sa windows API-jem.
Poznato je da računala ne razumiju ništa drugo osim binarnog koda. Dakle, prvo se kreira program a potom se kompajlira pomoću kompajlera. Kompajler provjerava sintaksu, greške te ako je sve u redu generira .obj datoteku. Budući da su u višim programskim jezicima neke funkcije prethodno napisane i pohranjene u biblioteku nakon kompajliranja je potrebno upotrijebiti linker koji će povezati program sa odgovarajućim bibliotekama. Nakon tog povezivanja dobiva se exe datoteka koja nije ništa drugo već kolekcija instrukcija u binarnom formatu. Kako bi se sada iz toga pokušalo dobiti razumijevanje funkcionalnosti programa ili pak kako bi se dobio ponovno izvorni kod reverznom inženjeru su na raspolaganju različiti alati.
Alati za reverzno inženjerstvo
Popularnost Windows operacijskog sustava, kao i lakoća kreiranja aplikacija za tu platformu je dovela do razvoja tisuća programa. Osobe koje probijaju softversku zaštitu (crackeri) obično rade sa asemblerskim kodom, provode nad njim reverzno inženjerstvo te odlično poznaju Windows API.
Ne postoji neka određena metoda za krekiranje aplikacije. U ovisnosti o aplikaciji i vrsti zaštite koju ima, osobe za probijanje softverske zaštite upošljavaju različite tehnike kako bi se ubacili u program. Međutim, postoje neki uobičajeni alati koje te osobe koriste kako bi započele sa krekiranjem aplikacija. Potrebno je reći i da su ti alati potpuno legalni. Ti alati su sljedeći:
1) Debugger
2) Disassembler
3) Hex-editor
4) Unpacker
5) File Analyzers
6) Registry monitor
7) File monitor
To su alati koje svaka osoba za probijanje softverske zaštite koristi za reverzno inženjerstvo bilo koje aplikacije. U nastavku su podrobnije opisani ti alati.
1) Debugger
Svakome je poznato da je debugger alat za debagiranje aplikacije. Programeri koriste debugger-e kako bi pronašli bug-ove odnosno greške u aplikacijama koje kreiraju. Debugger je jedini alat pomoću kojeg se može pratiti/zaustavljati funkcija ili neki drugi programski kod u realnom vremenu. Na tržištu postoje mnogi debugger-i. Svima onima koji su se susreli sa programiranjem je poznato da kako bi se debug-irala bilo koja aplikacija prvo je potrebno postaviti breakpoint-ove na željena mjesta te potom pokrenuti aplikaciju. Kada se naiđe na instrukciju nad kojom je postavljen breakpoint aplikacija zaustavlja svoje izvršavanje te programer može vidjeti trenutne vrijednosti u aplikaciji. Ta stvar je direktno povezana sa krekiranjem odnosno probijanjem softverske zaštite kod aplikacija. Softverski programeri općenito koriste funkcije Windows API-ja kako bi dobili serijski broj ili kreirali nag zaslon ili pak određene dijaloške prozore. Sada, ako debugger podržava breakpoint točke prilikom izvršavanja aplikacije tada cracker lako može postaviti breakpoint na API. Time može nakon praćenja samo nekih linija koda lako pronaći algoritam korišten za generiranje ključeva kao i same ključeve.
Na tržištu postoje mnogi debuggeri, ali jedan od najpopularnijih i najmoćnijih debuggera je SoftICE tvrtke Numega Corporation. Taj debugger je tako moćan da je ranija verzija tog debuggera upotrijebljena kako bi se probila zaštita na kasnijoj verziji. Gotove sve osobe na svijetu koje se bave probijanjem zaštite koriste taj debugger. Nakon što je Numega Corporation uvidjela zlouporabu nad probijanjem softverske zaštite pomoću svoga alata ona je uvela neke restrikcije na prodaju svojeg alata. Tako je kupac morao dokazati da neće koristiti taj debugger za nelegalne radnje. Međutim, krekirana kopija tog debuggera je slobodno dostupna na internetu. To je inače debugger na sistemskoj razini, koji radi direktno između računalnog hardvera i windowsa. Taj debugger se nemože učitati unutar windowsa već ga je potrebno učitati prije nego se windowsi učitaju u memoriju. Pomoću njega se tiho može pratiti svaki proces, dretva u memoriji sve dok se ne pozove pomoću odgovarajućih tipaka. Uz to omogućava pravljenje zakrpa u memoriji u runtime modu (međutim ne trajno, tako da je potrebno koristiti hex editore), pregledavanje sadržaja registara, sadržaja memorije i slično.
2) Disassembler
Budući da je izvršna datoteka u binarnom formatu običan korisnik ne može razumjeti instrukcije u toj datoteci. Gotovo svaka exe ili izvršna datoteka je u PE formatu (koji je standardan format za exe datoteke, odlučen od strane odbora softverskih kompanija poput Microsofta, IBM-a i AT&T-a). Budući da cracker odnosno osoba za probijanje softverske zaštite prvo koristi program za dohvaćanje assemblerskog koda taj alat pretvara binarnu datoteku u njoj ekvivalentne instrukcije u asemblerskom jeziku. Zbog toga što je velika većina aplikacija napisana u višim programskim jezicima veličina asemblerskog koda doseže milijune ili čak i više linija koda te stoga nije moguće ni za jednog crackera da razumije taj kod. Stoga crackeri u tome assemblerskom kodu traže stringove poput „vaš 30-dnevni probni period je završen“ ili pak „serijski broj koji ste unijeli nije valjan“ i slično. Kada pronađu neki takav string onda prate samo neke linije u tome assemblerskom kodu te skaču natrag na pozivatelja tih linija. Tada promijene skok na način da program više ne skače na poruku „serijski broj koji ste unijeli nije valjan“ već na linije koje će kao rezultat dati nešto poput „hvala na registraciji“.
Dostupni su mnogi disassembleri. Ali dvojica njih, koji su najčešće korišteni su WIN32DASM i IDA. IDA je ujedno moćan debugger. WIN32DASM se najčešće koristi za napredno krekiranje, a i široko je korišten od strane novih i osrednjih crackera, odnosno osoba koje probijaju softverske zaštite. Taj debugger, WIN32DASM, omogućava dohvaćanje assemblerskog koda bilo koje datoteke koja je u PE formatu. On može taj assemblerski kod pohraniti, ukazati na to koja je funkcija ubačena, koja je izvezena, pomoću njega se može izvršiti skok, poziv, pronaći referenca na string podatke i još mnogo toga poput izvođenja exe datoteke sa mogućnostima step into it, step over itd.
3) Hex-editor
Kao što je prethodno spomenuto SoftICE može promijeniti vrijednost memorijske lokacije samo rilikom run-time moda. Dakle, to nije korisno i nebi bilo dobro krekiranje kada bi trebalo promijeniti vrijednosti svaki puta kada se aplikacija pokrene. Stoga se koriste hex editori. Hex editor omogućava promjenu sadržaja bilo koje datoteke u hex formatu. Također prikazuje sadržaj datoteke u hex formatu. Shodno tome, potrebno je samo promijeniti vrijednost u memorijskoj lokaciji koja je pronađena primjeric pomoću SoftICE-a.
Programeri su razvili mnogobrojne hex editore, ali najpopularniji među njima je HIEW što je skraćenica od „Hacker's vIEW“. Taj program nudi mnoge mogućnosti kao što je editiranje u hex ili ASCII formatu, kao i pretraživanje bilo kojeg stringa u tim formatima. Još jedna dobra mogućnost koja ga razlikuje od ostalih hex editora je mogućnost pisanja assemblerskog koda i njegovo automatsko pretvaranje u ekvivalentan hex format. To je od velike pomoći crackerima koji ne poznaju ekvivalentne hex vrijednosti asemblerskih instrukcija.
4) Unpacker/PE editor
Ponekad programeri koriste alate za kompresiranje datoteka kao što je UPX, ASPACK kako bi minimizirali veličinu programa. To se naziva pakiranje datoteka. Alat za pakiranje koristi neki algoritam pomoću kojeg smanjuje veličinu datoteke, a zatim datoteci doda i odgovarajući kod kako bi se prilikom izvršavanja izvršio prvo kod koji će odkompresirati aplikaciju u memoriju.
5) File Analyzers
Kako bi osoba za probijanje softverske zaštite identificirala koji je packer korišten za pakiranje datoteke cracker koristi ovu vrstu programa. Ovakvi alati rade odnosno analiziraju bajt potpisa (engl. signature byte). Pomoću bajta potpisa alat može saznati koji je kompajler preveo aplikaciju te u kojem je jeziku ona napisana. Dostupne su mnoge vrste takvih programa kao što je primjerice File Info.
6) Registry monitor
Neke aplikacije koriste registarske ključeve (engl. registry keys) kako bi pohranile svoje registracijske informacije. Registry Monitor je aplikacija koja radi u pozadini i hvata sve pristupe registarskim ključevima od strane svih procesa koji se trenutno izvode.
7) File monitor
Neke aplikacije koriste datoteku sa ključem ili pak imaj svoj sigurnosni algoritam u nekoj drugoj datoteci te se stoga koristi alat „file monitor“ pomoću kojega se može vidjeti koja aplikacija koristi koju datoteku.
Dario Kresonja
Alati za zaštitu izvršnog koda
Programi za automatsku zaštitu
U današnje vrijeme postoji niz komercijalnih programa koji se koriste za automatsku zaštitu programa uz programersku zaštitu koju postavlja sam programer za program koji zaštićuje. Taj niz komercijalnih programa integriraju svoje funckije s ciljnom aplikacijom i implementiraju generičku zaštitu.
Te funkcije uključuju:
- kompresiju ciljnog programa i instalacijskog paketa
- kontroliranu dekompresiju
- enkodiranje zasebnih funkcija ili čitavog programa
- automatsku zaštitu registracijskim ključem
- kriptiranje ključa
- vremenka ograničenja
- sprečavanje praćenja izvođenja programa (eng. antidebugging)
- sprečavanje dohvaćenja asemblerskog koda iz izvršne datoteke (eng. antidisassembling)
Potražnja za ovom vrstom alata nastaje zbog toga jer postoji velik broj programera kojim nedostaje vlastitog znanja , tj. oni nisu dovoljno vješti u tome da implementiraju vlastite programske zaštite. No, unatoč tim svim programima i dalje je najbolji način da postoji zaštita, tj. orginalna zaštita koja je isprogramirana od strane samog programera, ali za to programer mora biti dovoljno vješt u tome, tj. u tom području zaštite i da zna što radi. To kažemo zbog toga jer postoji velik broj ljudi koji su iskusni u probijanju zaštite za sve ove programe koji postoje, tj. koriste se za zaštitu. To je zbog toga jer programeri koji probijaju zaštite su uglavnom upoznati s funkcionalnostima već poznatih i postojećih komercijalnih programa za automatsku zaštitu. Oni su informirani koji program se koristi za koju vrstu zaštite, te onda znaju potražiti slabu točku, a također se može reći da po internetu već kruže i programi koji automatski probijaju te programe zaštite pa je ujedno i to već postao problem
No, unatoč tome svemu još se uvelike koriste ti programi za automatsku zaštitu, a i uz pametno rukovanje i korištenje, oni i dalje pružaju vrhunsku zaštitu koju je teško probiti.
Slijedi nekoliko primjera.
1. Armadillo
Armadilo je alat koji služi za programsku zaštitu. On se nalazi pod licencom tvrtke Silicion Realms Toolworks, puno ime alata je Armadillo Software Protection System. Armadillo zaštićuje programe na taj način da koristi slučajno generirani ključ koji služi za kriptiranje i kompresiju programa. Ovaj komercijalni alat je specifičan poznat po tome što može, tj. omogućuje programerima da unose ključeve koji su dobiveni prijašnjim probijanjima zaštite u jedno bazu podataka s ciljem da se spriječi njihovo ponovno korištenje. Još po čemu je ovaj alat poznat je da pruža zaštitu od praćenja izvođenja programa, npr. SoftICE. Trebamo naglasiti da je SoftICE jedan od najačih programa za praćenje izvođenja programa u današnje vrijeme.
No, trebamo napomenuti da komercijalni alat Armadillo ima jedan jako veliki nedostatak, a to je da sprema cijeli dekodirani program u memoriju nakon dekodiranja programa. Stoga je dosta jednostavno probiti Armadillovu zaštitu, a to se radi tako da je potrebno spremiti sadržaj radne memorije i napraviti nekoliko modifikacija.
Za kraj neke funkcije Armadilla:
- zaštita od vraćanja sistemskog vremena
- zaštita od probijanja vremenske zaštite
- sklopovsko zaključavanje
- registracija certifikacijama
Slika 6. Prikaz instalacijske datoteke za softver Notepad zaštičen alatom SoftwarePassport
Slika 7. Prikaz instalacijske datoteke za softver Notepad u izvornom obliku bez zaštite
2. SVKP
SVKP punim imenom The Slovak Protector se podosta razlikuje od ostalih programa za automatsku zaštitu. Najveća prednost alata je što je brz i omogućava korištenje nekih specifičnih programskih tehnika zahvaljujući tome što je pisan u asembleru pa stoga podržava i neke stvari koje viši programski jezici ne mogu. SVKP koristi enkripciju funkcija pomoću 2048-bitnog RSA algoritma koju je u današnje vrijeme u smislenom roku nemoguće probiti , stoga je generiranje lažnih registracijskih ključeva nemoguće. Razlikuje se od ostalih programa po tome što ne koristi kompresiju , nego Rijndael algoritam pomoću kojeg se zaštićeni program kriptira.
Neke funkcije koje SVKP nudi su:
- API pozivi za komunikaciju s vlastitom zaštitom
- aktivna zaštita
- sprečavanje praćenja izvođenja
- metamorfizam
3. ASProtect
ASProtect je u današnje vrijeme jedan od najboljih alata za automatsku zaštitu, ako ne i najbolji. Razvila ga je tvrtka ASPack Software. ASProtect u većini slučajeva služi za rad s manjim programskim rješenjima internetske distribucije. Alat za programsku zaštitu ASProtect koristi ASPack algoritam. ASProtect služi za sprečavanje pojedinih funkcija prije nego što se program registrira. To se postiže tako da programer kriptira funkciju pomoću ASPortect algoritma, a zatim će se ASProtect pobrinuti da se pomoću ključa koji je sadržan u registracijskom ključu otključa ta funkcija, a bez toga ključa se neće moći pristupiti toj funkciji.
Radi na principu kompresije i dekompresije. Dekompresija se koristi za otkrivanje da li je bilo pokušaja da se orginalna datoteka izmjeni, a odmah se i pomoću toga sprječava dohvaćanje asemblerskog koda iz izvršne datoteke.
Poznat je po tome što se vrlo uspješno brani od brtue-force metode, a to sve zahvaljujući snažnoj enkripciji funkcije.
4. InstallShield
InstalShield spada u skupinu najpoznatijih i najboljih alata pomoću kojeg se kreira instalacijski paket. Za kreiranje instalacijskog paketa InstallShield koristi:
- API pozive iz eksternih bibilioteka
- enkripciju podataka
- provjeru sklopovskog ključa
Potrebno je napomenuti da je InstallShield alat koji koristi svoj vlastiti programski jezik, a struktura tog jezika je sličan strukturi programskog jezika C. Ono što je specifično za InstallShield i što otežava izmjenu datoteka u instalacijskom paketu je to da se kod InstallShilelda sve potrebne datoteke potrebne za instalaciju ( to se događa prilikom instalacije) dekompresiraju u neki privremeni direktorij, a zatim se instalacija može pokrenuti s tog jednog jedinog mjesta. Ono po čemu je poznat InstallShield i koji je njegov najbolji dio je taj što zaštita InstallShielda leži u zaštiti koja je uprogramirana u InstallShieldov jezik za skriptiranje. To je napravljeno zbog toga jer je alatu dosta teško pratiti izvođenja koja se događaju po kodu koja su uzrokovana kompleksnim strukturama. Još jedan od razloga je i taj što je ta Script datoteka u kojoj se nalazi zaštita također zaštićena CRC provjerom. Stoga dolazimo do toga da je tu datoteku teško izmijeniti, a InstallShield jedan od najboljih alata.
[Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009]
Dario Kresonja
Programsko rješenje
Odlučili smo demonstrirati jednu od metoda zaštite izvršnog koda na primjeru obfuskacije JavaScript datoteke. Pošto je JavaScript jezik koji se interpretira i nema mogućnost kompajliranja (čime bi se barem sakrio izvršni kod), on je u principu "uvijek čitljiv" korisnicima neke web stranice, i stoga je obfuskacija najčešće jedina moguća zaštita (osim pravne zaštite).
Da bi demonstirali obfuskaciju neke programske datoteke, napravili smo skriptu u Pythonu koja se može postaviti na server i koja prima kao parametar naziv neke JavaScript datoteke te ju obrađuje i ispisuje obfusciran JavaScript a pritom zadržava funkcionalnost. Time se umjesto normalnog uključivanja JavaScript datoteke u HTML-u web stranice (primjer) može uključiti ispis te Python skripte (ovo je obfuscirana verzija).
Naravno, obfuskacija izvornog koda nekog programa je složena stvar jer nužno uključuje puno leksičko parsiranje tog jezika. Iako je JavaScript relativno jednostavan jezik, za potpunu obfuskaciju bi bilo potrebno napraviti složen stroj stanja koji bi prolazio kroz datoteku i malo po malo ju "čitao", tj. identificirao sve konstrukte jezika poput varijabli i funkcija, te odvajao ih od drugih kao što su stringovi, koji se moraju procesuirati na bitno drukčiji način. Nažalost, takav program bi bio previše složen za realizirati pa naš obfuskator radi samo neke jednostavnije supstitucije i uklanjanja pomoću regularnih izraza (regexa). Unatoč tome, vrlo je vidljivo smanjenje čitljivosti i razumljivosti koda koji je prošao kroz proces obfuskacije, kao što se može vidjeti na našem primjeru (ulazni kod naspram izlaznog).
HTML koji uključuje "normalni" javascript:
http://arka.foi.hr/~nebivanov/obfuskator/normal.html
HTML koji uključuje obfuscirani javascript: http://arka.foi.hr/~nebivanov/obfuskator/obfuscated.html
Same datoteke (obfuscirana i normalna) su: http://arka.foi.hr/~nebivanov/obfuskator/in.js http://arka.foi.hr/~nebivanov/obfuskator/jsobf.py?file=in.js
Grudiček T., Ivanović N., Kresonja D., Kučina D.
Zaključak
Zaštita izvršnog koda programa predstavlja velik problem u današnjem društvu. To je proces povezan s različitim interesno utjecajnim skupinama, od zakonodavstva i informatičkih tehnologija, pa do ekonomije koja također ovdje ima vrlo važnu ulogu.
Postoje mnogi načini kako zaštititi izvršni kod. Primjerice, licenciranje je vrlo raširen način zaštite softvera u današnje doba. Licenca kao oblik zaštite daje pravo korištenja softvera prema pravilima kako je to navedeno u licencnom ugovoru. Prodajom licenciranog softvera, korisnik ne postaje vlasnikom samog softvera već on kupuje licencu za njegovo korištenje.
Autorsko pravo predstavlja najrašireniji način zaštite bilo kakvog intelektualnog vlasništva, pa tako i izvršnog koda. Autorskim pravom štiti se autora od nelegalnog korištenja njegova djela. Autorsko pravo je oblik zaštite gdje je moguće zaštititi izvršni kod programa, kao i izvorni, te strukturu i organizaciju koda, dijelove ili cijelo korisničko sučelje, pa i dokumentaciju koja ide uz softver.
Packing je tehnologija koja se koristi za zloćudne programe. Koristi se u svrhu smanjivanja veličine zloćudnog koda, kako bi se kod lakše prenio preko interneta. Međutim, ima i efekt da zloćudni program učini otpornijim za analizu. Packing je općenito program koji neku .exe datoteku kompresira i/ ili šifrira njezin sadržaj. Zatim ju pakira u novu .exe datoteku.
Mnogi packing alati implementiraju mehanizme zaštite softvera kao što su prekid i kontrola iznimkama, anti– debugging, anti– Vmware itd. Cilj im je ometanje analize zaštićenog programa. Neki packing alati sadrže vlastiti modificirani kod kako bi rutina unpacking-a bila dešifrirana prije izvođenja te kako bi bila ponovno šifrirana odmah nakon izvođenja.
Kod se štiti tako što se izvodi i u virtualnom okruženju s nestandardnom arhitekturom koja ga čini iznimno složenim za analiziranje. Osim toga, na taj se način izvorni kod štiti kako bi se spriječio crack programa. Neki packing alati generiraju i verificiraju serijske brojeve te na taj način onemogućavaju nadogradnju i druge važne funkcionalnosti nekog alata.
Koliko je neka zaštita otporna na razne napade i pokušaje probijanja, ovisi o implementaciji funkcionalnosti nekog programskog rješenja te mehanizmima zaštite koji se pritom koriste. Kad se govori o sprečavanju manipulacije izvršnim kodom, to je područje dovoljno pokriveno već gotovim komercijalnim rješenjima. Koriste se razni trikovi za sprečavanje probijanja programske zaštite. Pravilnim korištenjem i kombiniranjem tih mehanizama, može se napraviti poprilično jaka, gotovo neprobojna zaštita. Unatoč tome, svaka zaštita se, s vremenom, može probiti. To se mora uzeti u obzir prilikom izgradnje sustava zaštite. Pritom programer mora imati predodžbu kolike gubitke očekuje u slučaju probijanja zaštite, te kakva je zaštita zaista potrebna, odnosno koliko dugo je proizvođač odlučan odgoditi probijanje zaštite. U zaštiti ne treba pretjerivati jer ponekad komplicirana rješenja rade probleme u normalnom radu aplikacije, a uz to usporavaju i izvođenje.
Grudiček T. Kučina D.
Literatura
Web izvori:
• Barak B. Can we obfuscate programs?, 2007. Izvor: http://www.math.ias.edu/~boaz/Papers/obf_informal.html, učitano 19.01.2013.
• Narodne novine, Zakon o autorskom pravu i srodnim pravima, 2003. Izvor: http://narodne-novine.nn.hr/clanci/sluzbeni/306987.html, učitano 19.01.2013.
• Nikić, M. Ostvarenje programske zaštite od neovlaštene upotrebe, 2009. Izvor: http://bib.irb.hr/datoteka/449874.Diplomski_rad.pdf, učitano 19.01.2013.
• Požgaj Ž. Normativna zaštita softvera, 2009. Izvor: http://web.efzg.hr/dok//inf/pozgaj/pisani%20materijali/T13%20Normativna%20za%C5%A1tita.pdf., 19.01.2013.
• Zaštita softvera, 2004. Izvor: http://www.cis.hr/www.edicija/LinkedDocuments/CCERT-PUBDOC-2004-04-71.pdf, učitano 19.01.2013.
• http://www.cis.hr/www.edicija/LinkedDocuments/CCERT-PUBDOC-2004-04-71.pdf, učitano 10.01.2013.
• http://bib.irb.hr/datoteka/449874.Diplomski_rad.pdf, učitano 10.01.2013.
• https://security.foi.hr/wiki/index.php/Za%C5%A1tita_programskih_proizvoda, učitano 10.01.2013.
• https://security.foi.hr/wiki/index.php/Metode_za%C5%A1tite_softwarea_-_Packing, učitano 12.01.2013.
• http://www.cert.hr/sites/default/files/CCERT-PUBDOC-2005-09-134.pdf, učitano 13.01.2013.
• http://sigurnost.lss.hr/documents/LinkedDocuments/CCERT-PUBDOC-2007-12-212.pdf, učitano 13.01.2013.
• http://articles.mplans.com/packaging-and-labeling-your-products/, učitano 13.01.2013.
• http://en.wikipedia.org/wiki/Bin_packing_problem, učitano 14.01.2013.
• http://en.wikipedia.org/wiki/Packaging_and_labeling, učitano 14.01.2013.
• http://en.wikipedia.org/wiki/Packing, učitano 15.01.2013.
• http://xheo.com/products/code-protection/how-it-works, učitano 16.01.2013.
• http://www.preemptive.com/images/stories/dotfuscator_documentation/fifty_reasons_dotfuscator.pdf, učitano 17.01.2013.
• http://www.codeproject.com/Articles/12119/The-Increasing-Need-to-Protect-your-Applications-f, učitano 16.01.2013.
• http://syprog.blogspot.com/2012/02/basics-of-executable-code-obfuscation.html, učitano 14.01.2013.
• http://wwwusers.di.uniroma1.it/~parisi/Risorse/PrevRevEng.pdf, učitano 19.01.2013.
• http://yury.name/obfuscation/, učitano 17.01.2013.