Hook-често задавани въпроси на откриване на нови и стари начини за инсталиране на системата куки

Искате ли да станете Тъмния Лорд на компютъра? Искате ли да знаете всички тайни на злонамерен софтуер и антивирусни софтуерни разработчици? Прочетете статията, медитира, научили основите на Дзен, и така дойде върху вас прозрение (всички спокойно, знаейки, Тао и перфорация на Шамбала, в резултат на четене тази статия, редакторите не могат да бъдат гарантирани - Ред.)!

Каква е кука (кука - куката, инж.)? Това е механизъм, който ви позволява да следите на едно събитие в операционната система. Тя е разработена от Microsoft чичовци с най-добри намерения - да се даде възможност на програмиста да по-ефективно решаване на техните проблеми чрез инсталиране на контрол върху събитията клавиатури, мишки и др. Той реализира с помощта на добре познатите функции: SetWindowsHook (Ex), UnhookWindowsHook (Ex) и CallNextHook (Ex).

Хук се използва за да прихванат определени събития преди те да достигнат заявлението. Тази функция може да се отговори на събития, както и, в някои случаи, да променяте или да ги отхвърлите. Функциите на получаване на уведомлението от събития, наречени "филтриращи функции на" тях и се различават по видовете събития прихванати. Пример - спестяване функция филтър, за да се изравнят всички събития мишка и клавиатура. Така че това може да доведе до Windows функцията филтър, тази функция трябва да бъде зададен, тоест, прикрепен към Hook (например клавиатура). Прикаченият файл от един или повече филтриращи функции за kakomunibud Хук се нарича настройка на куката. Ако някой е свързан Hook няколко филтриращи функции, Windows изпълнява всички функции, както и функцията прикрепен последно, той се появява в началото на опашката, и най-първата характеристика - в края.

С течение на времето, на понятието за благородния кука извратен причина авторите на вируси са станали действия и malvarschikov. Първите вирусите са, как да кажа ... наивни, предполагам. Те бяха отделна Търсейки-файл директно се обадите на желаната функция на системата. С течение на времето и антивирусни, които се появяват по-късно, и изведнъж станаха търговски поуки доста бързо хвана вируси на подписи, като просто сканиране на памет или дисково пространство.

И именно тук, в разгара на вечната борба между авторите на вируси и "рибари" имам един въпрос, който е на дневен ред в момента и ще бъде в близко бъдеще, безгранична - въпрос на оцеляване в операционната система. Освен това, тя също е от значение за анти-вирус, тъй като в продължение на една добра система за програмист писане на вируси / руткитове, правят процеса на антивирусна система - не е твърде предизвикателна.

Ето защо, можем спокойно да кажем, че една от задачите на анти-вирус - е възможността да запазите целостта и сигурността на процеса от злонамерени действия на вируси. Като цяло, към днешна дата, това трябва да се разбира под инсталацията на куки на контрол върху основната система от функциите на операционната система, които оказват влияние върху жизнеспособността на всяка програма - това обикновено е за функциите за работа с процеси, конци, мрежа и интернет, и т.н.

"И как SetWindowsHook» - питате мен. "Миналия век" - ще отговоря. Използвайте ги, за дълго време вече не е кошер.

Какво имаме?

След това трябва да се създаде функция пълномощник, на косъм, причинени от повтаряне на нещо като това:

вътр MyNewFunction (нищожен * param1,
Int param2, BOOL param3)
върнете OriginalFunction (param1,
param2, param3);
>

Ако трябва да извикате функция да се намеси, преди замяната е необходимо да се запазят първоначалните си байта и преди разговора, за да ги възстановите. Недостатък на този метод е, както следва: ако след началото на функцията за възстановяване е превключване на контекста, към друго приложение конец, той може да извика функцията, минавайки прехващач. Този недостатък може да се премахне чрез спиране на всички странични потоци приложения, преди да се обадите и да текат след повикването. И разбира се, снаждане, като функция на прокси е също лесно се открива чрез сканиране на паметта, тъй като веднага ще бъде ясно, че извикването на функция е някъде другаде.

Като цяло, гледайки напред, ние трябва да покаже на хората, че почти всички методи, за да прихване извиквания на функции за сканиране на паметта, така или иначе детектив. С изключение на двата метода, но повече за това по-късно.

IAT, да се хранят и други животни

Както пише по-горе, основният недостатък на посочените по-горе методи за прихващане - е необходима модификация на паметта, което неизбежно води до детективска си от Avery. Има ли изход? Странното е, че има. Дори две. Първият от тях - е да се регистрирате изключение манипулатор, а след това се гарантира, че той е получил контрол. Това може да стане, например, загубата на парче памет. Вторият метод е леко променена, на първо място. Това означава, че си ти, както и преди, като се регистрирате изключение манипулатор, но за да ги генерира използвате техника, известна сред дебъгерите. Както знаете, debagregistry на процесор се използва за отстраняване на грешки приложения и са на разположение, обикновено от kernelmoda. Въпреки това, те могат да бъдат инсталирани и yuzermodnyh на приложения чрез използване на GetThreadContext / SetThreadContext функции. Debug регистри се използват за определени точки на прекъсване (гранични стойности) за достъп до част от паметта или изпълнение.

Общо осем регистри, тяхната цел, както следва:

Така че, всичко което трябва да направите - е да се създаде hardvarnogo точка на прекъсване (хардуер прекъсване, известен още като вътр 1) в началото на функцията, че процесорът е генерирала така наречената "едноетапно изключение» (една стъпка изключение), и след това, като зададете изключение манипулатор: AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_ манипулатор) DebugHookHandler), за да се възползват от това много EXCEPTION_SINGLE_STEP.

Когато е манипулатор вашето поколение получава контролира желаната функция. Несъмнено предимство на този метод е, че е напълно неоткриваеми чрез сканиране на паметта, тъй като не е модификация настъпва.

вътр SetDebugBreak (FARPROC адрес)
Int статус = 1;
ДРЪЖКА thSnap = CreateToolhelp32Snapshot (
TH32CS_SNAPTHREAD, NULL);
THREADENTRY32 ТЕ;
te.dwSize = sizeof (THREADENTRY32);
Thread32First (thSnap, ТЕ);
правя
ако (te.th32OwnerProcessID! = GetCurrentProcessId ())
продължи;
ДРЪЖКА hThread = OpenThread (
THREAD_ALL_ACCESS фалшиво, te.th32ThreadID);
Контекст CTX;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext (hThread, CTX);
ако (! ctx.Dr 0)
ctx.Dr0 = MakePtr (ULONG, адрес, 0);
ctx.Dr7 | = 0x00000001;
статус = 0;
>
иначе, ако (! ctx.Dr1)
ctx.Dr1 = MakePtr (ULONG, адрес, 0);
ctx.Dr7 | = 0x00000004;
статус = 1;
>
иначе, ако (! ctx.Dr2)
ctx.Dr2 = MakePtr (ULONG, адрес, 0);
ctx.Dr7 | = 0x00000010;
статус = 2;
>
иначе, ако (! ctx.Dr3)
ctx.Dr3 = MakePtr (ULONG, адрес, 0);
ctx.Dr7 | = 0x00000040;
статус = 3;
>
още
статус = 1;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
SetThreadContext (hThread, CTX);
CloseHandle (hThread);
>
докато (Thread32Next (thSnap, ТЕ));
върне статус;
>

заключение

Както можете да видите, дори и в най-трудните ситуации, можете да намерите начин да се изпълни кода си. Сигурен съм, че в този случай кодът Ви е насочена изключително към решаване на проблемите за защита на вашата система. Успех и имат хубава компилация!