Bună, Delphi'sty și simpatizează cu ei. Bine ați venit la următorul articol pentru manechine. Astăzi vă voi spune cum să interceptați funcțiile API. Prin interceptarea funcțiilor API, mărim capacitățile noastre și le limităm doar imaginația noastră. Pentru a citi acest articol cu beneficiul maxim, totuși, cunoașterea inițială a programării la nivel scăzut și cunoașterea arhitecturii Windows.
Astăzi vă voi spune cea mai eficientă tehnică pentru interceptarea funcțiilor API - splicing. Îmbinarea este o înlocuire a codului funcției. Desigur, există o altă metodă de a intercepta acest lucru prin editarea tabelului de import al aplicației. O să-ți spun în ordine.
Când scrieți în cererea dvs. așa
Și când apelați o funcție, este Push. împinge. apelați dword ptr $ 00405F56
Dacă faceți din nou această formulă, va arăta așa
Acum, de fiecare dată când funcția este chemată, vom trece întotdeauna controlul la mâna noastră. Și cum să numim acum funcția inițială. Când setați interceptarea, trebuie să stocăm primii 5 octeți ai funcției. Pentru a apela originalul, trebuie să restaurați funcțiile și să-l sunați, apoi să restabiliți interceptarea. Declarați structura în care vom stoca primele 5 octeți ale funcției:
câmp Adresa este, de fapt, în care nu este nevoie de această structură (doar nu este ceea ce), dar, cu toate acestea, este mai convenabil pentru a trage interceptarea, atunci va înțelege de ce acest domeniu este necesar. Să numim această structură o "punte" la vechea funcție.
Acum scrieți funcția care va stabili interceptarea:
Mai întâi setăm atributele de acces la codul funcției astfel încât să poată fi suprascris. Apoi calculați valoarea pentru salt. Mai întâi, stocăm începutul funcției în înregistrare, apoi rescrieți începutul funcției. În final, am setat atributele vechi de acces. Acum scrieți o funcție care va lua interceptarea:
Acum scrieți o funcție care va seta interceptarea prin numele funcției. Cred că nici nu este prea complicat.
Mergem mai departe. Funcțiile descrise mai sus pot intercepta funcții numai în procesul curent. Și cum interceptăm funcțiile în alte procese. Cea mai simplă metodă este de a lipi funcția interceptor în DLL și funcția de cod bibliotecă pentru a instala interceptarea, dacă DLL este încărcat în proces și elimina interceptarea, în cazul în care acesta este descărcat. Există o altă problemă: cum să facă un alt proces pentru a descărca DLL'ku nostru. Soluția cea mai simplă este crearea de fire la distanță. Acum e totul în ordine.
Un thread remote este creat de funcția CreateRemoteThread.
Funcția flux trebuie să aibă următoarele atribute
De-a lungul drumului, probabil WINAPI este un stdcall, nu conteaza ce inseamna, trebuie sa fie declarat ca stdcall. Pentru o funcție, un singur parametru este un indicator normal. Acum, să analizăm situația: Credem: Brainwave: Funcția LoadLibraryA are aceleași atribute. Este nevoie de un pointer la primul caracter al numelui fișierului DLL (șirul ar trebui să se încheie cu un caracter # 0). Prin urmare, funcția LoadLibraryA este potrivită pentru ca aceasta să funcționeze ca o funcție de flux. Deoarece are nevoie de un pointer la un șir în procesul său, va trebui să ne scriem șirul și numele DLL-ului în memoria procesului altcuiva. Acest lucru se face prin funcția WriteProcessMemory. Iată descrierea ei
Deci, ne-am încărcat DLL-ul în procesul altcuiva. De fapt - injecteaza codul său este o altă poveste și necesită scris un articol separat. Uneori, procesul nu este permis să se schimbe procesele sistemului de memorie, cum ar fi winlogon.exe, lsass.exe, smss.exe, csrss.exe și altele. Acest lucru necesită SeDebugPrivilege privilegiu în modulul de sursă pentru a intercepta API funcție este o funcție EnableDebugPrivilege care include acest privilegiu pentru curentul proces.
Pentru a seta interceptarea funcțiilor API în toate procesele (în toate procesele GUI) este suficient doar să încărcați DLL-ul nostru. Este suficient să scrieți acest cod:
În arhiva sursă există un modul cu funcții de cârlig API. Există toate funcțiile pe care le-am folosit și le-am descris astăzi.
Aici, poate și totul pentru ziua de azi. În arhivă, există și un exemplu de ascundere a procesului lsass.exe.