osmišljavanje i realizacija zaštite softverameđu njima postoji nekoliko tipova hardverskih...
TRANSCRIPT
SVEUČILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
DIPLOMSKI PROJEKT
Osmišljavanje i realizacija zaštite softvera
Nikola BrežnjakVoditelj: prof.dr.sc. Nikola Bogunović
Zagreb, siječanj, 2010.
Sadržaj1. Uvod...................................................................................................................................2
2. Vrste zaštita.......................................................................................................................32.1. Zasnovana samo na softveru................................................................................................32.2. Mrežno licenciranje...............................................................................................................42.3. Hardverska zaštita ...............................................................................................................4
3. Razvoj koncepta zaštite softvera.......................................................................................63.1. Scenarij namjene zaštite.......................................................................................................63.2. Idejni koncept zaštite............................................................................................................6
4. Implementacija zaštite.......................................................................................................84.1. Desktop aplikacija.................................................................................................................8
4.1.1. Aktivator........................................................................................................................................94.1.2. Fizički broj tvrdog diska...............................................................................................................114.1.3. Kriptiranje i dekriptiranje podataka..............................................................................................124.1.4. Pisanje i čitanje iz DLL datoteke.................................................................................................134.1.5. Dodatne funkcije.........................................................................................................................15
4.2. Ugradnja u postojeću aplikaciju..........................................................................................164.3. Web aplikacija....................................................................................................................17
4.3.1. Aktivacija ....................................................................................................................................184.3.2. Administracija..............................................................................................................................21
5. Pokretanje programa.......................................................................................................255.1. Instalacija XAMPP-a...........................................................................................................255.2. Otpakiravanje ....................................................................................................................295.3. Rezervacija poslovnice.......................................................................................................30
6. Zaključak..........................................................................................................................33
7. Literatura..........................................................................................................................34
1. UvodBorba između zaštite softvera (engl. Software protection) i piratstva (engl. piracy) postoji
oduvijek, te čim netko objavi neku novu tehnologiju zaštite softvera, ostaje samo pitanje vremena
kada će ta nova tehnologija biti probijena (engl. cracked). Nažalost, to je stvarnost u kojoj danas
živimo i apsurdno je reći da je neki softver, tj. njegova zaštita neprobojna. Međutim, ni jedna od
zaraćenih strana se ne predaje, te se stalno osmišljavaju nove zaštite koje opet, prije ili kasnije,
bivaju probijene i tako u nedogled. Jedini zadatak koji preostaje softverskim programerima je da
poboljšavaju zaštitu svojeg softvera, te ga tako učine težim za probijanje. Postoji ravnoteža između
zaštite softvera i piratstva. Naime, ukoliko cijena probijanja neke zaštite prelazi cijenu samog
softvera tada probijanje postaje besmislen posao, jer nikome nije u interesu probijati softver čija je
cijena npr. 20 kuna.
Gledajući s druge strane, možda ne bismo trebali dopustiti da piratstvo totalno nestane.
Naime, piratiziran softver na neki način omogućuje prodavačima softvera da kultiviraju tržište. Npr.
treba postaviti pitanje tko je kupac skupog softvera (Catia, Autocad, Maya, itd.) koji se koristi u
specijaliziranim industrijskim poslovima. Da li je to neka tvrtka, institut, sveučilište, fakultet ili
samo siromašni student programer? Odgovor je jednostavan. Pravi kupci su oni ljudi koji mogu
kupiti softver, tj. koji si ga mogu priuštiti, dok oni koji si ga ne mogu priuštiti predstavljaju samo
potencijalne kupce. Dopuštati takvim ljudima da koriste piratiziran softver i nije tako loša odluka,
jer bi ga oni mogli kupiti u budućnosti. Bilo kako bilo, činjenica je da je piratizacija veoma ozbiljan
problem, što potkrepljuje podatak da su gubici industrije zbog softverskog piratstva u Hrvatskoj
tijekom 2008. porasli na 427 milijuna kuna.
U ovom radu su prvo opisane neke danas poznate vrste zaštita, dok su u sljedećim
poglavljima opisani osnovni koncepti moje implementacije zaštite softvera sa popratnim
objašnjenjem same implementacije. Nadalje, opisane su detaljne upute za korištenje moje
implementacije zaštite softvera, te je na kraju dan zaključak i popis literature.
2
2. Vrste zaštitaGlavna namjena zaštite softvera je da se onemogući neautorizirano korištenje softvera, pa
stoga možemo reći da je bilo koja metoda ili akcija u cilju sprječavanja neautoriziranog korištenja
softvera u biti zaštita softvera. Zaštita softvera se može podijeliti u tri glavne skupine:
● zasnovana samo na softveru (engl. Software based)
● mrežno licenciranje (engl. On-line license)
● hardverska zaštita (engl. Hardware dongle)
2.1. Zasnovana samo na softveruOva vrsta zaštite je zasnovana samo na softveru, bez dodatnih meta podataka, i sva logika
provjere se nalazi u dotičnoj aplikaciji. Tipični predstavnici ovakvih tipova zaštita su serijski
brojevi (engl. Serial numbers) i softverske omotnice (engl. Software packers).
Kod zaštite serijskim brojevima korisnici mogu koristiti softver samo u slučaju da posjeduju
ispravan serijski broj. Prednost ovakve zaštite je jednostavnost implementacije i niska cijena, a
nedostatak je taj da njezino probijanje predstavlja lagan posao za hakere. Ukoliko haker pronađe
autentifikacijski kod, može ga invertirati (engl. Reverse) i napraviti generalni program za probijanje
zaštite (engl. Cracker).
Softverske omotnice su također česti oblik zaštite softvera, jer se lako implementiraju bez
dodatnog programiranja. Softverski inženjeri moraju provući svoj program kroz program softverske
omotnice i na taj način u samo nekoliko klikova mišem dobivaju zaštićen softver. Na Internetu
postoje besplatni programi (npr, .NET Reflector, http://www.red-gate.com/products/reflector/) koji
omogućuju dekompajliranje (engl. Decompilation) izvršnih datoteka, čime je moguće dobiti potpuni
uvid u cijeli izvorni kod programa. Stoga u ovu kategoriju spadaju i takozvani obfuskatori (engl.
Obfuscators) koji posebnim algoritmima otežavaju čitanje izvornog koda programima za
dekompajliranje. Visual Studio programska okolina dolazi sa ugrađenim obfuskatorom, međutim ta
se zaštita također na veoma lak način zaobilazi. Postoje i neka komercijalna rješenja implementacije
obfuskatora, od kojih je najpoznatiji program .NET Spices (http://www.9rays.net).
Prednost zaštite temeljene samo na softveru je cijena, jer je generalno gledano relativno
jeftina. Dok je, s druge strane, očevidan nedostatak jednostavnost probijanja takve zaštite. Kao što
je već spomenuto, ni jedna zaštita nije neprobojna, te ako se sva zaštita softvera ostavi na strani
Osmišljavanje i realizacija zaštite softvera
krajnjeg korisnika u aplikaciji koju on koristi, tada je sve otvoreno za hakere, kojima je potrebno
samo vrijeme da probiju tu zaštitu. U tablici 2.1 su sažeto prikazane dobre i loše strane zaštite
zasnovane samo na softveru.
Tablica 2.1. Dobre i loše strane zaštite zasnovane samo na softveru
Dobro LošeJednostavna implementacija Jednostavno probijanje
Jeftin razvoj Slaba kontrola licenci- Jednostavno piratiziranje
2.2. Mrežno licenciranjeZaštita temeljena na mrežnom licenciranju ima širok spektar primjene, kao npr. kod mrežne
aktivacije (engl. On-line activation) Windows XP operacijskog sustava. Ovakva vrsta zaštite mora
imati implementiran poslužitelj za licenciranje (engl. License server), koji sadrži bazu podataka sa
licencama, odnosno aktivacijskim ključevima. Poslužitelj za licenciranje predstavlja glavno središte
licenciranja. Zbog potrebe za dodatnim poslužiteljem, potreban je i početni budžet koji će pokriti
troškove nabave tog poslužitelja.
U usporedbi sa zaštitom zasnovanom samo na softveru, mrežno licenciranje je bolje jer
pruža bolju sigurnost i prikladnije opcije licenciranja. Međutim, cijena implementacije je veća kod
mrežnog licenciranja, a uz to inicijalna investicija u poslužitelj je obavezna. Ovaj oblik zaštite je
dobar za velike softverske kuće, koje prodaju više od 5000 kopija na godinu i koje trebaju visok
stupanj kontrole nad licencama. U tablici 2.2 su sažeto prikazane dobre i loše strane zaštite
zasnovane na mrežnom licenciranju.
Tablica 2.2. Dobre i loše strane mrežnog licenciranja
Dobro LošeJednostavna implementacija Jednostavno probijanje
Relativno jeftin razvoj Rigidne sheme zaštiteCentralizirana kontrola licenci Relativno visok početni ulog
2.3. Hardverska zaštita Ova vrsta zaštite je najbolja, ali ni ona nije neprobojna. Postoji nekoliko vrsta zaštitnih
shema kod hardverske zaštite:
4
2. Vrste zaštita
● moduli (npr. kod Office paketa možete kupiti samo Word)
● vrijeme trajanja (npr. sat vremena program nudi sve funkcije, a nakon toga treba
kupiti program)
● broj pokretanja (npr. program se može pokrenuti 10 puta, a nakon toga treba kupiti
program)
● prisutnost hardverskog ključa (npr. provjera da li se USB hardverski ključ nalazi u
USB utoru računala)
Postoji oko 20 proizvođača koji nude hardversku zaštitu, a neki od poznatijih su Aladdin
(http://www.Aladdin.com), WIBU (http://www.WIBU.com), UniKey (http://www.eSecuTech.com).
Među njima postoji nekoliko tipova hardverskih zaštita, ovisno o priključku na računalo, pa tako
imamo:
● LPT – paralelni port računala
● PS/2 – priključak za miš
● Serijski priključak
● USB – najčešća verzija
● PCI kartica
Uz sve prednosti koje nudi hardverska zaštita softvera, ipak je upitna njezina upotrebljivost
zbog visoke cijene (oko 500 kn) naprema cijeni softvera i broja raspoloživih USB utora na
korisnikovom računalu. U tablici 2.3 su navedene dobre i loše strane hardverske zaštite.
Tablica 2.3. Dobre i loše strane hardverske zaštite
Dobro LošeRelativno dobra zaštita Visoka cijena
Veći prihodi Dulje vrijeme isporukeFleksibilne sheme zaštite Potrebno znanje programiranja
5
3. Razvoj koncepta zaštite softvera3.1. Scenarij namjene zaštitePrije nego krenem sa objašnjavanjem svojeg koncepta zaštite softvera, potrebno je napraviti tzv.
"scenarij" za koji je ova zaštita zamišljena:
"Pretpostavimo da radimo zaštitu za neku tvrtku (naziva npr. Ctim), koja nudi svoje
softversko rješenje za upravljanje radom kladionice. Kada neka kladionica kupi njihov
softver, tada se dotična kopija softvera na neki jedinstven način mora povezati sa brojem
poslovnice. Dodatno, dopušteno je da se softver instalira na zadani broj računala unutar
jedne poslovnice. Zaštita mora imati implementirano grafičko sučelje dostupno putem Web
preglednika, pomoću kojeg se na jednostavan način dodaje nova poslovnica i broj
dopuštenih računala u poslovnici. Nakon uspješne instalacije kladionica mora aktivirati
kupljeni softver unošenjem broja poslovnice čiji se rad želi aktivirati. Broj poslovnice, koji
je prethodno dogovoren elektroničkom poštom, unosi administrator tvrtke Ctim putem Web
sučelja zaštite. Pretpostavlja se da tvrtka Ctim posjeduje dodatni poslužitelj pomoću kojega
će se ostvariti koncept poslužitelja za licenciranje."
3.2. Idejni koncept zaštitePrema navedenim zahtjevima odlučio sam napraviti zaštitu temeljenu na modelu mrežnog
licenciranja opisanog u poglavlju 2.2. Zaštita se sastoji od dva dijela. Prvi dio je izrada desktop
aplikacije koja će generalno služiti za unos broja poslovnice u cilju aktivacije softvera nakon
instalacije. Također, desktop aplikacija će u svojoj pozadini sadržavati svu logiku za dohvaćanje
jedinstvenog broja računala koji će se koristiti za praćenje računala na kojima je instalirana pojedina
kopija softvera. Zbog toga što je pojedina kopija softvera uparena sa određenim brojem poslovnice i
brojem računala u poslovnici na koji je dozvoljeno instalirati softver, nije moguće instalirati softver
u drugoj poslovnici.
Drugi dio je izrada Web aplikacije kojom se ostvaruje implementacija koncepta poslužitelja
za licenciranje. Naime, preko Web sučelja administrator tvrtke Ctim će biti u mogućnosti
pregledavati postojeće aktivacije, unositi i mijenjati zapise o pojedinoj aktivaciji softvera, broju
dopuštenih računala unutar jedne poslovnice i sl.
6
3. Razvoj koncepta zaštite softvera
Idejni koncept zaštite je prikazan na slici 3.1. Windows aplikacija koja se želi zaštititi (u
našem slučaju softver za upravljanje radom kladionice) prije samog pokretanja poziva aktivator
formu koja putem Interneta na poslužitelj za licenciranje šalje kriptirani broj poslovnice (brP),
kojeg unosi tehničar koji vrši instalaciju softvera u poslovnici, i kriptirani fizički broj tvrdog diska
(fbHDD) koji predstavlja jedinstvenu identifikaciju računala. Aplikacija na poslužitelju prihvaća
podatke, dekriptira ih i provjeri da li u bazi postoji odgovarajući zapis, te vraća MD5 zapis od
primljenog dekriptiranog broja poslovnice i fizičkog broja diska. Aktivator forma nakon toga
provjerava primljeni MD5 zapis sa zapisom koji je aplikacija sama izračunala i ako se oni
poklapaju, tada se još jedanput šalje par brP i fbHDD na poslužitelj, gdje se ažuriraju potrebne
tablice i vraća zapis "success" ako je aktivacija uspješno provedena. Nakon toga se stvara
odgovarajuća DLL (Dynamic Link Library) datoteka u kojoj su zapisani potrebni podaci (brP i
fbHDD) i softver nastavlja s normalnim izvođenjem. Nakon nekog novog pokretanja provjerava se
da li postoji odgovarajuća DLL datoteka sa potrebnim podacima, a kao dodatak na svaki deseti klik
odabrane funkcijske tipke logika aplikacije radi tako da se spaja na poslužitelj za licenciranje i
provjerava valjanost korištenog softvera, čime je još dodatno pojačana zaštita.
7
Slika 3.1. Idejni koncept zaštite
WINDOWS APLIKACIJA
WEB SERVERaktivacija.php
MD5
kriptirani brPi fbHDD
success
aktivacijaUspjela.php
kriptirani brPi fbHDD
4. Implementacija zaštite4.1. Desktop aplikacija
Sadržaj priloženog C# projekta nbZastita je prikazan na slici 4.1.
Objašnjenje pojedinih datoteka:
● Form1.* – datoteke koje definiraju početnu formu glavnog programa – potrebno je
napomenuti da je ova forma uključena u projekt zbog demonstracije samog
korištenja i implementacije zaštite, te kao takva ne sadrži nikakvu drugu "korisnu"
funkcionalnost
● Aktivator.* – datoteke koje sadrže svu logiku aktivatora
● ProvjeriAkt.cs – klasa za dodatnu provjeru zaštite
● Konfiguracija.cs – klasa koja služi za pisanje i čitanje postavki iz XML (eXtended
Markup Language) datoteka
● RC4* – klase implementacije RC4 kriptografskog sustava
8
Slika 4.1. Sadržaj projekta nbZastita
4. Implementacija zaštite
● DriveInfoEx.dll – biblioteka koja služi za dohvaćanje fizičkog broja diska
(objašnjenje na http://www.codeproject.com/KB/mcpp/DriveInfoEx.aspx)
● GlassButton.dll – biblioteka kojom se ostvaruje lijep izgled funkcijskih tipki
4.1.1. AktivatorIzgled aktivator forme je prikazan na slici 4.2.
Cijeli postupak aktivacije se pokreće klikom na funkcijsku tipku Aktiviraj!. Da se
cijelo korisničko sučelje ne bi zablokiralo prilikom procesa aktivacije, sav je programski kôd
stavljen u backgroundWorker objekt čiji su opis i implementacija dostupni na Internet stranici
http://nerdparadise.com/tech/coding/csharp/backgroundworker/.
C# kôd koji se obrađuje nakon klika na tipku Aktiviraj! je sljedeći:
List<string> fbHDDs = dohvatiFbHDD();string brP = tbBrPoslovnice.Text.Trim();if (brP == null)return; //pogresno unesen broj poslovnice
// ako i jest više diskova, MD5 se generira samo za slučaj diska[0] string ukupniSerijskiBroj = fbHDDs[0] + brP; string generiraniMD5 = generirajMD5(ukupniSerijskiBroj); //kriptirati dobivene brojeve i takve ih poslati na server string kljucZaRC4 = "c01t.,I{M}"; string fbHDDkript = kriptiraj(kljucZaRC4, fbHDDs[0]); string brPkript = kriptiraj(kljucZaRC4, brP); string primljeniMD5 = posaljiNaServer(fbHDDkript, brPkript); if (primljeniMD5 == generiraniMD5) { string serverReturn = posaljiNaServerUspjelo(fbHDDkript,brPkript); if (serverReturn == "success") { this.DialogResult = DialogResult.OK; if (writeToDll(FILE, '1'))
MessageBox.Show(new Form() { TopMost = true }, "Zahvaljujemo Vam na kupnji!", "Aktivacija aplikacije",MessageBoxButtons.OK, MessageBoxIcon.Information);
} else { MessageBox.Show(new Form() { TopMost = true }, "Greška prilikom
provjere aktivacije, molimo Vas da nas kontaktirateputem maila.", "Aktivacija aplikacije", MessageBoxButtons.OK,MessageBoxIcon.Error);
9
Slika 4.2. Izgled aktivator forme
Osmišljavanje i realizacija zaštite softvera
} this.Close(); } else { if (primljeniMD5 == "1") { MessageBox.Show(new Form() { TopMost = true }, "Pogrešno unesen broj
poslovnice, molimo pokušajte ponovno.", "Aktivacija aplikacije", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else if (primljeniMD5 == "2") { MessageBox.Show(new Form() { TopMost = true }, "Preveliki broj
pokušaja instalacije, molimo javite nam se mailom!", "Aktivacijaaplikacije", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else if (primljeniMD5 == "3") { MessageBox.Show(new Form() { TopMost = true }, "To računalo je već
prijavljeno!", "Aktivacija aplikacije", MessageBoxButtons.OK,MessageBoxIcon.Error);
} else { MessageBox.Show(new Form() { TopMost = true }, "Greška broj 666.
Molimo javite nam se mailom u vezi ove greške!", "Aktivacijaaplikacije", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit(); } }
Objašnjenje koda po koracima:
1. u varijablu fbHDDs se spremi fizički broj diska
2. u varijablu brP se spremi uneseni broj poslovnice
3. napravi se varijabla ukupniSerijskiBroj koja sadrži spojene vrijednosti
varijabli fbHDDs i brP4. generira se MD5 varijable ukupniSerijskiBroj, i sprema u varijablu
generiraniMD55. varijable fbHDDs i brP se kriptiraju RC4 algoritmom, te šalju na poslužitelj za
licenciranje pomoću funkcije posaljiNaServer, a povratna vrijednost te
funkcije se sprema u varijablu primljeniMD56. ako se MD5 vrijednost kojeg vrati poslužitelj poklapa sa vrijednošću MD5 zapisa
kojeg je izračunala aplikacija, tada se podaci (kriptirani fbHDDs i brP) još jedanput
šalju na poslužitelj funkcijom posaljiNaServerUspjelo, čime je
implementiran takozvani protokol rukovanja (engl. Handshake protocol)
7. ako funkcija posaljiNaServerUspjelo vrati zapis "success" program
izrađuje DLL datoteku u koju zapisuje fizički broj diska i podatak o aktiviranosti
10
4. Implementacija zaštite
4.1.2. Fizički broj tvrdog diskaKod bilo koje implementacije zaštite softvera potrebno je na neki način povezati jednu
kopiju softvera sa jednim računalom, te je stoga potrebno pronaći jedinstveni identifikacijski broj
računala koji će se povezati sa tom dotičnom kopijom softvera. U većini slučajeva je taj
identifikacijski broj uzet od tvrdog diska (engl. Hard disk). Postoji nekoliko brojeva koji se mogu
dobiti od samog tvrdog diska, ali nas zanima samo onaj broj koji se ne mijenja čak niti prilikom
formatiranja cijelog tvrdog diska. Taj broj je poznat pod nazivom fizički broj tvrdog diska.
Na Internetu postoji nekoliko slobodno dostupnih biblioteka za dohvaćanje fizičkog broja
tvrdog diska, međutim sve biblioteke ne podržavaju sve Windows operacijske sustave, pa sam stoga
uz korištenu slobodnu biblioteku napisao svoj dio kôda koji provjereno radi na Windows
operacijskim sustavima Windows 98, Millenium, XP, Vista i Windows 7. Kôd funkcije za
dohvaćanje fizičkog broja tvrdog diska je sljedeći:
private List<string> dohvatiFbHDD(){
List<string> serijskiBrojevi = new List<string>(); DriveListEx driveInfo = new DriveListEx(); driveInfo.Load(); if (driveInfo.Count == 0) //drugi nacin, ali mora biti administrator! {
String query = "SELECT * FROM Win32_DiskDrive"; foreach (ManagementObject item in new ManagementObjectSearcher(query).Get()) {
string serialNumber = Convert.ToString(item["SerialNumber"]); if (serialNumber.Length > 2) { serialNumber = srediSerijskiDiska(serialNumber); serijskiBrojevi.Add(serialNumber.Trim()); } } } else { // ovaj dio koda radi pod xp-om, ali ne i na visti... string serijskiBroj = string.Empty; foreach (DriveInfoEx drvInfo in driveInfo) { serijskiBrojevi.Add(drvInfo.SerialNumber.Trim()); } } // prije toga iz liste izbaciti prazne brojeve serijskiBrojevi.Remove(""); //za svaki slucaj ako se ne nadje nikako fbHDD if (serijskiBrojevi.Count == 0) serijskiBrojevi.Add("012345654321"); return serijskiBrojevi;}
Funkcija dohvatiFbHDD koristi tri načina dohvaćanja fizičkog broja tvrdog diska. Prvi je
pomoću slobodno dostupne biblioteke DriveInfoEx.dll, čiji se kod nalazi unutar else uvjeta,
a njezino korištenje i implementacija su opisani na stranici http://www.codeproject.com/KB/mcpp/
DriveInfoEx.aspx. Međutim, ta biblioteka se pokazala neučinkovitom na Microsoft Windows Vista
11
Osmišljavanje i realizacija zaštite softvera
operacijskom sustavu, pa se stoga koristi dodatni WMI (Windows Management Instrumentation,
detaljnije na http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx) sistemski poziv.
Funkcija iz biblioteke DriveInfoEx.dll čita fizički broj po jednom principu, a WMI
funkcija po drugom. Brojevi koji se pročitaju su jednaki, razlika je samo ta što su jedni u little
endian formatu (http://en.wikipedia.org/wiki/Little_endian), a drugi u big endian formatu
(http://en.wikipedia.org/wiki/Big_endian), pa se stoga koristi sljedeća funkcija za normiranje tih
brojeva:
private string srediSerijskiDiska(string input){
if (input.Length < 2) return input; string returnValue = string.Empty;
char[] charArray = input.ToCharArray(); for (int i = 0; i < charArray.Length; i += 2) {
string rezChar = charArray[i].ToString() + charArray[i + 1].ToString(); int rezCharInt = Int32.Parse(rezChar,
System.Globalization.NumberStyles.HexNumber); returnValue += Convert.ToChar(rezCharInt); } // sad jos treba zamijeniti parove bajtova, jer ih neko krivo cita string noviReturn = string.Empty; for (int i = 0; i < returnValue.Length; i += 2) // i = i + 2 jer se uzima svaki 2. {
noviReturn += returnValue[i + 1]; noviReturn += returnValue[i]; } return noviReturn;}
Ako se fizički broj diska ne može dohvatiti ni na jedan od opisanih načina, tada funkcija
vraća broj 012345654321, što je bolje nego da ne vrati ništa, jer time omogućava dalji nastavak
izvođenja aktivacije, a sam administrator će znati za taj broj i zbog čega je on takav, te će na
temelju toga moći poduzeti daljnje akcije.
4.1.3. Kriptiranje i dekriptiranje podatakaBudući da se podaci iz Windows aplikacije prenose Internet mrežom do poslužitelja za
licenciranje, postoji mogućnost prisluškivanja i presretanja tih podataka, te je stoga te podatke
potrebno kriptirati. Funkcije za kriptranje i dekriptiranje su jednostavne i imaju svega nekoliko
linija kôda:
private string kriptiraj(string kljuc, string podatak){
RC4Engine rc4 = new RC4Engine(); rc4.EncryptionKey = kljuc; rc4.InClearText = podatak; rc4.Encrypt(); return rc4.CryptedText;}
12
4. Implementacija zaštite
Funkcija za kriptiranje prima dva argumenta, varijablu kljuc koja služi za kriptiranje
podataka i varijablu podatak koja predstavlja niz znakova koji se kriptiraju. Na početku se
instancira objekt klase RC4Engine koji pruža funkcionalnost rada sa RC4 kriptografskim
algoritmom. Nakon toga se popune varijable objekta, tj. ključ za kriptiranje i podatak koji se
kriptira. Na kraju se pozivom članske funkcije instance objekta obavlja kriptiranje podatka, čiji se
rezultat vraća kao rezultat funkcije. Funkcija dekriptiraj ima sličnu sintaksu, uz razliku da se
kod nje radi obrnuti postupak, tj. kriptirani podatak se pretvara u ljudima čitljiv niz znakova. Kôd
funkcije dekriptiraj je sljedeći:
private string dekriptiraj(string kljuc, string podatak){ RC4NonHex rc4 = new RC4NonHex(); rc4.EncryptionKey = kljuc; rc4.CryptedText = podatak; rc4.Decrypt(); return rc4.InClearText;}
Dodatna zaštita ostvarena je sažimanjem podataka koristeći MD5 algoritam. Implementacija
tog algoritma je također jednostavna, jer .NET okruženje ima gotovu klasu koja implementira
funkcionalnost MD5 algoritma. Kôd funkcije za sažimanje je sljedeći:
private string generirajMD5(string ulaz){ System.Security.Cryptography.MD5CryptoServiceProvider x = new
System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] data = System.Text.Encoding.ASCII.GetBytes(ulaz); data = x.ComputeHash(data); string ret = ""; for (int i = 0; i < data.Length; i++) ret += data[i].ToString("x2").ToLower(); return ret;}
Funkcija generirajMD5 kao argument prima varijablu ulaz koja predstavlja niz
znakova od kojih treba napraviti sažetak. Na početku se inicijalizira instanca klase
MD5CryptoServiceProvider koja pruža funkcionalnost rada sa MD5 algoritmom. U
varijablu data se sprema bitovna reprezentacija ulazne varijable ulaz i izračunava njezin sažetak.
Pomoćna varijabla ret se koristi kako bi se iz bitovne reprezentacije ulazne varijable ulaz dobila
varijabla tekstualnog tipa, koja se na kraju vraća kao rezultat funkcije.
4.1.4. Pisanje i čitanje iz DLL datotekeKod uspješne aktivacije aplikacije izrađuje se DLL datoteka iz koje se onda prilikom svakog
ponovnog pokretanja čitaju podaci o valjanosti. Kôd funkcije za pisanje u DLL datoteku je sljedeći:
13
Osmišljavanje i realizacija zaštite softvera
private bool writeToDll(string file, char aktivacija){
try { StreamWriter sw = new StreamWriter(file); Random rand = new Random(); List<string> serBrojevi = dohvatiFbHDD(); string randomString = serBrojevi[0]; randomString += aktivacija.ToString(); // kriptiramo ga i zapišemo u fajl string kriptiraniString = kriptirajBezHex(file, randomString); sw.Write(kriptiraniString); sw.Flush(); int brojStringova = rand.Next() % 100 + 300; // svaki od stringa neka bude proizvoljne duljine, od 50 do 450 znakova for (int i = 0; i < brojStringova; i++) { int duljinaStringa = rand.Next() % 400 + 50; randomString = string.Empty; // svaki znak je random generirani for (int j = 0; j < duljinaStringa; j++) randomString += (char)(rand.Next() % 256); kriptiraniString = kriptirajBezHex(file, randomString); sw.Write(kriptiraniString); sw.Flush(); } sw.Close(); sw.Dispose(); return true;
} catch {
return false;}
}
Funkcija writeToDll kao argument prima varijablu file koja predstavlja naziv datoteke
u koju treba zapisati podatke o aktivaciji i varijablu aktivacija koja predstavlja podatak koji
označava da li je aktivacija uspješno obavljena ili ne. Varijabla sr služi za čitanje iz datoteke, dok
varijabla rand pruža funkcije generiranja nasumičnih brojeva. U varijablu serBrojevi se
pohranjuje dohvaćeni fizički broj tvrdog diska na koji se nadodaje vrijednost varijable
aktivacija, koji se onda skupa kriptiraju nazivom datoteke i konačno zapisuju u DLL datoteku.
Nakon toga se u datoteku zapisuje nasumičan broj dodatnih podataka, koji variraju od datoteke do
datoteke, tj. DLL datoteka je različite veličine i sadržaja na svakom od računala na koje je instaliran
softver.
Funkcija readFromDll kao argument prima naziv DLL datoteke u kojoj su zapisani
podaci o aktivaciji, a njezin kod je sljedeći:
private string readFromDll(string file){
StreamReader sr = new StreamReader(file); char[] buffer = new char[50]; for (int i = 0; i < 50; i++) buffer[i] = (char)sr.Read(); string strBuffer = chArrToStr(buffer); string dekriptirano = dekriptiraj(file, strBuffer);
14
4. Implementacija zaštite
return dekriptirano;}
Funkcija readFromDll čita i vraća potrebne podatke o aktivaciji iz DLL datoteke čiji se
naziv predaje kao argument funkcije.
4.1.5. Dodatne funkcijeFunkcija jelAktivirano provjerava aktiviranost aplikacije čitanjem iz DLL datoteke,
a njezin kôd je sljedeći:
public bool jelAktivirano(){
Konfiguracija k = new Konfiguracija(); SERVER = k.AdrServer; // prvo potrazimo postoji li dll file string procitanoDLL = string.Empty; if (File.Exists(FILE)) // datoteka postoji, idemo je citati { procitanoDLL = readFromDll(FILE); // sad to treba usporediti sa brojevima diska na kompu. Funkcija
readfromdll vraca dekriptirane podatke.List<string> listaSerBrojeva = dohvatiFbHDD();
foreach (string s in listaSerBrojeva) { // usporediti dio procitanoga stringa sa serijskim brojem. Ako sve
pase, onda procitati aktivaciju. string procitaniSerBroj = procitanoDLL.Substring(0, s.Length); if (procitaniSerBroj == s) // to je to, citaj aktivaciju { string aktivacija = procitanoDLL[s.Length].ToString(); if (aktivacija == "1") { return true; } } } } return false;}
Na početku funkcije se instancira objekt klase Konfiguracija koji služi za dohvaćanje
postavki iz XML datoteke, točnije dohvaća se adresa poslužitelja za licenciranje. Nakon toga se
provjerava postojanje DLL datoteke, pročitaju se zapisani podaci iz datoteke (fizički broj tvrdog
diska i stanje aktivacije) i uspoređuju sa dobivenima. Ukoliko je aplikacija aktivirana funkcija vraća
true u suprotnom false.
Funkcije posaljiNaServer i posaljiNaServerUspjelo služe za slanje kriptiranih
podataka na poslužitelj za licenciranje. Slijedi kôd funkcije posaljiNaServer, dok je kôd
funkcije posaljiNaServerUspjelo identičan, uz razliku pozivanja druge datoteke na
poslužitelju za licenciranje.
15
Osmišljavanje i realizacija zaštite softvera
private string posaljiNaServer(string fbHDDkript, string brPkript){
string reqString = SERVER + "aktivacija.php?h=" + fbHDDkript + "&br=" + brPkript; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(reqString); string cijelaStranica = string.Empty; request.Proxy = null; request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; request.UserAgent = "Code Sample Web Client"; try { HttpWebResponse responce = (HttpWebResponse)request.GetResponse(); StreamReader stream = new StreamReader(responce.GetResponseStream()); cijelaStranica = stream.ReadToEnd(); ;
return cijelaStranica; } catch { MessageBox.Show(new Form() { TopMost = true },"Problem sa Internet
konekcijom. Provjerite jeste li spojeni na Internet.", "Aktivacija aplikacije", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null; } }
Funkcija posaljiNaServer kao argument prima kriptirani fizički broj diska i kriptirani
broj poslovnice. Varijabla reqString sadrži adresu do aktivacijske datoteke na poslužitelju za
licenciranje, sa cijelim URL (Uniform Resource Locator) zapisom. Pomoću HttpWebRequest objekta se šalje zahtjev poslužitelju za licenciranje i prima njegov odgovor koji se tada provjerava
dalje u aplikaciji.
4.2. Ugradnja u postojeću aplikacijuZa potrebu demonstracije u projektu sam napravio formu naziva Form1.cs koja se želi
zaštiti. Sve što je potrebno kako bi se ugradila zaštita je da se na Form load event stavi sljedeći dio
koda:
private void Form1_Load(object sender, EventArgs e){
Aktivator a = new Aktivator(); if (a.jelAktivirano()) {
//ovdje ide kod koji se mora izvršavati } else { a.ShowDialog(); if (a.DialogResult.Equals(DialogResult.OK)) { //ovdje ide kod koji se mora izvršavati } else { Application.Exit(); } }}
16
4. Implementacija zaštite
Dakle, prvo se napravi nova instanca objekta Aktivator, nakon čega se provjeri da li je
aplikacija aktivirana koristeći njegovu člansku funkciju jelAktivirano, te ako je to slučaj tada
se nastavlja s normalnim izvršavanjem kôda (ovdje u primjeru je stavljen samo komentar). Ako
funkcija vrati da softver nije aktiviran, tada se prikazuje forma za aktivaciju prikazna već prije na
slici 4.2. Ako se aktivacija provede uspješno, tada se također nastavlja s normalnim izvođenjem
programa, a u suprotnom se program zatvara.
Dodatna provjera koja omogućuje da se npr. svaki deseti put klikom na neku funkcijsku
tipku izvrši spajanje na poslužitelj za licenciranje i provjeri ispravnost aktivacije aplikacije, se
ostvaruje sljedećim kôdom:
private void button1_Click(object sender, EventArgs e){
Random r = new Random(); int br = r.Next(1, 10); MessageBox.Show(br.ToString()); if (br == 1) { if (!ProvjeriAkt.ProvjeriAktivaciju()) { File.Delete("nbZastita.dll");
Application.Exit(); } }}
Prvo se izračuna nasumični broj od 1 do 10 i pohrani u varijablu br. Ako je varijabla br jednaka 1 (u prosjeku se to događa svaki deseti put), tada se vrši dodatna provjera aktivacije i
ukoliko se pokaže da aplikacija nije pravilno aktivirana, tada program izbriše DLL datoteku i završi
s izvođenjem.
4.3. Web aplikacijaWeb aplikacija pruža grafičko sučelje za upravljanje licencama, tj. pruža sučelje za unošenje
novih poslovnica, pregled postojećih i mijenjanje broja dopuštenih računala u jednoj poslovnici.
Web aplikacija sa sastoji od dva dijela, aktivacija i administracija, čiji je kod smješten u istoimene
direktorije na poslužitelju za licenciranje. Web aplikacija podržava rad sa dvije različite baze
podataka, mySQL i PostgreSQL. Za realizaciju su potrebne dvije tablice u bazi na poslužitelju za
licenciranje, a to su tablice rezervacija i diskovi, čija je struktura prikazana u tablicama 4.1
i 4.2. Naziv baze podataka koja sadrži navedene tablice ja nbzastita.
17
Osmišljavanje i realizacija zaštite softvera
Tablica 4.1. Struktura tablice rezervacija
rezervacijabrP integer NOT NULL
rezervirano boolean DEFAULT false
datum timestamp without time zone
brDopustenih integer
Tablica 4.2. Struktura tablice diskovi
diskovibrP integer NOT NULL
fbHDD character varying(35) NOT NULL
datum timestamp without time zone
aktiviran boolean DEFAULT false
SQL kôd navedenih tablica je sljedeći:
CREATE TABLE `nbzastita`.`rezervacija` (`brP` INT NOT NULL ,`rezervirano` TINYINT( 1 ) NOT NULL ,`datum` DATETIME NOT NULL ,PRIMARY KEY ( `brP` )
) ENGINE = MYISAM
CREATE TABLE `nbzastita`.`diskovi` (`brP` INT NOT NULL ,`fbHDD` VARCHAR( 35 ) NOT NULL ,`datum` DATETIME NOT NULL ,`aktiviran` BOOL NOT NULL ,PRIMARY KEY ( `fbHDD` )
) ENGINE = MYISAM
4.3.1. AktivacijaU sklopu projekta je isporučen izvorni kod Web aplikacije, a datoteke direktorija
aktivacija prikazane su na slici 4.3.
18
Slika 4.3. Datoteke direktorija aktivacija
4. Implementacija zaštite
Datoteke smještene u direktorij aktivacija su pisane u jeziku PHP-u, a služe za
primanje zahtjeva od desktop aplikacije opisane u poglavlju 4.1. Kôd datoteke aktivacija.php je sljedeći:
<?// sifrarnik//1 - poslovnica nije rezervirana//2 - prevelik broj aktivacijarequire_once('./class.rc4crypt.php'); //klasa za rc4$greska = "FALSE";$server = "localhost";$dbname = "nbzastita";$username = "root";$pass = "test123";//primi request$fbHDDkript = hex2bin($_GET["h"]);$brPkript = hex2bin($_GET["br"]);//dekriptiraj kljuceve$kljuc = "c01t.,I{M}";$fbHDD = rc4crypt::decrypt($kljuc, $fbHDDkript);$brP = rc4crypt::decrypt($kljuc, $brPkript);
// provjeriti u tablici rezervirano da li je taj broj poslovnice rezerviran od nasmysql_connect($server, $username, $pass);mysql_select_db($dbname) or die ($greska);$query = "SELECT rezervirano FROM rezervacija WHERE brP = '" . $brP . "'";$result = mysql_query($query);if ($result == FALSE || mysql_numrows($result) == 0){
echo "1";exit;
}//provjeriti da li je brDopustenih u tablici rezervacija veci od broja zapisa brP u //tablici diskovi$query = "SELECT COUNT(*) FROM diskovi WHERE brP=" . $brP;$result = mysql_query($query);$brFbHDD = mysql_result($result, 0);$query2 = "SELECT brDopustenih FROM rezervacija WHERE brP=". $brP;$result2 = mysql_query($query2);$brDopustenih = mysql_result($result2, 0);
if ($brDopustenih > $brFbHDD){
$md5string = md5($fbHDD . $brP);$datum = date ("Y-m-d H:i:s", time());$query = "INSERT INTO diskovi VALUES ('" . $brP . "', '" . $fbHDD . "', '" .
$datum . "', '0')";if(mysql_query($query)){
echo $md5string;}else{
echo "4";}exit();
}else{
echo "2";exit();
}function hex2bin($str) {
19
Osmišljavanje i realizacija zaštite softvera
$bin = "";$i = 0;do {
$bin .= chr(hexdec($str{$i}.$str{($i + 1)}));$i += 2;
} while ($i < strlen($str));return $bin;
}?>
Objašnjenje koda po koracima:
1. nakon definiranja i popunjavanja varijabli potrebnih za pristup poslužitelju za
licenciranje ($server, $dbname , $username, $pass) prima se zahtjev koji
dolazi GET metodom i sadrži kriptirani fizički broj tvrdog diska i kriptirani broj
poslovnice, te se oni spremaju u odgovarajuće varijable ($fbHDDkript i
$brPkript)
2. kriptirani primljeni brojevi se dekriptiraju i spreme u odgovarajuće varijable
($fbHDD i $brP)
3. u tablici rezervacija se provjerava polje rezervirano da bi se vidjelo da li
je taj broj poslovnice rezerviran od strane administratora tvrtke Ctim
4. u tablici rezervacija se provjerava da li je polje brDopustenih u skladu s
postavljenim brojem dopuštenih računala u jednoj poslovnici
5. ukoliko je uvjet iz prethodnog koraka zadovoljen tada se izračuna sažetak MD5
funkcijom i popune potrebna polja u tablici diskovi6. na kraju se taj sažetak ispisuje kao rezultat izvršavanja, kojeg onda opet desktop
aplikacija koristi u daljnjem radu
Kod datoteke aktivacijaUspjela.php je sljedeći:
<?// sifrarnik// 1 - u bazi bi treabalo biti ovoga zapisa, ali ga nema. Treba ponoviti aktivaciju.
require_once('./class.rc4crypt.php');// funkcije potrebne za rad sa rc4$fbHDDkript = hex2bin($_GET["h"]);$brPkript = hex2bin($_GET["br"]);// sad treba dekriptirati oba kljuca$kljuc = "c01t.,I{M}";$fbHDD = rc4crypt::decrypt($kljuc, $fbHDDkript);$brP = rc4crypt::decrypt($kljuc, $brPkript);$server = "localhost";$dbname = "nbzastita";$username = "root";$pass = "test123"; mysql_connect($server, $username, $pass);
20
4. Implementacija zaštite
mysql_select_db($dbname) or die ("Ne moze se pristupiti bazi.");$query = "SELECT * FROM diskovi WHERE brP = '" . $brP . "' AND fbHDD = '" . $fbHDD . "'";$result = mysql_query($query);// u bazi bi treabalo biti ovoga zapisa, ali ga nema. Treba ponoviti aktivaciju.if ($result == FALSE || mysql_numrows($result) == 0){
echo "1"; }else // par (brP, fbHDD) je vea u bazi, treba samo zapisati da je aktivirano.{$query = "UPDATE diskovi SET aktiviran = 1 WHERE brP = '" . $brP . "' AND fbHDD = '" . $fbHDD . "'" ;
if(mysql_query($query))echo "success";
elseecho "error";
}?>
Ukratko, svrha kôda ove datoteke je da ažurira polje aktiviran u tablici diskovi, ako
je primljena dobra kombinacija broja poslovnice i fizičkog broja tvrdog diska. Dvostrukim slanjem
podataka na poslužitelj za licenciranje ostvaren je koncept rukovanja,čime je povećana razina
sigurnosti.
Datoteka dodatnaProvjera.php se koristi u slučaju da u desktop aplikaciji uključimo
opciju dodatne provjere, kao što je opisano u poglavlju 4.2.
4.3.2. AdministracijaZa potrebe rezervacije i aktivacije brojeva poslovnica i dopuštenih računala unutar tih
poslovnica, napravljeno je grafičko Web sučelje. Za realizaciju je korišten Codeigniter PHP MVC
framework. Za potrebe prijave (engl. login) u administracijsko sučelje napravljena je dodatna
tablica ci_sessions, koja služi za spremanje korisničkih sesija, a struktura joj je prikazana u
tablici 4.3.
Tablica 4.3. Struktura tablice ci_sessions
ci_sessionssession_id character varying(40) NOT NULL DEFAULT 0
ip_address character varying(16) NOT NULL DEFAULT 0
user_agent character varying(50) NOT NULL
last_activity integer NOT NULL DEFAULT 0
user_data text
SQL kôd navedene tablice je sljedeći:
CREATE TABLE ci_sessions( session_id character varying(40) NOT NULL DEFAULT 0, ip_address character varying(16) NOT NULL DEFAULT 0, user_agent character varying(50) NOT NULL,
21
Osmišljavanje i realizacija zaštite softvera
last_activity integer NOT NULL DEFAULT 0, user_data text, CONSTRAINT ci_sessions_pkey PRIMARY KEY (session_id))WITH( OIDS=FALSE);
Dva glavna kontrolera u application direktoriju CodeIgniter frameworka su login i
admin. Kôd login kontrolera je sljedeći:
<?phpclass Login extends Controller {
function Login(){
parent::Controller();}function index(){ if ($this->session->userdata('logged_in') == TRUE) { redirect('admin/index'); }
$data['title'] = "cTim";$data['slogan'] = "...admin area...";$data['css'] =
"http://localhost/nikola/administracija/css/default.css";$data['main'] = "";$data['username'] = array('id' => 'username', 'name' => 'username');
$data['password'] = array('id' => 'password', 'name' => 'password');
$this->load->view('login_view', $data);}function process_login(){ $username = $this->input->post('username'); $password = $this->input->post('password');
if ($username == 'root' AND $password == 'c01t.,I{M}') { $data = array(
'username' => $username, 'logged_in' => TRUE ); $this->session->set_userdata($data); redirect('admin/index');
} else { $this->session->set_flashdata('message', '<div id="message">Kombinacija
korisnickog imena i lozinke je pogresna, molim pokusajte ponovno.</div>');
redirect('login/index'); }}function logout(){ $this->session->sess_destroy(); redirect('admin');}
22
4. Implementacija zaštite
}?>
Kontroler login sadrži funkcije index, login i logout. Funkcija index je glavna
funkcija koja se poziva prilikom poziva kontrolera i ona služi za prikazivanje glavne login forme.
Funkcija login služi za procesiranje podataka i usmjeravanje korisnika na administracijski dio
ukoliko je kombinacija korisničkog imena i lozinke ispravna. Funkcija logout služi za odjavu
korisnika sa sustava.
Kôd admin kontrolera je sljedeći:
<?phpclass Admin extends Controller {
function Admin(){
parent::Controller();}
function index(){ if ($this->session->userdata('logged_in') != TRUE) { redirect('login/index'); } $data['title'] = "cTim";
$data['slogan'] = "...admin area...";$data['css'] = "http://localhost/nikola/administracija/css/default.css";$data['main'] = "";
$this->load->view('admin_view', $data);}
function rezervacija(){
if ($this->session->userdata('logged_in') != TRUE) { redirect('login/index'); } $data['title'] = "cTim"; $data['slogan'] = "...admin area..."; $data['css'] = "http://localhost/nikola/administracija/css/default.css"; $data['main'] = "";
$data['brP'] = array('id' => 'brP', 'name' => 'brP'); $data['brDopustenih'] = array('id' => 'brDopustenih', 'name' => 'brDopustenih');
$data['query'] = $this->db->get('rezervacija'); $this->load->view('rezervacija_view', $data);
}
function rezervacija_dodaj(){
$data = array( 'brP' => $_POST['brP'] , 'rezervirano' => '1',
'datum'=> date ("Y-m-d H:i:s", time()), 'brDopustenih' => $_POST['brDopustenih']
);$this->db->insert('rezervacija', $data);redirect('admin/rezervacija');
}
23
Osmišljavanje i realizacija zaštite softvera
function rezervacija_makni(){
$this->db->where('brP', $_POST['brP']);$this->db->delete('rezervacija'); redirect('admin/rezervacija');
}
function diskovi(){
if ($this->session->userdata('logged_in') != TRUE) { redirect('login/index'); } $data['title'] = "cTim";
$data['slogan'] = "...admin area...";$data['css'] = "http://localhost/nikola/administracija/css/default.css";$data['main'] = "";$data['brP'] = array('id' => 'brP', 'name' => 'brP');$data['fbHDD'] = array('id' => 'fbHDD', 'name' => 'fbHDD');$data['query'] = $this->db->get('diskovi');$this->load->view('diskovi_view', $data);
}
function diskovi_makni(){
$this->db->where('brP', $_POST['brP']);$this->db->where('fbHDD', $_POST['fbHDD']);$this->db->delete('diskovi'); redirect('admin/diskovi');
}}?>
Kontroler admin sadrži funkcije index, rezervacija, rezervacija_dodaj, rezervacija_makni, diskovi i diskovi_makni. Funkcija index je glavna funkcija
koja se poziva prilikom poziva kontrolera i ona služi za prikazivanje glavnog administracijskog
sučelja. Funkcija rezervacija služi za prikaz rezerviranih brojeva poslovnica od strane
administratora tvrtke Ctim, a funkcija diskovi služi za dohvaćanje i prikaz podataka o
aktiviranim poslovnicama, sa podacima o fizičkim brojevima diskova pojedine poslovnice. Funkcije
rezervacija_dodaj i rezervacija_makni služe za dodavanje odnosno brisanje
rezervacija, a funkcija diskovi_makni služi za brisanje pojedinog zapisa iz tablice diskovi.
Ovdje se neće ulazi u izgled datoteka za prikaz pojedinih pogleda (engl. View), ali se one mogu
pogledati u direktoriju views mape application Codeigniter razvojne okoline.
24
5. Pokretanje programaDa bi se mogla isprobati moja implementacija potrebno je slijediti par jednostavnih koraka.
5.1. Instalacija XAMPP-aProgram XAMPP omogućuje jednostavnu instalaciju Apache web poslužitelja, PHP
poslužitelja, te MySQL baze podataka. Program se može preuzeti sa sljedeće adrese:
http://www.apachefriends.org/en/xampp-windows.html#641.
U navedenom primjeru je skinuta EXE verzija u 7-ZIP formatu. Nakon što se program skine,
potrebno ga je pokrenuti, te se nakon toga dobije dijalog kao na slici 5.1. Tu treba odabrati mapu u
koju će se program XAMPP otpakirati. U ovom primjeru odabrana je mapa C:\NiKoLa.
Nakon što se program otpakira dobijemo novu mapu u mapi C:\NiKoLa, te nam potpun
put do programa XAMPP sada glasi C:\NiKoLa\xampp. Sada je potrebno otvoriti taj direktorij i
pokrenuti datoteku setup_xampp.bat, kao što je prikazano na slici 5.2.
Slika 5.1. Definiranje mape za otpakiravanje programa XAMPP
Osmišljavanje i realizacija zaštite softvera
Nakon što se datoteka setup_xampp.bat pokrene i njezino izvršavanje završi dobije se
prozor poput ovog na slici 5.3, te je za kraj instalacije potrebno pritisnuti bilo koju tipku na
tipkovnici.
Naime, ovime su svi putovi (engl. paths) automatski podešeni što je potrebno zbog
normalnog rada programa XAMPP. Za jednostavnije pokretanje pojedinih poslužitelja koje nudi
program XAMPP postoji program xampp-control.exe, kao što je prikazano na slici 5.4.
26
Slika 5.2. Pokretanje datoteke setup_xampp.bat
Slika 5.3. Rezultat izvođenja programa setup_xampp.bat
5. Pokretanje programa
Na slici 5.5 je prikazano grafičko sučelje programa xampp-control.exe. Kao što je i intuitivno
jasno, pokretanje pojedinog poslužitelja (engl. Server) se ostvaruje klikom na tipku Start.
Za naš primjer potrebno je pokrenuti poslužitelje Apache i MySql, te nakon toga je
obavezno potrebno postaviti lozinke za pristup XAMPP direktoriju i MySql bazi podataka, što se
radi klikom na tipku Admin... kao što je prikazano na slici 5.6.
27
Slika 5.4. Pokretanje programa za jednostavnu kontrolu XAMPP-a
Slika 5.5. Grafičko sučelje za upravljanje poslužiteljima
Osmišljavanje i realizacija zaštite softvera
Nakon što kliknemo na tipku Admin, pokreće se podrazumijevani (engl. Default) Web
preglednik i automatski otvori stranicu http://localhost/xampp. Ovdje je potrebno kliknuti na link
Security, kao što prikazuje slika 5.7.
Nakon klika na link Security se dolazi do stranice sa popisom sigurnosnih postavki, ali
budući da mi želimo izmijeniti trenutne postavke tražimo tekst sa linkom
http://localhost/security/xamppsecurity.php, kao što je prikazano na slici 5.8.
Na kraju konačno dolazimo do samog mjesta gdje se mjenja lozinka, te je tu potrebno
postaviti lozinku za Apache poslužitelj i MySql bazu podataka. Oba korisnička imena (engl. User
28
Slika 5.6. Pokrenuti poslužitelji Apache i MySql
Slika 5.7. Odabir linka Security za podešavanje lozinke
Slika 5.8. Odabir linka za promjenu lozinke
5. Pokretanje programa
name) neka budu root, a također obje lozinke neka budu test123 u svrhu testiranja moje
implementacije. Na slici 5.9 je prikazan izgled mijenjanja korisničkog imena i lozinke za Apache poslužitelj.
5.2. Otpakiravanje Sadržaj raspakirane arhive Aplikacije.zip koja je poslana kao privitak u email-u je
prikazan na slici 5.10.
Sadržaj direktorija Web aplikacija (direktoriji administracija i aktivacija)
je potrebno iskopirati u poddirektorij nikola direktorija htdocs instalacije programa XAMPP.
Budući da se za realizaciju administracijskog sučelja koristi Codeigniter PHP MVC framework koji
koristi poseban način upravljanja URL-ovima potrebno je u konfiguracijskoj datoteci Apache
poslužitelja (httpd.conf) otkomentirati liniju LoadModule rewrite_module modules/mod_rewrite.so i svako pojavljivanje teksta AllowOverwrite treba
zamijeniti sa AllowOverwrite All.
29
Slika 5.9. Mijenjanje korisničkog imena i lozinke za poslužitelj Apache
Slika 5.10. Sadržaj direktorija raspakirane arhive Seminar.rar
Osmišljavanje i realizacija zaštite softvera
5.3. Rezervacija poslovniceDo login forme administracijskog sučelja se dolazi upisivanjem adrese
http://localhost/nikola/administracija u Web preglednik. Pojavljuje se sučelje prikazano na slici
5.11.
Korisničko ime je root, a lozinka je c01t.,I{M}. Nakon uspješne prijave na sustav,
pojavljuje se izgled administracijskog sučelja prikazan na slici 5.12.
Klikom na link Rezervacija dolazimo do sučelja za unos nove poslovnice i
maksimalnog broja dopuštenih računala, kao što je prikazano na slici 5.13.
30
Slika 5.11. Logiranje u administracijsko sučelje
Slika 5.12. Administracijsko sučelje
5. Pokretanje programa
Za unos nove poslovnice je potrebno unijeti broj poslovnice (brP) i maksimalni broj
dopuštenih računala u poslovnici (brDopustenih), te kliknuti Dodaj!. Na slici 5.14 je prikazan
jedan takav primjer unosa.
Ako je netko uspješno aktivirao aplikaciju sa brojem poslovnice 5, tada će klik na link
Diskovi proizvesti ispis sličan onome prikazanom na slici 5.12.
31
Slika 5.13. Rezervacija nove poslovnice
Slika 5.14. Primjer unosa poslovnice sa brojem 5 i maksimalnim brojem računala 2
Osmišljavanje i realizacija zaštite softvera
Testiranje rada desktop aplikacije je moguće na način da se prvo podesi Web aplikacija kao
što je opisano u ovom poglavlju, te da se nakon toga pokrene C# projekt (izvršna datoteka se nalazi
u bin direktoriju) koji je uključen u arhivu Aplikacije.zip.
32
Slika 5.15. Primjer ispisa tablice diskovi
6. ZaključakU ovom radu su pokazane osnovne podjele zaštita, te je pokazana moja implementacija
bazirana na konceptu mrežnog licenciranja. Ono što svakako treba reći je da danas ne postoji zaštita
kojom bi se neki računalni program zaštitio od probijanja. Neke se zaštite teže probijaju a neke
lakše, ali ostaje činjenica da je samo pitanje vremena kad će se i najnovije verzije zaštita opet
razbiti.
Čak i moja implementacija zaštite nije otporna na probijanje, te ukoliko bi netko bio
dovoljno vješt u korištenju programa za dekompajliranje izvoršnog kôda tada bi bilo dovoljno da
makne dio kôda koji vrši provjeru aktivacije. Također bi morao maknuti i provjeru koja se dodatno
vrši svaki deseti put klikom na funkcijsku tipku.
7. Literatura1. XAMPP Documentation, http://www.apachefriends.org/en/faq-xampp.html
2. PHP Documentation, http://www.php.net/docs.php
3. MySQL Documentation, http://dev.mysql.com/doc/
4. 9rays službena stranica, http://www.9rays.net/
5. Reflector, http://www.red-gate.com/products/reflector/
6. On Software Protection Dongle, Raymond Snow, http://searchwarp.com/swa130791.htm
7. Ellislab, Inc.; http://codeigniter.com/user_guide/
8. Thomas Myer: Professional CodeIgniter
34