Zapobieganie Code Injection i Dll Injection

Posted in C++ on Grudzień 19th, 2009 by Grzonu

Dzisiaj zajmiemy się zapobieganiem Code Injection i Dll Injection.
Obie te techniki łączy wspólna rzecz – obie tworzą zdalny wątek w aplikacji. Po wywołaniu funkcji CreateRemoteThread która ma utworzyć wątek w drugiej aplikacji, wywołanie trafia do jądra, które w aplikacji w której wątek ma powstać tworzy wątek i startuje go w funkcji KiUserApcDispatcher ale jak powiedział mi j00ru nie jest bezpiecznie modyfikowac ta funkcje bo kozysta z niej bardzo wiele innych funkcji. Zamiast tego lepiej modyfikowac LdrInitializeThunk która jest później wywoływana. No wiec zalozymy sobie hooka na ta funkcje.
Pierwsze 5 bajtów nadpiszemy skokiem do naszej funkcji która zamknie nowo powstały wątek zanim kod zostanie wykonany.
Kod naszej funkcji:

1
2
3
4
5
6
void __declspec(naked)wrap(void)
{
printf("Killing thread: %d\n",GetCurrentThreadId());
TerminateThread(GetCurrentThread(),0); //zamykamy wątek
__asm ret
}

No to nadpiszmy kod funkcji.

1
2
3
4
5
6
7
8
x=GetProcAddress(GetModuleHandle("NTDLL"),"LdrInitializeThunk"); //pobieramy adres funkcji
DWORD old;
VirtualProtect(x,5,PAGE_EXECUTE_READWRITE,&old); // ustawiamy prawa do zapisu
memcpy(x,"\xE9",1); //nadpisujemy pierwszy bajt(0xE9 to jmp)
DWORD addr=(DWORD)wrap-(DWORD)x-5;//obliczamy przesuniecie naszej funkcji wzgledem orginału
//aby wykonac skok zgodnie ze wzorem offset=punkt_docelowy-miejsce_do_nadpisania-5
memcpy((char*)((char*)x+1),&addr,4);//kopiujemy tam nasz offset
VirtualProtect(x,5,old,&old);//ustawiamy spowrotem prawa

Teraz mozemy sprobowac utworzyc zdalny wątek w naszej aplikacji. Wątek utworzy się lecz zostanie odrazu zabity.
Jeśli chcemy w naszej aplikacji używać wątków powinnismy napisać funkcje która najpierw przywróci orginalne bajty następnie wywoła CreateThread po czym od nowa nadpisze skokiem. To juz pozostawiam chętnym.

Po tym zabiegu Olly także nie bedzie potrafił się attachnąć do naszego procesu.
To chyba tyle na dziś ;)

przykładowa aplikacja

//EDIT
Właśnie hxv poinformował mnie że można attachnac sie Ollym ale z uzyciem OllyAdvance :)

//EDIT2
Przygotowałem dll`ke która będzie chroniła nasza aplikację odrazu po wczytaniu jej do programu(LoadLibrary)
DLL`ka

A tak dodatkowo chciałbym podziękować Gynvaelowi Coldwindowi bo prawdopodobnie bez jego pomocy ten i kilka innych postow zakonczyloby sie po 3 wyrazach ;)

Tags: , , , ,