Blog de Enrique

¿Quién se robo mis focos?

HowTo - KeyLogger Primera Parte (La DLL)

Esta es la primera parte de tres en la que vamos a analizar y crear un KeyLogger para windows.

Descripción:

Un KeyLogger es un programa que nos permite registrar todas las teclas que son presionadasen la computadora, existen diferentes implementaciones, están los keyloggers por hardware, que consisten en un pequeño dispositivo que se conecta entre el teclado y la computadora, y keyloggers por software, que son programas que realizan esta función. Los KL por software se pueden dividir todavía mas en dos categorías: Los que son “Kernel Mode” y los que son “User Mode”. Los kernel mode normalmente se implementan por medio de un driver y corren dentro del “Ring 0″ que es el modo de protección con el que corre el Kernel de Windows, Los user mode corren con los privilegios de un usuario (Ring 3) por lo cual es mas fácil de detectar y detener.

En este caso vamos a hacer un keylogger por software, que corre en modo usuario y esta implementado por medio de “Hooks” (Si no sabes que es un hook, espera a la segunda parte del HowTo). El código del KeyLogger lo vamos a guardar en una DLL y lo vamos a instalar en el sistema como un servicio de windows, para que siempre este corriendo independientemente de que usuario este loggeado.

En esta primera parte nos enfocaremos a crear una DLL, por el momento no va a hacer nada útil, pero necesitaremos ese conocimiento para la segunda parte.

Requisitos:

  • Windows XP o superior
  • Visual C++ (Para los ejemplos usare Visual Studio 2008 Professional, si no lo tienes te sugiero bajar VC++ 2008 Express Edition)
  • Familiaridad con el lenguaje C y con la API Win32

Descargas:

Lo mero bueno:

Primero que nada, tienes que descargarte el codigo, descomprimirlo donde desees y ver los archivos de codigo fuente que estan dentro de la carpeta DLL y DLLTest.

Ahora lo que vamos a hacer es abrir el Visual Studio (o VC++ Express si es tu caso) y crear un nuevo proyecto.  Asegurate de que sea un proyecto de C++ y que sea de tipo “Win32 Project”:

Ponle de nombre “DLL” y presiona Ok.

Despues cuando llegues al wizard, selecciona las siguientes opciones:

Como puedes ver, el tipo de la aplicación es “DLL” y ademas seleccionamos que el proyecto este vacio.

Despues de esto ya tenemos nuestro proyecto y nuestra solucion listos para que escribamos el codigo, vamos a añadir el codigo fuente de la DLL:

Añadimos un nuevo item al proyecto que sea del tipo “C++ File” y le ponemos de nombre “libreria.cpp”

EL contenido de este archivo corresponde al archivo “libreria.cpp” del archivo zip con las fuentes.

Ahora analizaremos las partes del codigo de este archivo que son importantes:

#define DLLEXPORT __declspec(dllexport)

La tercera linea es una macro que vamos a usar para exponer las funciones deseadas que no lleven
DLLEXPORT al principio de su prototipo, no podran ser usadas fuera de la DLL.

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
	switch(ul_reason_for_call){
		case DLL_PROCESS_ATTACH:
		case DLL_PROCESS_DETACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
			break;
	}
 
	return TRUE;
}

DllMain Es el punto de entrada de las DLLs, se llama cada que la DLL es cargada o descargada en el espacio de memoria de un proceso o thread, por el momento no la vamos a usar, asi que podemos dejarla asi.

//Funcion interna, esta funcion no puede ser llamada fuera de la DLL
int suma(int a, int b){
	return a + b;
}

La funcion suma hace lo que parece, esta funcion solo puede ser usada por el codigo de la DLL, como no esta exportada, los programas que esten linkeados a la DLL no podran usarla

//Funcion exportada, muestra un Message Box
DLLEXPORT void MostrarAdvertencia(LPCSTR message){
	//Mostramos el mensaje proporcionado
	MessageBoxA(NULL, message, "Warning!!", MB_ICONWARNING);
}
 
