Crearea de capcane și filtre pentru capturarea evenimentelor de pe delphi, un blog specializat de el

Odată, am avut nevoie să scriu un program pentru a crea capturi de ecran. Anume, utilizatorul selectează cu mouse-ul zona necesară pe ecran, apoi eliberează butonul și primește o captură de ecran. În acel moment, nu știam despre capcanele. De câteva zile am luptat peste sarcină, dar experimentele mele nu au dus la nimic, nu au făcut-o. După ce am citit mai multe literatură și articole și am învățat ce capcane sunt și cu ce mănâncă, am început să experimentez mai departe. Și am început cu cartea lui Mihail Flenov "Programarea în Delphi cu ochii unui hacker". La acel moment, toate lucrurile pe care trebuie să le extragă din cartea sa, mi se părea destul de ușor, dar apoi mi-am dat seama (ca în acest caz, pentru a obține experiență), care în mare măsură greșită.







Dar sa întâmplat un miracol. Am ajuns în mâinile cărții lui Yuri Revich "Tehnici de programare non-standard pe Delphi". Turning care, am fost puțin șocat, aici este ceea ce am nevoie. În loc să se fi afișat mai devreme, deoarece este necesar să transferați valori dintr-o capcană prin fișiere MAP (Memory Mapped Files) - afișarea fișierelor în memorie.

Păi, începem să scriem un spion?

Și totul este treptat ...
În sistemul de operare Microsoft Windows este numit mecanismul capcana de interceptare este 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 apoi să răspundă la evenimente și, în unele cazuri, să le modifice sau să le anuleze. Funcțiile care primesc notificări despre evenimente se numesc funcții de filtrare și diferă în funcție de tipurile de evenimente pe care le interceptează. Un exemplu este o funcție de filtrare pentru a intercepta toate evenimentele mouse-ului sau ale tastaturii. Pentru ca Windows să poată apela funcția de filtrare. această funcție trebuie instalată, adică atașată unei capcane (de exemplu, unei capcane de tastatură).

Aceasta este teoria suficientă, începem să scriem. Vom scrie un simplu keylogger. De ce simplu? Da, deoarece spionul ar trebui să intercepteze nu numai tastele apăsate, ci și să monitorizeze aplicațiile în care sunt apăsate aceste taste. De asemenea, puteți înregistra timpul de lansare al cârligului, aplicația care a avut focalizare de intrare în momentul apăsărilor de taste, etc. Dar o poți face singur.
Creați un nou proiect. Arunca TMemo și două butoane:

Crearea de capcane și filtre pentru capturarea evenimentelor de pe delphi, un blog specializat de el

Apoi declarăm constanta cu mesajul utilizatorului:

Acum trebuie să importem procedurile de pornire și eliminare a capcanei. Deși biblioteca nu este încă scrisă, dar este așa încât să nu se mai întoarcă. Adăugați următoarele linii:

În pasul următor, creați handlerele pentru butoane, iar în acestea scrieți următorul cod:

În butonul "Start", există variabile care nu au fost declarate, aceste variabile se află într-un alt modul, pe care îl vom discuta mai târziu.

Acum trebuie să scriem un handler pentru mesajul nostru personalizat. Pentru aceasta, plasați prototipul de procedură în zona privată:

Ei bine, manipulatorul în sine este atât de simplu încât nu este deloc mai ușor.

În variabila Mesaj. în parametrul Wparam. există un cod cu un identificator al cheii virtuale. Întreaga problemă este că nu putem determina prin acest cod, nu există niciun simbol în niciun registru, cu atât mai puțin aspectul tastaturii la care a fost introdus. De aceea aduc funcția GetCharFromVKey. care returnează exact simbolul pe care l-am introdus. În acesta, atât registrul, cât și aspectul sunt diferite.

Funcția însăși este numai pentru conversia cheilor prin codul lor. Prin urmare, nu ne vom ocupa de ea. Voi spune, ea recunoaste toate personajele de la A la Z, de la a la z, de la A la Z si de la a la I etc. Adică, prin înregistrare și prin aspect.







Acum trebuie să scriem un modul pentru a crea o zonă partajată partajată. Modulul se numește IniHook. cu secțiuni suplimentare de inițializare și finalizare. Creați un modul nou și denumiți-l pe IniHook. Conectăm două module: Windows și Mesaje.

Declarați un pointer la variabila THookInfo
Apoi scrieți un record THookInfo.

Apoi, declarăm două variabile:

Prin variabila DataArea vom face referire la câmpurile de înregistrare THookInfo. hMapArea va conține descriptorul obiectului fișierului "proiectat".

Apoi, în secțiunea de inițializare, numim CreateFileMapping și atribuim valoarea sa de returnare hMapArea. Apoi numim funcția MapViewOfFile și atribuim valoarea de retur variabilei DataArea. Vedeți codul sursă de mai jos:

