Hooky în ferestre

Cu acest articol încep o serie de articole despre mecanismul de mesaje fereastra de capcane, și jargonul cârlige mecanism programatori în sistemele de operare Windows. Tema de cârlige este popular pe multe forumuri programatori. Materialul acestor articole este proiectat pentru utilizator novice, exemplele sunt în Delphi. Acest articol va prezenta principiile de bază ale mecanismului de cârlig, și va fi scris de exemplu, de un keylogger.

Deci, vom continua, ceea ce este cârligele mecanism în Windows? În cârlig Windows pentru a intercepta mecanism numit un eveniment caracteristici speciale (cum ar fi mesaje, de intrare de la mouse-ul sau tastatura), înainte de a ajunge la aplicarea. Această funcție poate răspunde apoi la evenimente, și, în unele cazuri, să modifice sau să le aruncați. Funcțiile de la primirea notificării de evenimente sunt numite funcții de filtrare și diferă în tipurile de evenimente le interceptate. Exemplu - funcția de filtrare pentru a intercepta toate evenimentele mouse și tastatură. În cazul în care unul este atașat cârlig câteva funcții de filtrare, Windows implementează toate funcțiile, iar funcția atașată ultima, apare la începutul cozii, iar prima caracteristica - la sfârșitul anului.

Când atașat la Hook una sau mai multe funcții, filtre, și are loc un eveniment, ceea ce conduce la declanșarea unui cârlig, Windows este doar prima funcție a funcțiilor liniei de filtrare. Handler apel a fiecărui următor depinde în totalitate de procesorul anterior. În cazul în care orice procesor nu va cauza următoarea, fereastra de destinație nu va veni mesajul dorit, și, prin urmare, nu este funcția de fereastră se numește.

