Hook-faq la detectarea modalități noi și vechi de instalare cârlige de sistem
Doriți să devină Lordul Întunericului a calculatorului? Vrei să știi toate secretele dezvoltatorilor de malware și software antivirus? Citiți articolul, medita, a învățat elementele de bază ale Zen, și așa să vină peste tine perspectivă (toate cu calm, știind Tao și perforație Shambalei, ca urmare a citirea acestui articol, editorii nu pot fi garantate. - nn)!
Care este cârlig (cârlig - cârlig, ing.)? Acesta este un mecanism care vă permite să urmăriți un eveniment în sistemul de operare. Acesta a fost dezvoltat unchii de la Microsoft cu cele mai bune intenții - pentru a permite programator pentru a rezolva mai eficient problemele lor prin instalarea de control asupra evenimentelor tastaturi, mouse și multe altele. El a realizat cu ajutorul unor funcții bine cunoscute: SetWindowsHook (Ex), UnhookWindowsHook (Ex) și CallNextHook (Ex).
Hook este folosit pentru a intercepta anumite evenimente înainte ca acestea să ajungă la aplicarea. Această funcție poate răspunde la evenimente, și, în unele cazuri, să modifice sau să le aruncați. Funcțiile de la primirea notificării de evenimente numite „funcții de filtrare ale“ lor și diferă în tipurile de evenimente interceptate. Exemplu - economisind filtru funcție pentru a captura toate evenimentele mouse și tastatură. Așa că Windows ar putea duce la funcția de filtrare, această funcție trebuie să fie setată, adică, atașat la cârlig (de exemplu, o tastatură). Atașarea unuia sau a mai multor funcții de filtrare pentru a kakomunibud Hook se numește setarea cârlig. Î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.
De-a lungul timpului, conceptul de nobil cârlig motivul pervertită de ce creatorii de viruși au devenit acțiuni și malvarschikov. Primii viruși au fost, cum să spun ... naiv, cred. Ei au fost un separat exe-fișier de asteptare direct funcția dorită a sistemului. Pe măsură ce timpul a continuat și antivirus, care a apărut mai târziu, și dintr-o dată a devenit comercial, mai degrabă învățate prinde rapid viruși pe semnături prin simpla scanare a spațiului de memorie sau de pe disc.
Și este aici că, în căldura eterna lupta dintre scriitori virus și „pescari“ a primit o întrebare, care se află pe ordinea de zi până în prezent și va fi în viitorul apropiat, fără margini - o chestiune de supraviețuire în sistemul de operare. Mai mult decât atât, este de asemenea relevant pentru anti-virus, deoarece pentru un sistem bun programator scris viruși / rootkit, face procesul de sistem anti-virus - nu prea provocator.
Prin urmare, putem spune cu siguranță că una dintre sarcinile anti-virus - este abilitatea de a salva integritatea procesului și de securitate din acțiunile virusului rău intenționate. În general, până în prezent, acesta trebuie înțeles în conformitate cu instalarea cârligele de control asupra sistemului de bază al funcțiilor sistemului de operare care afectează viabilitatea oricărui program de - este, de obicei, cu privire la funcțiile de lucru cu procese, fire, rețea și Internet, etc.
„Și cum SetWindowsHook» -? Mă întrebi pe mine. „Secolul trecut“ - Voi răspunde. Utilizați-le pentru o lungă perioadă de timp nu mai este kosher.
Ce avem?
Apoi, trebuie să creați o funcție proxy, un fir de păr cauzate de repetarea ceva de genul:
int MyNewFunction (void * param1,
int param2, bool param3)
reveni OriginalFunction (param1,
param2, param3);
>
Dacă aveți nevoie pentru a apela o funcție pentru a intercepta, înainte de a este necesară înlocuirea să mențină bytes inițiale și înainte de apelul de a le restaura. Dezavantajul acestei metode este după cum urmează: în cazul în care, după începutul funcției de recuperare a fost un comutator de context, la un alt fir de aplicație, el poate apela funcția, care trece separatorului. Acest dezavantaj poate fi eliminat prin oprirea tuturor cererilor de fluxuri secundare înainte de a apela și să fie difuzate după apel. Și, desigur, despicare, ca o funcție proxy este, de asemenea, ușor de detectat prin scanarea memoriei, așa cum va fi imediat evident că apelul funcției este în altă parte.
În general, privind în perspectivă, trebuie să ne transmită publicului că aproape toate metodele de a intercepta apeluri de funcții de scanare de memorie, oricum detectiv. Cu excepția celor două metode, dar mai mult pe asta mai târziu.
IAT, EAT și alte animale
Așa cum am scris mai sus, principalul dezavantaj al metodelor de mai sus de interceptare - este necesară o modificare a memoriei, ceea ce duce în mod inevitabil la detectiv de la Avery. Există o cale de ieșire? Destul de ciudat, există. Chiar și doi. Prima dintre ele - este de a înregistra manipulant dvs. excepție, apoi asigurați-vă că a primit de control. Acest lucru se poate face, de exemplu, pierderea de o bucată de memorie. A doua metodă este ușor modificată mai întâi. Adică, ești, ca și mai înainte, înregistrați un handler excepție, ci pentru a le genera utilizați o tehnică cunoscută printre debugger. După cum știți, debagregistry procesor utilizat pentru aplicații de depanare și sunt disponibile, de obicei, de la kernelmoda. Cu toate acestea, ele pot fi instalate și yuzermodnyh aplicațiilor prin utilizarea funcțiilor / SetThreadContext GetThreadContext. Registrele Debug sunt utilizate pentru a stabili punctele de întrerupere () pentru acces Valorile critice la o porțiune de memorie sau de performanță.
Un total de opt registre, scopul lor, după cum urmează:
Deci, tot ce trebuie să faceți - este de a stabili breakpoint hardvarnogo (breakpoint hardware, alias int 1), la începutul funcției pe care procesorul a generat așa-numitul „-un singur pas excepție» (excepție singură etapă), și apoi prin setarea handler de excepție: AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_ HANDLER) DebugHookHandler), să profite de această foarte EXCEPTION_SINGLE_STEP.
Când este handler de generare devine controla funcția dorită. Un avantaj incontestabil al astfel de metode este că acesta este complet nedetectabil prin scanarea memoriei, deoarece nu este nici o modificare apare.
int SetDebugBreak (FARPROC adresă)
Stare int = -1;
MÂNER thSnap = CreateToolhelp32Snapshot (
TH32CS_SNAPTHREAD, NULL);
THREADENTRY32 te;
te.dwSize = sizeof (THREADENTRY32);
Thread32First (thSnap, te);
face
în cazul în care (te.th32OwnerProcessID! = GetCurrentProcessId ())
continua;
MÂNER hThread = OpenThread (
THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
CTX CONTEXT;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext (hThread, ctx);
if (! ctx.Dr 0)
ctx.Dr0 = MakePtr (ulong, adresa, 0);
ctx.Dr7 | = 0x00000001;
status = 0;
>
else if (! ctx.Dr1)
ctx.Dr1 = MakePtr (ulong, adresa, 0);
ctx.Dr7 | = 0x00000004;
status = 1;
>
else if (! ctx.Dr2)
ctx.Dr2 = MakePtr (ulong, adresa, 0);
ctx.Dr7 | = 0x00000010;
status = 2;
>
else if (! ctx.Dr3)
ctx.Dr3 = MakePtr (ulong, adresa, 0);
ctx.Dr7 | = 0x00000040;
status = 3;
>
altfel
status = -1;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
SetThreadContext (hThread, ctx);
CloseHandle (hThread);
>
în timp ce (Thread32Next (thSnap, te));
a reveni starea;
>
concluzie
După cum puteți vedea, chiar și în situațiile cele mai dificile, puteți găsi o cale de a executa codul. Sunt sigur că, în acest caz, codul vizează în mod exclusiv rezolvarea problemelor de protecție a sistemului. Mult noroc și au o compilație frumos!