elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Keyboard hook windows desde dll
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Keyboard hook windows desde dll  (Leído 3,230 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Keyboard hook windows desde dll
« en: 31 Diciembre 2014, 16:59 pm »

Hola quiero poner un hook al teclado y he hecho esto:

Código
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. int main(){
  9. HINSTANCE library = LoadLibrary("dll_hook.dll");
  10. if (library){
  11. cout << "ok";
  12. }
  13.  
  14. HOOKPROC cellback = (HOOKPROC)GetProcAddress(library, "hookProc");
  15.  
  16.  
  17.  
  18. HHOOK hhook = SetWindowsHookEx(
  19. WH_KEYBOARD_LL,
  20. cellback,
  21. library,
  22. 0);
  23. if (hhook == NULL){
  24. int a = GetLastError();
  25. cout << "Error";
  26. }
  27. else{
  28. cout << "Done!";
  29. }
  30.  
  31. getchar();
  32.  
  33. return 0;
  34. }

Y la dll:

Código
  1. #include "hookProc.h"
  2. #include <Windows.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. extern "C"{
  8. LRESULT  __declspec(dllexport) hookProc(int code, WPARAM wparam, LPARAM lparam){
  9. cout << code;
  10. cout << wparam;
  11. cout << lparam;
  12. if (code < 0){
  13. return CallNextHookEx(0, code, wparam, lparam);
  14. }
  15. else if (code >= 0){
  16. if (wparam == VK_LBUTTON){
  17. cout << "Left button pressed!" << endl;
  18. }
  19.  
  20. }
  21. return CallNextHookEx(0, code, wparam, lparam);
  22. }
  23. }

Me muestra ok y done pero luego al presionar una tecla la aplicación deja de responder y tengo que cerrar la.
Me pueden ayudar ?

Saludos


« Última modificación: 31 Diciembre 2014, 19:51 pm por patilanz » En línea

ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Keyboard hook windows desde dll
« Respuesta #1 en: 2 Enero 2015, 03:21 am »

Te recomendaria que para eso no uses una DLL, mejor usa un Hook de teclado global desde tu mismo exe con WH_KEYBOARD_LL, seria algo como esto:

Código
  1. LRESULT CALLBACK LL_KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
  2. {
  3.   // Tu codigo para manejar los mensajes aqui
  4. }
  5.  
  6. int main()
  7. {
  8.    // Instala el hook global de teclado
  9.    HHOOK gkHook = SetWindowsHookEx(WH_KEYBOARD_LL, LL_KeyboardHook, 0, 0);
  10.  
  11.    // Haces tu loop aqui o lo q quieras
  12.  
  13.    UnhookWindowsHookEx(gkHook);
  14.  
  15.    return(0);
  16. }
  17.  
Saludos


En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Keyboard hook windows desde dll
« Respuesta #2 en: 2 Enero 2015, 03:34 am »

Gracias por tu respuesta. Luego pruebo como me dijiste pero en la pagina de microsoft para el argumento de HOOKPROC dice
Citar
If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a DLL. Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

Yo necesito que el id del thread sea 0 para hacer un hook global?

Saludos
En línea

ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Keyboard hook windows desde dll
« Respuesta #3 en: 2 Enero 2015, 04:08 am »

Creo q no lo tienes del todo claro, echale una ojeada a estos links y entenderas la diferencia entre WH_KEYBOARD_LL y WH_KEYBOARD:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984(v=vs.85).aspx

Por si acaso te quedas igual, te lo digo en pocas palabras, instalando un Hook usando WH_KEYBOARD solo te da un gancho en el contexto actual desde donde se instalo dicho gancho, por esto para hacer un hook en otros procesos (contextos) necesitas inyectar una DLL en dichos procesos para poder ubicarte en el contexto de dicha app.
Por otra parte usando WH_KEYBOARD_LL no necesitas una DLL por separado pues el metodo es diferente, ya q el gancho es a nivel de SO, por lo q cada vez q surja un evento de teclado en cualquier app, el SO hara automaticamente un cambio de contexto al de tu propia app donde reside el codigo del gancho para procesarla y luego vuelve al contexto de la app anterior.
Espero hayas captado la idea
Saludos
En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Keyboard hook windows desde dll
« Respuesta #4 en: 2 Enero 2015, 13:00 pm »

Creo que con esto ya me quedo claro, muchas gracias .
Se puede inyectar un dll a mi propia aplicación ? Solo por curiosidad.


Hice otro código pero tampoco funciona

Código
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6. HHOOK hhook;
  7.  
  8. LRESULT CALLBACK LowLevelKeyboardHook(int code , WPARAM wparam, LPARAM lparam)
  9.        cout << code;
  10. return CallNextHookEx(hhook, code, wparam, lparam);
  11. }
  12.  
  13.  
  14.  
  15. int main(){
  16. hhook = SetWindowsHookEx(
  17. WH_KEYBOARD_LL,
  18. LowLevelKeyboardHook,
  19. 0,
  20. 0);
  21. if (hhook == NULL){
  22. int a = GetLastError();
  23. cout << "Error";
  24. }
  25. else{
  26. cout << "Done!";
  27. }
  28.  
  29. getchar();
  30.  
  31. UnhookWindowsHookEx(hhook);
  32. return 0;
  33. }

Cuando pulso una tecla se bloquean los eventos y al cabo de unos 20 segundos el evento pasa a la aplicación donde se pulso pero por mi función no. Con WH_MOUSE_LL pasa lo mismo.

Saludos


@Edit: Resulto me faltaba el loop de mensajes  ;D Pero por favor responde me a lo  anterior.
« Última modificación: 2 Enero 2015, 13:32 pm por patilanz » En línea

ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Keyboard hook windows desde dll
« Respuesta #5 en: 2 Enero 2015, 14:40 pm »

Pues claro q puedes  ::)
En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hacer un Irda Keyboard
Electrónica
rieju 1 3,143 Último mensaje 17 Noviembre 2004, 06:41 am
por rieju
Keyboard Hook no detecta teclas en una aplicación en concreto
.NET (C#, VB.NET, ASP)
rmva2 5 5,666 Último mensaje 15 Diciembre 2011, 16:53 pm
por rmva2
Fallo al abrir handles durante hook de API de Windows
Programación C/C++
Halos 1 1,994 Último mensaje 8 Abril 2013, 15:11 pm
por Halos
Hook global para los Windows Messages?
.NET (C#, VB.NET, ASP)
Eleкtro 5 3,727 Último mensaje 1 Julio 2013, 11:02 am
por Eleкtro
Hook Library Windows
Ingeniería Inversa
Geovane 0 1,862 Último mensaje 30 Octubre 2018, 16:05 pm
por Geovane
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines