programatori de sistem care lucrează sub MS DOS, își amintește tehnologia capcana de interceptare care vă permite să preia controlul de aproape toate procesele care au avut loc în sistemul de operare preferat.
Care este „interceptarea API-funcții“
Luați în considerare două metode de interceptare API funcții:
Metoda API 1. Interceptare intrării directe în codul funcției sistemului.
Recepția este la partea de sus a funcției de scriere interceptate comanda JMP vasha_funktsiya_dvoynik sau echivalent. Suprascris bytes dorit salva pe undeva. După apelarea controlul aplicării funcției corectate vor fi transmise la funcția. Acesta trebuie să proceseze corect stiva, adică, eliminarea parametrilor transmiși-l, și să efectuați acțiunile necesare. Apoi, dacă ai de gând să apela funcția inițială, este necesar pentru a restabili octeții blocate la începutul funcției inițiale. Sună-l, trecând toți parametrii necesari. După revenirea din funcția inițială, este necesar, din nou, la partea de sus a codului de funcție pentru a înregistra echipa de tranziție pe funcția. Întoarcere controlul programului de asteptare.
Avantajul acestei metode este că vă permite să intercepteze orice funcție, nu numai pentru cele care sunt enumerate în tabelul de import.
Defect în aplicații multithreaded poate fi o situație în care un fir de-a chemat interceptat funcție, de control a fost trecut la funcția de-dublu, ea a restaurat la începutul inițială a funcției, dar în acest moment un fir paralel a făcut un apel la aceeași funcție. Ca rezultat, se trece la funcția inițială direct, ocolind :( ta.
Să examinăm un exemplu de program (un fișier DLL), prin interceptarea funcția MessageBoxA 1.
Pentru munca, avem nevoie de următoarele antete:
Punerea în aplicare a codului într-un alt proces pe Windows NT
Acum trebuie să arătăm cum DLL de mai sus pot fi implementate într-un proces ales ca victimă experiment. (Trebuie amintit că procesul de victime trebuie să aibă ferestre cu mesaje MessageBox standard pentru exemplul nostru).
2. Folosiți cârlige.
Punerea în aplicare 1
Luați în considerare cele mai eficiente, în opinia noastră, metoda de punere în aplicare - mai întâi. El este o scurtă secțiune a codului mașinii în procesul de înregistrare a memoriei, care este de a conecta DLL în procesul, executați codul, după care dll poate efectua orice acțiune în numele acestui proces. În principiu, nu vă puteți conecta DLL, și să pună în aplicare acțiunile necesare în codul nativ de punere în aplicare, dar ar fi prea consumatoare de timp sarcină, deoarece toate compensate de date devin lipsite de sens, și nu puteți corecta pentru a se referi la ele, nu sunt configurate corect părtinire (confuzie :( ).
La punerea în aplicare această metodă, trebuie să vă spun compilatorului pentru a alinia structura octet. În caz contrar, cu structura de cod nativ va conține un cod complet greșit, care a fost planificat.
Schema generală a punerii în aplicare:
- proces deschis (OpenProcess).
- Evidențiați în memoria lui (VirtualAllocEx - disponibil numai pentru WinNT).
- Notați codul injectat în memorie (WriteProcessMemory).
- Executați-l (CreateRemoteThread).
Pus în aplicare de cod nativ ar trebui (în cazul nostru), pentru a face astfel de pași:
- apelați LoadLibrary - apel LoadLibrary funcția de kernel32.dll pentru a descărca Alăturați-vă biblioteca (unul din Parsed de mai sus).
- Apel ExitThread - apel în funcție de ExitThread Kernel32.dll pentru completarea corectă a acestui flux.
Mai jos este un exemplu al unei proceduri de punere în aplicare a dll specifica un nume într-un proces cu un PID dat (ID de proces) (care poate fi văzut în tab-ul „procese“ task manager sau obținut folosind API funcții standard).
Introducerea 2
A doua metodă de punere în aplicare a codului executabil (prin cârlige) Cel mai simplu de utilizat. Ea se bazează pe tehnologia cârlige, și anume: dacă setați cârligul pe un flux de un alt proces, imediat ce firul va primi un mesaj care corespunde unui anumit tip de cârlig, sistemul se va conecta automat DLL c cârlig în proces. Dezavantajul acestei metode este că nu se poate încorpora DLL într-un proces care nu are o coadă de mesaje. Acest DLL va fi atașat la proces altor oameni numai atâta timp cât programul este lansat, care a stabilit cârlig. După finalizarea acestui program, dll va fi dezactivat automat. Prima metodă este lipsită de astfel de defecte.
Pe de altă parte, prima metodă va funcționa doar în WinNT, din cauza funcției VirtualAllocEx utilizare care rezervă o memorie predeterminată (diferită de cea în care apelul la această funcție) proces. Teoretic, această problemă poate fi rezolvată, dacă ați scrie codul pentru a afișa unele dintre exe-fișier al unui alt proces, cum ar fi antetul DOS, care nu este utilizat după pornirea. Dar sistemul de operare nu permite întotdeauna să scrie în zona de memorie, chiar dacă încercați să schimbați permisiunile folosind VirtualProtextEx.
Există o a treia metodă de punere în aplicare, dar este cel mai periculos, deoarece aceasta poate duce la un accident de sistem. Cu această metodă, sistemul de operare se implementează DLL-ul specificat la toate, fără excepție, care funcționează procesele de sistem, chiar și protejate. Pentru punerea în aplicare, este necesar să se înregistreze în registrul pe drum HKEY_LOCAL_MACHINE \ Software \ Microsoft \ WindowsNT \ CurrentVersion \ Windows în AppInit_DLLs cheie calea completă către dll dumneavoastră.
Cum de a depana astfel de truc
Cei mai mulți programatori pentru a depana programele lor utilizează debuggeri încorporate compilatoare. Ele sunt ușor de utilizat și de cele mai multe cerințe pentru îndeplinește depanare. Dar dacă unele cod vor fi puse în aplicare și executate într-un alt, un proces străin încorporat în depanator de a utiliza foarte dificil. În acest scop, este convenabil să se aplice SoftIce sistemului depanator, care este încărcat înainte de sistemul de operare funcționează în ring zero și, prin urmare, are acces la toate obiectele OS. Discutați despre cum să depana codul de încorporat, care îndeplinește funcțiile de interceptare API-ului într-un proces străin.
Toate tipurile de depanare pot fi împărțite în 3 grupe:
- Codul Debugging bootloader (în limbaj de asamblare), care, fiind implantat într-un alt proces este executat ca un flux separat și acordă dll în numele procesului.
- Funcții Debugging efectuate la începutul dll. De obicei, această funcție că funcțiile de cod de înlocuire în API-corp-funcția de omologul său de control al transmisiei.
- Debugging funcții, gemeni care obține controlul asupra apelului interceptat API-funcții.
Debugging codul de boot loader
Deci, există două procese:
- Un proces care injecteaza cod. Am nota cu P1.
- Procesul, în care pune în aplicare codul. P2 Denotă.
Funcții Debugging efectuate la începutul DLL
În exemplul de bibliotecă această funcție InterceptFunctions intercpt.dll, care este numit de la biblioteca de aderare DllMain și efectuează procesul funcțiilor de interceptare.
În primul rând, aveți nevoie pentru a compila biblioteca cu informații de depanare, care, în viitor, se va folosi SoftIce pentru a afișa instrucțiuni în C. MS Visual C se face acest lucru: Proiect-> Setări-> lista C / C ++ Debug Info - este necesar pentru a selecta tipul de informații caracter - baza de date cu program pentru Editare si continua, precum și Proiect-> Setări-> Link-ul lista Categorie -> depanare, setați informațiile de depanare caseta de selectare și selectați formatul de informații de depanare, cum ar fi formatul Microsoft.
Alternativa - puteți seta pur și simplu tipul de configurație a proiectului, cu toți parametrii pentru informațiile de depanare vor fi instalate automat. Acest lucru se face acest lucru. Build-> Set de configurare active -> Win32 Debug.
Acum puteți începe să utilizați SoftIce. În primul rând trebuie să descărcați informațiile simbolul depanator de la acest dll, în timp ce ea este încă încărcat DLL-ul nu va. Informațiile simbol necesare mai târziu pentru a seta puncte de întrerupere și de reprezentare cod în limbaj de nivel înalt. Acest lucru se face prin utilitate Simbol Încărcător inclus cu SoftIce.
Trebuie să deschideți mai întâi un modul dll (element Dosar-> Deschideți Module).
Apoi, trebuie să-l încărcați în debugger (modulul -> Load). După finalizarea cu succes a tuturor acestor operații din ecranul Simbol Loader ar trebui să fie ceva de genul:
Vom începe șeful. Este necesar să se stabilească un punct de întrerupere asupra funcției InterceptFunctions de la dll, în timp ce ea dll nu este încă conectat la proces! Rulați SoftIce. Crearea unui punct de întrerupere pe nume simbolice:
Funcții Debugging - gemeni care primesc un management apel interceptat funcții API
În primul rând trebuie să descărcați informațiile simbol al interceptării dll.
În acest exemplu intercpt.dll.
În utilitarul Symbol Loader selectați Fișier> Deschidere Module, apoi, în module-> meniul de încărcare, încărcați informația simbolică în debugger. Dll nu este încă conectat la orice proces.
Mai mult, cunoscând numele funcțiilor gemene stabilit un punct de întrerupere pe numele funcției. De exemplu, funcția de dublu-Intercept_MessageBoxA, care va fi numit de fiecare dată când are loc o provocare funcție MessageBoxA a programului. Am stabilit un punct de întrerupere pe ea - în fereastra de tip depanator: BPX Intercept_MessageBoxA.
Acum intercpt.dll poate fi conectat la orice proces.
Atunci când acest proces va determina funcția MessageboxA coroiat, de control va fi trecut la funcția și de a lucra Intercpt_MessageBoxA breakpoint.
testarea
Pentru a încerca toate cele de mai sus, în primul podyschu pe computer orice aplicație care are în componența sa MessageBox tipul de fereastră de mesaje. aplicație experimentală scrisă de către noi înșine, este numit MESS.EXE și afișează una după celelalte trei casete de mesaj, din care colaj este prezentat mai jos:
În continuare, exemple de compilare a introdus DLL, așa cum este descris mai sus. Rezultatul compilării am sunat la METOD1.DLL și METOD2.DLL.
Compile exemplu procedurilor de implementare DLL în procesul de cod extern. Pentru efectuarea acestei proceduri, este necesar să se adauge codul modulului principal de program, ceva de genul:
Când executați acest program (numesc ATTACH .EXE) ca parametri va trebui să specificați ID-ul de proces, pe care le introducem codul lor, și numele DLL pe care doriți să atașați la un proces extern.
Copiați toate cele trei primite modul METOD1.DLL, METOD2.DLL, ATTACH .EXE într-un singur director (de exemplu, C: \ test \). Acum puteți începe testarea.
Rulați programul victima (în acest caz MESS.EXE). Deschideți Task Manager și pentru a vedea dacă procesul de rulare (mess.exe):
și de a determina PID acestuia (în cazul nostru egal mess.exe PID 1076).
Acum, de la linia de comandă, executați implementarea programului de primul cod de DLL:
Ca urmare, atunci când încercați să apelați fereastra MessageBox MESS.EXE programul pe care îl va primi aceeași imagine:
Funcția API Interceptare a avut loc!
concluzie
„Nu este atât de diavol ca program de MicroSoft ...“ Cu toate acestea, în cazul în care cititorul este trecut cu grijă prin el însuși materialul a declarat, am văzut că, ca de obicei, toate genial - doar. Și chiar un astfel de lucru ca o interceptare API în Windows NT, nu necesită un cod software sofisticat și pot fi puse în aplicare la prima solicitare.