Postoji prostor za ubacivanje koda između aplikacije i njezinih vanjskih biblioteka. Činiti to nije samo po sebi loše, ali je izvrstan način da se naškodi.
Kada programeri trebaju proširiti funkcionalnost programa za koji nemaju izvorni kod, često se okreću povezivanju DLL-a. Ovo je neortodoksan način da se program natjera da učini nešto za što nije namijenjen.
Stvar je u tome što hakeri također koriste ovu tehniku iz sasvim pogrešnih razloga, kao što je korištenje bezopasnih aplikacija kao oružje ili krekiranje softvera. Dakle, što je DLL hooking, i kako ono zapravo radi?
Što je DLL?
Svaka aplikacija ovisi o nekim datotekama izvan svog osnovnog koda za pokretanje. Ove vanjske datoteke sadrže kôd i podatke koji su programu potrebni za pravilno funkcioniranje. Kada bilo koja od ovih vanjskih datoteka nestane, program može imati problema sa stabilnošću ili se izravno odbiti pokrenuti.
U operacijskom sustavu Windows te se vanjske datoteke nazivaju DLL ili knjižnice dinamičkog povezivanja. Biblioteke dinamičke veze bitne su komponente operacijskog sustava Windows, koje pružaju višekratni kod i resurse koji se mogu dijeliti u više aplikacija.
Vanjske datoteke u sustavu Windows poznate su kao biblioteke. Postoje dvije vrste biblioteka: dinamičke i statičke. Dinamičke biblioteke se učitavaju u vrijeme izvođenja, a statičke biblioteke učitavaju se u vrijeme kompajliranja. DLL je dinamička biblioteka.
Što je DLL hooking?
DLL spajanje je tehnika koja uključuje presretanje i mijenjanje poziva funkcija koje programi ili procesi upućuju na DLL. U srži postava Čovjek u sredini uspostavlja se gdje se kuka nalazi između programa i DLL-ova koje on poziva. Svi ili ciljani pozivi funkcija zatim se prate i mijenjaju.
Evo primjera tijeka rada napada za spajanje DLL-a:
- Napadač analizira pozive funkcija koje je napravio program i DLL datoteke o kojima ovisi.
- Napadač stvara kuku koristeći jednu od mnogih implementacijskih tehnika kao što su IAT hooking, inline hooking, COM hooking, itd.
- Događa se izvršavanje proizvoljnog koda.
- Izvršenje izvornog poziva funkcije može se, ali i ne mora dogoditi.
- Napadač prikriva svoje tragove brisanjem udice i vraćanjem svih učinjenih izmjena.
DLL povezivanje je sofisticirana tehnika koja se može koristiti za dobro (kao što je proširenje funkcionalnosti programa, otklanjanje pogrešaka i bilježenje) ili loše (kao što je zaobilaženje sigurnosnih mjera, krađa osjetljivih podataka, izvršavanje proizvoljnog koda i pisanje video igrica hakovi).
Kako funkcionira spajanje DLL-a?
Prije nego što se upustimo u implementaciju povezivanja DLL-a, važno je raščistiti osnove. Vratimo se korak unatrag i shvatimo što se događa kada program uputi poziv funkciji DLL-u.
Kada program poziva funkciju u DLL-u, operativni sustav prvo traži naziv funkcije tablicu adresa za uvoz programa i dobiva adresu funkcije iz DLL adrese za izvoz Stol.
Nakon što je adresa funkcije riješena, program može skočiti na adresu funkcije kako bi joj pristupio i izvršio je. DLL spajanje vrti se oko presretanja ovog procesa i preusmjeravanja poziva funkcije na drugu funkciju. Postoji nekoliko načina implementacije povezivanja DLL-a. Pogledajmo najčešće korištene tehnike za njegovu provedbu.
Ovo može biti prilično tehničko, pa bi moglo pomoći ako napredni ste Windows korisnik ili na drugi način dobro razumjeti unutarnje dijelove sustava Windows.
IAT povezivanje
IAT spajanje je učinkovita tehnika koju široko koriste autori zlonamjernog softvera kako bi zaobišli sigurnosne mjere i izbjegli otkrivanje. Tablica adresa za uvoz (IAT) je podatkovna struktura koja se učitava u memoriju kad god se kreira novi proces. IAT sadrži nazive svih uvezenih poziva funkcija i njihove memorijske adrese.
Kada program poziva funkciju u DLL-u, naziv funkcije se prvo traži u IAT-u i ako je memorijska adresa navedene funkcije nije pronađena u IAT-u, tada se uspostavlja iz adrese izvoza DLL-a Stol.
To je podatkovna struktura u kojoj su sve funkcije koje DLL eksportira preslikane na svoje memorijske adrese. U IAT povezivanju, protivnik može modificirati IAT procesa i zamijeniti legitimna mapiranja funkcija sa zlonamjernim koji na taj način ometaju planiranu operaciju i čine program proizvoljnim izvršavanjem kodirati.
Evo kako izgleda opći tijek napada u IAT povezivanju:
- Program poziva funkciju.
- Adresa funkcije nalazi se u IAT-u.
- Budući da je IAT zakačen; adresa funkcije je promijenjena i učitana je memorijska lokacija zlonamjerne funkcije.
- Program skače na mjesto zlonamjerne funkcije i izvršava proizvoljni kod.
- Na kraju se izvršava originalni poziv funkcije.
Inline Hooking
Inline hooking je tehnika spajanja DLL-a koja uključuje promjenu izvornog koda ciljne funkcije kako bi se njezino izvođenje usmjerilo na posebnu funkciju. Inline Hooking, za razliku od IAT hookinga, izravno mijenja kod ciljne funkcije, dajući napadaču precizniju kontrolu nad načinom na koji se ciljana funkcija ponaša.
Na gornjem dijagramu promatrajte kako je legitimna funkcija bila neovlašteno mijenjana da bi ukazala na zlonamjernu funkciju. Nakon što se izvrše sve instrukcije u zlonamjernoj funkciji, radi se instrukcija skoka za povratak na legitimnu funkciju kako bi završila s izvođenjem.
Protivnici koriste inline spajanje kako bi napravili trajne promjene u programu kao što je promjena parametara ili povratne vrijednosti funkcije.
Microsoftovi obilasci
Microsoft Research je razvio interni DLL paket za povezivanje, Detours. Omogućuje programerima da prate i mijenjaju pozive funkcija koje izvršava program. Zaobilaznice se mogu koristiti za različite zadatke, uključujući, ali ne ograničavajući se na: instrumentaciju, testiranje i ispravljanje grešaka.
Protivnici koriste Detours za izvođenje DLL injekcija i napada za spajanje, a programeri ga često koriste za proširenje funkcionalnosti svojih aplikacija. Više o paketu Detours možete saznati na službeni GitHub repozitorij.
Sada znate kako funkcionira DLL povezivanje
DLL spajanje je sofisticirana tehnika koja, kada se koristi iz pravih razloga, može poboljšati mogućnosti vaše aplikacije ili vam pomoći u otklanjanju pogrešaka i optimizaciji softvera. Nažalost, hooking se češće koristi kao kontradiktorna tehnika, a ne kao razvojna. Dakle, važno je da usvojite i pridržavate se najboljih sigurnosnih praksi kako biste osigurali da su vaše aplikacije sigurne i bez napada kao što su spajanje i ubacivanje.