Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] Keyboard hook
(Questo messaggio è stato modificato l'ultima volta il: 24/03/2011, 17:32 da Admin.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Ciao a tutti,
l'altro giorno non sapevo cosa fare e mi sono messo a giocare con gli hook, un argomeno molto interessante ma che non ho mai approfondito.
Cosi ho tirato fuori il solito Prato Fiorito (il mio target preferito hihi) e ho partorito il codice che vedete sotto.

Ma cosa fa?
Normalmente in Prato Fiorito se premiamo il tasto F2 cominciamo una nuova partita.
Premendo F4 non succede niente.
Bene, iniettiamo questa DLL in Prato Fiorito (campo minato), da quel momento la nostra myHookProcedure intercetterà i messaggi della tastiera, in questo modo saremo in grado di controllare se è premuto il tasto F2 o il tasto F4
Con F4 usciamo dal gioco (abbiamo aggiunto una funzionalità)

Quando viene premuto F2, viene intercettato e visualizziamo un messaggi (MessageBox), dopo di che controlliamo se è premuto il tasto destro del mouse, nel qual caso settiamo a true la flag call_next per assicurarci di chiamare il resto della hook chain in modo che F2 venga elaborato "normalmente" come al solito, ovvero iniziamo una partita nuova.
La cosa interessante è che se NON premiamo il pulsante, NON chiamiamo la routine originale e il tasto F2... puuf! come non fosse mai stato premuto Smile
Questo comportamento a volte può tornare utile, basta un po' di fantasia

    C++ Programming
  1. //
  2. // test keyboard hook
  3. // by Digger 2011
  4. // <a href="http://hackmix.altervista.org" target="_blank" rel="noopener" class="mycode_url">http://hackmix.altervista.org</a>
  5. //
  6. #include <windows.h>
  7. #include <stdio.h>
  8.  
  9. HHOOK hHook=0;
  10.  
  11. // Questa è la nostra hook procedure
  12. LRESULT __stdcall myHookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
  13. {
  14.  
  15. bool call_next=false; // se true eseguiamo il CallNextHookEx
  16.  
  17. // controlliamo se il messaggio ci interessa o no
  18. if ((nCode!=HC_ACTION) || ((lParam|0xFFFFFF)==0xC0FFFFFF))
  19. call_next=true;
  20.  
  21. if (!call_next)
  22. {
  23. switch(wParam)
  24. {
  25. case VK_F2:
  26. MessageBox(NULL,"Hook in azione!, se ora tieni premuto il tasto destro del mouse
  27. e clicchi ok ricominci","by Digger 2011",MB_OK);
  28. if (GetAsyncKeyState(VK_RBUTTON))
  29. call_next=true;
  30. break;
  31.  
  32. case VK_F4:
  33. ExitProcess(0);
  34. break;
  35. }
  36. }
  37.  
  38. if (call_next)
  39. return CallNextHookEx(hHook,nCode,wParam,lParam);
  40. else
  41. return 1;
  42. }
  43.  
  44. int DllProc()
  45. {
  46. bool fine=false;
  47. HWND h=0;
  48. DWORD thid=0;
  49.  
  50. // Cerchiamo la finestra "Prato fiorito",
  51. // ricaviamo il threadId che l'ha creata e settiamo l'hook passandogli
  52. // la nostra hook procedure, dopo di che restiamo qui in loop a far niente
  53. if (h=FindWindow(NULL, "Prato fiorito"))
  54. if (thid=GetWindowThreadProcessId(h,0))
  55. if (hHook=SetWindowsHookEx(WH_KEYBOARD,myHookProcedure,NULL,thid))
  56. while(true)Sleep(500);
  57.  
  58. return 0;
  59. }
  60.  
  61.  
  62. BOOL WINAPI DllMain(HINSTANCE mod, DWORD DWORD_REASON, LPVOID res)
  63. {
  64. switch(DWORD_REASON)
  65. {
  66. case DLL_PROCESS_ATTACH:
  67. CreateThread(0, 0, (LPTHREAD_START_ROUTINE)DllProc , 0, 0, 0);
  68. break;
  69. case DLL_PROCESS_DETACH:
  70. UnhookWindowsHookEx(hHook);
  71. break;
  72. }
  73. return TRUE;
  74. }




digger
24/03/2011, 16:51
#1
Cerca


Messaggi in questa discussione
Keyboard hook - da digger - 24/03/2011, 16:51
[Nessun oggetto] - da Admin - 24/03/2011, 17:37
[Nessun oggetto] - da digger - 24/03/2011, 18:33
[Nessun oggetto] - da L0s3rZ95 - 27/03/2011, 12:17



Utenti che stanno guardando questa discussione: 1 Ospite(i)