Carlige oferă capabilități puternice pentru aplicații Windows. Aplicațiile pot utiliza cârlige pentru următoarele scopuri:

  • Procesul sau modifica toate mesajele destinate pentru toate casetele de dialog (caseta de dialog), ferestrele de informații (caseta de mesaj), barele de defilare (bara de defilare), sau meniul aplicației (WH_MSGFILTER).
  • Procesul sau modifica toate mesajele destinate pentru toate casetele de dialog, casete de informații, bare de derulare, meniuri, sau întregul sistem (WH_SYSMSGFILTER).
  • Procesul sau modifica toate mesajele din sistem (toate posturi), obținem getMessage funcție sau PeekMessage (WH_GETMESSAGE).
  • Procesul sau modifica toate mesajele (de orice tip), efectuați o funcție de apel telefonic SendMessage (WH_CALLWNDPROC).
  • Înregistra sau reda tastatură și mouse evenimente (WH_JOURNALRECORD, WH_JOURNALPLAYBACK).
  • Procesul, schimba sau șterge evenimente tastatură (WH_KEYBOARD).
    Proces, să modifice sau să renunțe la orice evenimente șoarece (WH_MOUSE).
  • Pentru a răspunde la unele din sistem, ceea ce face posibilă dezvoltarea aplicațiilor de formare bazate pe calculator - formare pe bază de calculator (WH_CBT).
  • Prevenirea un apel la o altă funcție de filtru (WH_DEBUG).

    Lucrul cu cârlige prin funcția SetWindowsHookEx, UnhookWindowsHookEx, handler apel următor prin funcția CallNextHookEx. Înainte de versiunea 3.1 pentru Windows prevede gestionarea funcției cârlige SetWindowsHook, UnhookWindowsHook și DefHookProc. Aceste funcții sunt încă puse în aplicare în Win32, numai pentru compatibilitate cu aplicatii mai vechi, și să le utilizeze în noi proiecte nu este recomandată.

    Să începem mai întâi, pentru a seta funcția de cârlig SetWindowsHookEx uspolzuetsya

    Să mergem mai departe. Toate funcțiile de filtrare trebuie descrise după cum urmează:

    Pentru a apela următoarea funcție în linia de cârlig este funcția CallNextHookEx

    Deci, informațiile de bază despre hukah avem. Acum trebuie să înceapă să practica. Cele mai frecvente probleme ridicate la forumul de programatori asociate cu cârlige, aceasta este o problemă cu keylogger de scriere. Acesta keylogger am scrie acum.

    Pentru a crea un cârlig de tastatură trebuie să spunem codul WH_KEYBOARD atunci când apelați funcția SetWindowsHookEx. Ferestre solicită handlerele KhKA atunci când funcția getMessage sau PeekMessage merge înapoi mesaje WM_KEYUP, WM_KEYDOWN.
    Parametrul cod poate fi setat la următoarele valori

  • HC_ACTION pentru Windows solicită de tratare a evenimentelor la codul atunci când ștergeți un mesaj din coadă.
  • HC_NOREMOVE pentru Windows determină procesorul cu codul, când mesajele de la tastatură nu sunt eliminate din coada de așteptare, deoarece cererea a cauzat PeekMessage parametrul funcției PM_NOREMOVE. Atunci când apelați un cârlig cu acest cod nu este garantat transferul stării reale a tastaturii. Programatorul trebuie să fie conștient de posibilitatea unei astfel de situații.

    Parametrul wParam handler cârlig WH_KEYBOARD cuprinde un cod cheie virtuală (de exemplu, VK_F1, VK_RETURN, VK_LEFT). Parametrul lParam este interpretat după cum urmează.

  • Biți 0-15 conține numărul de repetiții tastări caz ive de lipire.
  • Biți 16-23 conțin codul de scanare al tastei apăsate. Este un cod dependent de hardware, care depinde de tastatură.
  • Bit 24 este una, dacă cheia este apăsată o extinsă (sau funcție pe tastatura numerică), 0 altfel.
  • Biții 25-28 sunt rezervate.
  • Bit 29 este setat, dacă ați apăsat butonul Alt.
  • Bit 30 ne spune despre starea cheii pentru a trimite mesajul. Dacă bitul este egal cu unul înainte de butonul este apăsat înainte de a trimite mesajul, dacă butonul nu a fost apăsat înainte, bitul este zero.
  • Bit 31 indică starea curentă a cheii. Acesta este egal cu zero, în cazul în care este apăsat butonul și unitatea, în cazul în care nu deprimat.

    Cum vom salva textul introdus? Desigur, cel mai simplu mod este de a păstra în codul de fișier interceptat de tasta apăsată este salvată într-un fișier de îndată ce o funcție a filtrului. Dar fișierul I / O operațiune nu este prea rapid și acest lucru duce la o scădere generală a performanțelor sistemului atunci când introduceți text (cu toate acestea, pe noile mașini poate fi greu de văzut). Așa că am zavedom server special fereastra, care va trimite codurile tastelor apăsate, această fereastră va primi codurile de intrarile de la tastatura și stochează în memoria sa, și arunca tamponul într-un fișier, atunci când se va ajunge la o anumită dimensiune.

    Crearea și eliminarea cârlig, cred că, nici o problema este, prin urmare, trece imediat la handler cârlig foarte.

    Problema principală atunci când scrieți un cârlige tastatură este că handler cârlig este trecut doar codul de scanare al tastei apăsate și codul său cheie virtuală. Codul de scanare virtuală și codul ne spune care cheia a fost apăsat, dar nu spun că a fost introdusă. coduri Permiteți-mi să explic, chiar dacă vom introduce un text în limba română, tastatura va fi transmise Hook chei în engleză, și anume, introducem cuvântul „salut“, și va fi transferat la handler cârlig „GHBDTN“. Sau, de exemplu, apăsați numărul Shift 7 și care introduc caracterele Dar cârlig tastatura budt prezentate numai numerele de cod 7. Pentru a converti codul de scanare și codul virtuale într-un caracter de text care a fost introdus, trebuie să utilizați funcția ToAscii (sau ToUnicode).
    Parametrii săi sunt:

    Primul parametru este codul cheie virtuală, al doilea este codul de scanare, al treilea parametru este un pointer la o matrice în care starea de conservare a tastaturii, al patrulea este un pointer la o variabilă care va fi stocat simbol, al cincilea parametru este un steag care determină dacă meniul activ. Acest parametru trebuie să fie 1, în cazul în care meniul este activ, sau în alt mod 0. Această funcție returnează numărul de caractere rezultate din conversia. Starea tastaturii pot fi accesate prin intermediul funcției GetKeyboardState.

    Înapoi în funcția noastră de filtrare.

    În primul rând, vom obține starea tastaturii, iar apoi vom obține codul de scanare a parametrilor și apelează funcția lParam ToAscii. În cazul în care rezultatul său nu este zero, adică dacă rezultatul său nu este gol, apoi trimite server de fereastra csoobschenie cu titlul „keylogger simplă“ (numerele din antet trebuie doar pentru unicitatea sa). Mesaj WM_KEYEVENT am anunțat ei înșiși

    Și aici e handler în sine WM_KEYEVENT Mesaje

    Pentru cheia de decriptare de text, care a fost apăsat pe scanarea sa din codul am folosit funcția GetKeyNameText. DLL textul integral al cererii și stocate în arhiva atașată la acest articol.

    Dacă te uiți pentru a obține un jurnal, vom vedea următorul text în formatul <название клавиши, введённый текст>.

    Acesta a venit la sfârșitul primului articol despre cârlige. Swing, ne uitam sursa explora de învățare.

    Descărcări