Det finns utrymme att injicera kod mellan en applikation och dess externa bibliotek. Att göra det är inte dåligt i sig, men det är ett bra sätt att göra skada.
När utvecklare behöver utöka funktionaliteten för ett program som de inte har källkoden för, vänder de sig ofta till DLL-hooking. Detta är ett oortodoxt sätt att få ett program att göra något det inte är avsett att göra.
Saken är att hackare också använder den här tekniken av alla fel anledningar, som att använda ofarliga applikationer med vapen eller att knäcka programvara. Så vad är DLL-hooking, och hur fungerar det egentligen?
Vad är en DLL?
Varje applikation är beroende av att vissa filer utanför baskoden körs. Dessa externa filer innehåller kod och data som ett program behöver för att fungera korrekt. När någon av dessa externa filer försvinner kan programmet ha stabilitetsproblem eller direkt vägra att köra.
I Windows operativsystem kallas dessa externa filer DLL eller dynamiska länkbibliotek. Dynamiska länkbibliotek är viktiga komponenter i Windows-operativsystemet, och tillhandahåller återanvändbar kod och resurser som kan delas mellan flera applikationer.
Externa filer på Windows kallas bibliotek. Det finns två typer av bibliotek: dynamiska och statiska. Dynamiska bibliotek laddas vid körning och statiska bibliotek laddas vid kompilering. DLL är ett dynamiskt bibliotek.
Vad är DLL Hooking?
DLL-hooking är en teknik som inkluderar att fånga upp och ändra funktionsanrop som program eller processer gör till en DLL. Väsentligen en Man-in-The-Middle-inställning etableras där en krok sitter mellan ett program och de DLL-filer som det anropar. Alla eller riktade funktionsanrop spåras sedan och ändras.
Här är ett exempel på ett arbetsflöde för DLL hooking attack:
- Angriparen analyserar funktionsanropen som görs av programmet och de DLL-filer som det beror på.
- Angriparen skapar en hook med hjälp av en av de många implementeringsteknikerna som IAT hooking, inline hooking, COM hooking, etc.
- Godtycklig kodexekvering sker.
- Ursprungligt funktionsanropskörning kan hända eller inte.
- Angriparen döljer sina spår genom att ta bort kroken och återställa alla gjorda ändringar.
DLL-hooking är en sofistikerad teknik som kan användas både för gott (som att utöka programfunktionalitet, felsökning och loggning) eller för dåligt (som att kringgå säkerhetsåtgärder, stjäla känslig data, exekvera godtycklig kod och skriva videospel hackar).
Hur fungerar DLL Hooking?
Innan du börjar implementera DLL-hooking är det viktigt att reda ut grunderna. Låt oss ta ett steg tillbaka och förstå vad som händer när ett funktionsanrop görs till en DLL av ett program.
När ett program anropar en funktion i en DLL, letar operativsystemet först upp funktionens namn i programmets importadresstabell och hämtar funktionens adress från DLL: ns exportadress Tabell.
När adressen till funktionen är löst kan programmet hoppa till funktionens adress för att komma åt och köra den. DLL-hooking kretsar kring att avlyssna denna process och omdirigera funktionsanropet till en annan funktion. Det finns flera sätt att implementera DLL-hooking. Låt oss titta på de mest använda teknikerna för att implementera det.
Detta kan bli ganska tekniskt, så det kan hjälpa om du är en avancerad Windows-användare eller på annat sätt ha en god förståelse för Windows interna funktioner.
IAT Hooking
IAT-hooking är en effektiv teknik som ofta används av skadlig programvara för att kringgå säkerhetsåtgärder och undvika upptäckt. Importadresstabellen (IAT) är en datastruktur som laddas in i minnet när en ny process skapas. IAT innehåller namnen på alla importerade funktionsanrop och deras minnesadresser.
När ett program anropar en funktion i DLL: n, söks funktionsnamnet först efter i IAT och om minnesadressen för nämnda funktion inte hittas i IAT, då den upprättas från DLL: s exportadress Tabell.
Det är en datastruktur där alla funktioner som exporteras av DLL: n mappas till deras minnesadresser. I IAT-hooking kan en motståndare modifiera IAT för en process och ersätta legitima funktionsmappningar med skadliga sådana som på så sätt stör den avsedda operationen och gör att programmet körs godtyckligt koda.
Så här ser det allmänna attackflödet i IAT-hooking ut:
- Ett program gör ett funktionsanrop.
- Funktionsadressen finns i IAT.
- Sedan IAT har varit ansluten; funktionsadressen har ändrats och minnesplatsen för en skadlig funktion laddas.
- Programmet hoppar till platsen för den skadliga funktionen och godtycklig kod exekveras.
- Slutligen exekveras det ursprungliga funktionsanropet.
Inline Hooking
Inline hooking är en DLL hooking teknik som innebär att en målfunktions källkod ändras för att styra dess exekvering till en speciell funktion. Inline Hooking, i motsats till IAT-hooking, ändrar målfunktionens kod direkt, vilket ger angriparen mer exakt kontroll över hur målfunktionen beter sig.
I diagrammet ovan, observera hur den legitima funktionen har manipulerats för att peka på en skadlig funktion. När alla instruktioner i den skadliga funktionen har utförts, görs en hoppinstruktion för att återgå till den legitima funktionen för att den ska slutföra exekveringen.
Motståndare använder inline hooking för att göra varaktiga ändringar i ett program som att ändra parametrarna eller returvärdet för en funktion.
Microsoft Omvägar
Microsoft Research har utvecklat ett internt DLL-hooking-paket, Detours. Det gör det möjligt för programmerare att spåra och ändra funktionsanrop som görs av ett program. Omvägar kan användas för en mängd olika uppgifter, inklusive men inte begränsat till: instrumentering, testning och buggfixning.
Motståndare använder Detours för att utföra DLL-injektion och hooking-attacker, och utvecklare använder det ofta för att utöka funktionaliteten i sina appar. Du kan lära dig mer om paketet Omvägar på officiellt GitHub-förråd.
Nu vet du hur DLL Hooking fungerar
DLL-hooking är en sofistikerad teknik som, när den används av rätt anledningar, kan öka kapaciteten hos din applikation eller hjälpa dig att felsöka och optimera programvara. Tyvärr ses hooking oftare som en kontradiktorisk teknik snarare än en utvecklingsteknik. Så det är viktigt att du anammar och följer de bästa säkerhetsrutinerna för att säkerställa att dina applikationer är säkra och fria från attacker som hooking och injection.