//Esta funcion si puede ser llamada fuera de la DLL, ademas puede llamar a la funcion
//interna "suma"
DLLEXPORT int MostrarSuma(int a, int b){
 
	//Llamamos a la funcion suma
	int sum = suma(a, b);
 
	//Creamos la "string" que tiene el mensaje que estamos por desplegar
	char buf[100];
	sprintf(buf, "El resultado de %d + %d es: %d", a, b, sum);
 
	//Mostramos el Mensaje
	MessageBoxA(NULL, buf, "Suma", MB_ICONINFORMATION);
 
	//Valor de retorno (la suma)
	return sum;
}

Las funciones MostrarAdvertencia y MostrarSuma si pueden ser usadas por los programas que consuman la DLL, ya que podemos ver que si estan exportadas.
El tipo LPCSTR significa:

Long Pointer Constant String

y es equivalente a const char* que es el tipo de los “String” en el lenguaje C.

Podemos notar como en la funcion MostrarSuma si podemos llamar a la funcion Suma

Ahora que esta listo el codigo principal, tenemos que añadir la “Cabecera”, que es el archivo con extension “.h”, para hacerlo sigue los mismos pasos que hiciste para añadir el archivo “.cpp”, solo que ahora seleccionas el de tipo “header” y le pones de nombre “libreria.h”

El contenido de ese archivo corresponde al de “libreria.h” de la descarga, y es el siguiente:

//Cabecera que contiene los prototipos de las funciones declaradas
#include <windows.h>
 
void MostrarAdvertencia(LPCSTR message);
int MostrarSuma(int a, int b);

Ahora, tenemos que compilar la DLL, para esto dale clic derecho al proyecto en el “Solution Explorer” y presiona “Build”:

Ahora ya tenemos listo nuestra DLL, solo nos hace falta alguna aplicación donde usarla, que es la que vamos a hacer a continuación y es la que corresponde al proyecto “DLLTest” de la descarga

Simplemente crea otro proyecto tambien en C++ que sea de tipo Win32, y en el wizard selecciona que sea una aplicación de consola y un proyecto vacio:

Ahora, vas a añadir un archivo de codigo C++ que se va a llamar “main.cpp” y corresponde al archivo “main.cpp” del proyecto “DLLTest” y va a contener el siguiente contenido:

#include <stdio.h>
#include "libreria.h"
 
int main(int argc, char** argv){
 
	MostrarAdvertencia("Este es un mensaje de Advertencia");
 
	int res = MostrarSuma(5, 10);
 
	printf("El resultado de la suma es: %d\n", res);
 
	return 0;
}

Podemos notar como en la segunda linea, estamos incluyendo la cabecera que creamos en el otro proyecto, esto es porque ahi estan definidos los prototipos de las funciones exportadas por la DLL y los necesitamos para poder compilar este otro proyecto

Ahora, lo siguiente es muy importante, para poder usar la DLL, necesitamos tres archivos:

  • La DLL
  • El archivo “.lib” de la DLL
  • La Cabecera “.h”

La cabecera y el archivo .lib, los tenemos que poner en el mismo directorio que el codigo fuente del proyecto DLLTest, asi que dentro de ese directorio, deben de quedar los archivos “DLL.lib” y “libreria.h”

“libreria.h”, lo puedes tomar de la carpeta del codigo fuente del proyecto DLL y “DLL.lib” lo puedes tomar del directorio Debug de la solución, una vez que hayas compilado el proyecto DLL.

“DLL.dl” tiene que estar en el mismo lugar que “DLLTest.exe”, en este caso VS los coloca en el mismo lugar desde el principio asi que no hay ningun problema.

El ultimo paso es indicarle al “Linker” que enlace DLLTest con “DLL.lib”, para esto, tienes que abrir las propiedades del proyecto “DLLTest” y añadir en las dependencias del linker el nombre del archivo de esta manera:

Ya que este listo esto, puedes compilar el proyecto y despues correrlo, podras notar como usas funciones de la DLL en tu programa.

Si quieres compilar clases de C++ dentro de una DLL, el proceso es exactamente igual, solo tienes que añadir el prototipo de la clase a la cabecera que vas a distribuir junto con la DLL y el archivo .lib

En la siguiente parte vamos a analizar que son los Hooks de Windows, escribir el codigo del KeyLogger dentro de su propio DLL y hacer una aplicación de prueba que active y desactive el KeyLogger.