Revizuim pe scurt funcțiile utilizate aici.
Crearea și utilizarea obiectelor de afișare a fișierelor se face prin intermediul funcțiilor API-ului Windows. Există trei funcții:

  • CreateFileMapping;
  • MapViewOfFile;
  • UnMapViewOfFile.

Puțin distras? Continuăm. Apoi, trebuie să scriem un cod în secțiunea de finalizare care elimină fișierul din memorie.

Trebuie notat aici că funcția UnMapViewOfFile trebuie apelată înaintea funcției CloseHandle. Aceasta este, în nici un caz, acest ordin nu poate fi încălcat.

Ei bine, am scris modulul, acum trebuie să fie conectat la programul principal. Rămâne pentru noi să scriem capcana însăși, care va fi localizată în bibliotecă. Între timp, vom bea cafea. Ai băut? Continuăm. Începeți un nou proiect, nu doar pentru scrierea unei aplicații, ci pentru o bibliotecă. Pentru aceasta, selectați comanda Fișier / Nou / Altele, apoi va apărea următoarea fereastră:

Crearea de capcane și filtre pentru capturarea evenimentelor de pe delphi, un blog specializat de el

Găsiți elementul Expert DLL și faceți dublu clic pe el. Și Delphi va crea un proiect de bibliotecă dinamică gol. Nu uitați să salvați imediat. Mai jos este codul sursă al bibliotecii mele:

Acum hai să vorbim despre totul în ordine. Pentru a începe, trebuie să conectați trei module: Ferestre, Mesaje, SysUtils, și unul dintre modul nostru, și anume IniHook așa că nu păstrează o copie a modulului în catalogul programului și catalogul bibliotecii am livrat la un director partajat, care conține directorul programului principal și biblioteca. Dar o puteți conecta într-un mod standard, adică prin declararea acestuia cu toate modulele, numai atunci trebuie să puneți acest modul în directorul cu biblioteca. Aceasta este deja o chestiune de gust.

Acum, ca și în programul principal, am declarat constanta WM_ReadWithHook = WM_USER + 120. pentru mesajul nostru de utilizator. Funcția KeyboardProc este operatorul pentru capcana noastră. Această funcție are trei parametri. Acum ne vom uita la ele în detaliu. Când tipul de cârlig este setat la WH_KEYBOARD. acești parametri pot avea următoarele valori:

  • nCode. Definește codul pentru utilizarea procedurii de cârlig pentru a determina modul de gestionare a mesajului. Acest parametru poate avea mai multe valori.
  • AC_ACTION - Parametrii WParam și LParam conțin informații despre tasta presată. Mesaje de alt tip pe care nu trebuie să le procesăm.
    • WParam. Definește un cod cu un identificator de chei virtuale care a generat un mesaj de tip keystroke.
    • LParam. determină numărătoarea repetată, codul de scanare, pavilonul cu cheie extinsă, codul de context, pavilionul de stare anterior al cheii și pavilionul de stare de tranziție. Acest parametru poate avea o combinație de anumite valori. Dar nu le vom lua în considerare, pentru că în cazul nostru nu oferă nici un interes.

CallNextHookEx are patru parametri:

  1. (hhk) - mânerul capcanei returnat de funcția SetWindowsHookEx;
  2. (Cod) - definește codul de interceptare;
  3. (WParam) - definește lungimea de intrare în procedura de procesare a capcanei. Valoarea acesteia depinde de tipul de capcană instalat;
  4. (LParam) - determină lungimea de intrare în procedura de procesare a capcanei. Valoarea acestuia depinde de tipul de capcană instalat.

În prezent suntem interesați de această linie de cod:

În această linie, vom trece comanda la cererea noastră, care se numește nostru mesaj personalizat handler WM_ReadWithHook = WM_USER + 120 și parametrul wParam. care conține codul cheie.

Și, la final, sun din nou funcția CallNextHookEx. Valoarea returnată a căreia trec la variabila. Am observat că aproape nimeni nu face asta. Totul funcționează. Dar în joc, de exemplu "Counter-Strike", cu capcana pornit, au existat blocuri cheie. Și după adăugarea funcției CallNextHookEx la sfârșitul handlerului nostru. totul a revenit la normal.
Procedura SetHook conține o singură linie de cod:

Aici este apelată funcția SetWindowsHookEx cârlig. Această funcție trebuie să aibă patru parametri:

  1. Tip de capcană. Specificat WH_KEYBOARD, această capcană controlează intrările de la tastatură;
  2. Un identificator care conține procedura pentru capcana;
  3. Indicatorul aplicației;
  4. Identificator de flux. Dacă parametrul este zero, atunci se utilizează cel curent.

Procedura DelHook are de asemenea o singură linie de cod:

Funcția UnhookWindowsHookEx are un singur parametru și acesta este un mâner de capcană.
Procedurile SetHook și DelHook sunt declarate exportate.
Ei bine, asta e tot. Puteți descărca versiunea demo sau sursa completă a proiectului.







Trimiteți-le prietenilor: