Un pic de hooking in Delphi

Un pic de hooking in Delphi

Postby v0id » 16 Apr 2011, 18:13

S-a intamplat sa vreti sa blocati input-ul directionat catre o anumita aplicatie? :) Daca n-ati stiut cum s-ar putea face asta, va dau eu o idee: hooking.
Ideea e simpla: se "instaleaza" o functie care intercepteaza mesajele care circula in sistem si cand "prindem" un mesaj care nu vrem sa ajunga la destinatie, il blocam.
Bineinteles, nu acesta este principalul scop al hook-urilor, dar am pornit de la aceasta idee pentru ca mi se pare cel mai banal motiv pentru care cineva ar putea recurge la acestea.
Alte scopuri majore pentru folosirea hook-urilor:
  • monitorizarea mesajelor - pentru cauze mai mult sau mai putin nobile (debugging sau aplicatii de tip keylogger :) )
  • simularea input-ului de tastatura si/sau mouse - util pentru a automatiza unele procese, cum ar fi cele de testare ale unei aplicatii

Hook-urile pot fi globale (pot monitoriza mesajele tuturor thread-urilor din acelasi desktop) sau specifice unui anumit thread.

Revin la ideea initiala, aceea de a bloca input-ul directionat catre o anumita aplicatie. M-am gandit ca ar fi util sa fac in Delphi un proiect demonstrativ cat mai simplu, poate se va dovedi util pentru cineva. Scopul este sa blocam tastarea unui anumit caracter intr-o fereastra de Notepad.

Sunt exemplificate doua hook-uri:
  • WH_KEYBOARD, care monitorizeaza mesaje generate ca urmare a apasarii tastelor
  • WH_GETMESSAGE, care monitorizeaza mesajele ce urmeaza sa fie procesate de o fereastra

Proiectul are doua componente:
  1. Un DLL ce contine functiile de hooking - "HookDLLForEXE.dll"
  2. Un executabil care activeaza/dezactiveaza hook-urile - "HookFromEXE.exe"

Nota: se poate face si fara executabil, dar intram pe "taramul" injectarii de DLL-uri in aplicatia "tinta" si nu acesta este scopul aici. Pastrez lucrurile simple, e mai usor de inteles asa.

Cand hook-ul este destinat unei alte aplicatii decat cea creata de noi, este absolut necesar ca functille de hooking sa se afle intr-un DLL. Asta pentru ca aplicatia "tinta" va trebui sa incarce si sa execute acele functii in spatiul sau de memorie. Nu are cum sa faca asta daca functiile respective exista intr-un executabil creat de noi. Daca vrem ca hook-urile sa aiba efect numai asupra aplicatiei noastre, atunci putem sa ne descurcam si fara un DLL.

Nu are sens sa apelam la un hook global fiindca vrem sa blocam input-ul directionat catre o anumita aplicatie. Astfel, se creeaza un hook destinat unui anumit thread - thread-ul care a creat fereastra principala a lui Notepad. Pentru a gasi thread-ul cu pricina, se folosesc API-urile FindWindow si GetWindowThreadProcessID. Hook-urile se activeaza folosind functia SetWindowsHookEx (care printre parametri ia si un pointer catre functia de hooking, aflata in DLL), si se dezactiveaza cu UnhookWindowsHookEx. Cam asta ar fi pe scurt. Pentru mai multe detalii puteti studia codul atasat sau imi puteti pune intrebari.

Nota: Probabil va veti intreba de ce scriu/incarc din fisier text valoarea tastei care trebuie ignorate... Asta e tema pentru voi :) Va spun doar ca am apelat la aceasta metoda pentru ca e cea mai simpla (dar si lenta). N-am vrut sa intru in memory file mapping (sau orice altceva) pentru ca ar fi complicat inutil codul.

Proiectul demonstrativ functioneaza astfel: copiati in acelasi director EXE-ul si DLL-ul din arhiva. Lansati un "notepad.exe" si apoi "HookFromEXE.exe". In aplicatia demonstrativa introduceti un caracter care vreti sa fie blocat si apoi faceti click pe oricare dintre cele doua butoane care activeaza hook-ul dorit de voi. Incepeti sa butonati in Notepad si veti vedea ca atunci cand tastati caracterul cu pricina, nu se va intampla nimic :) Puteti dezactiva hook-ul facand click pe butonul corespunzator de dezactivare sau apasand CTRL+ALT+DEL.

ATENTIE: Cei care aveti sisteme de operare x64, rulati "notepad.exe" din directorul "C:\Windows\SYSWOW64" (nu din Start -> Run). Asta pentru ca DLL-ul ce contine functiile de hooking este compilat pe 32 biti, deci nu va putea fi incarcat de versiunea pe 64 biti a lui "notepad.exe".

Enjoy!
4p / 1 votes
Attachments
EXE.ZIP
(281.96 KiB) Downloaded 31 times
DLL.ZIP
(61.91 KiB) Downloaded 21 times
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 42.5

Return to Snippets

Who is online

Users browsing this forum: No registered users and 0 guests