DLL-injektion
DLL-injektion ( eng. DLL-injektion ) - i programmering, en metod som används för att köra kod i adressutrymmet för en annan process, vilket tvingar den att ladda ett dynamiskt länkat bibliotek [1] . DLL-injektioner används ofta av externa program för att påverka beteendet hos ett annat program på ett sätt som dess upphovsmän inte hade för avsikt eller tänkt [1] [2] [3] . Till exempel kan injicerad kod fånga upp systemanrop till funktioner [4] [5] eller läsa innehållet i lösenordstextfält, vilket inte kan göras på vanligt sätt [6] . Programmet som används för att injicera godtycklig kod i godtyckliga processer kallas en DLL-injektor .
Microsoft Windows
På Microsoft Windows finns det många sätt att tvinga en process att ladda kod i en DLL mot programförfattarens vilja:
- DLL-filer listade i systemregistret med nyckeln HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLskommer att laddas i varje process som laddar User32.dll- biblioteket vid det första anropet. [7] [8] [9]
- Keyed DLLs HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLskommer att laddas i varje process som anropar CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW och WinExec Windows API -funktioner. Detta är en av de legitima DLL-injektionsmetoderna på Windows 10, förutsatt att DLL-filen är signerad med rätt certifikat.
- Processmanipulationsfunktioner, såsom CreateRemoteThread, eller kodinjektionsteknologier, såsom AtomBombing [10] , som kan användas för att injicera en DLL i ett program efter att det har körts. [5] [6] [11] [12] [13] [14]
- Avlyssning av Windows-samtal, till exempel SetWindowsHookEx. [2] [5] [6] [15] [16] [17]
- Använda SuspendThread- eller NtSuspendThread-funktionerna för att suspendera alla trådar och använda SetThreadContext- eller NtSetContextThread-funktionerna för att ändra sammanhanget för befintliga trådar i applikationen för att köra injicerad kod som kan ladda DLL-filen. [4] [18] [19]
- Utnyttja Windows-begränsningar och applikationer som anropar LoadLibrary eller LoadLibraryEx utan att ange sökvägen till den DLL som ska laddas. [20] [21] [22]
- Arbeta med lager på systemnivån.
- Ersätter en av programmets beroende DLL:er med en falsk som innehåller samma exporterade objekt som originalet. [23]
Unix-liknande operativsystem
På Unix-liknande operativsystem , med hjälp av en dynamisk länk baserad på ld.so (på BSD ) och ld-linux.so (på Linux ), kan du ladda godtyckliga bibliotek till en ny process genom att ange sökvägen till biblioteket med hjälp av en miljö variabel LD_PRELOADsom kan tilldelas globalt eller tilldelas en specifik process individuellt. [24]
Till exempel, på ett Linux-system, startar detta kommando processen "prog" tillsammans med det delade biblioteket "test.so" som mappas in i det vid uppstart:
LD_PRELOAD = "./test.so" prog
Sådana bibliotek skapas på samma sätt som delade objekt. Biblioteket har tillgång till externa symboler som anges i programmet, precis som alla andra bibliotek.
På macOS startar det här kommandot "prog"-processen tillsammans med det delade biblioteket "test.dylib" som mappas in i det vid uppstart: [25]
DYLD_INSERT_LIBRARIES = "./test.dylib" DYLD_FORCE_FLAT_NAMESPACE = 1 prog
På Unix-liknande system är det också möjligt att använda metoder baserade på debuggers. [26]
Exempelkod
Använda LoadLibrary API
Exempelfunktionen nedan använder en DLL-injektionsteknik som utnyttjar det faktum att kernel32.dll är mappad till samma adress som nästan alla processer. Därför mappas även LoadLibrary (som är en funktion från kernel32.dll) till samma adress. LoadLibrary är också lämplig för trådstartsrutinen som krävs av CreateRemoteThread.
#include <windows.h>
HANTERA inject_DLL ( const char * file_name , int PID )
{
HANTERA h_process , h_rThread ;
char fullDLLPath [ _MAX_PATH ];
LPVOID DLLPath_addr , LoadLib_addr ;
DWORD exit_code ;
/* Hämta handtaget för målprocessen */
h_process = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , PID );
/* Hämta den fullständiga sökvägen till DLL-filen */
GetFullPathName ( filnamn , _MAX_PATH , fullDLLPath , NULL );
/* Tilldela minne i målprocessen */
DLLPath_addr = VirtualAllocEx ( h_process , NULL , _MAX_PATH ,
MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
/* Skriv sökvägen till DLL-filen till det nyskapade minnesblocket */
WriteProcessMemory ( h_process , DLLPath_addr , fullDLLPath ,
strlen ( fullDLLPath ), NULL );
/* Hämta adressen till LoadLibraryA (samma för alla processer) för att börja köra det */
LoadLib_addr = GetProcAddress ( GetModuleHandle ( "Kernel32" ), "LoadLibraryA" );
/* Starta en fjärrtråd i LoadLibraryA och skicka sökvägen till DLL:n som ett argument */
h_rThread = CreateRemoteThread ( h_process , NULL , 0 , ( LPTHREAD_START_ROUTINE ) LoadLib_addr , DLLPath_addr , 0 , NULL );
/* Vänta tills det är klart */
WaitForSingleObject ( h_rThread , INFINITE );
/* Hämta utgångskoden (det vill säga värdet på handtaget som returneras av anropet till LoadLibraryA */
GetExitCodeThread ( h_rThread , & exit_code );
/* Släpp värden för den inbäddade strömmen. */
CloseHandle ( h_rThread );
/* Samt minnet som allokerats för sökvägen till DLL:n */
VirtualFreeEx ( h_process , DLLPath_addr , 0 , MEM_RELEASE );
/* Och även handtag-id för målprocessen */
CloseHandle ( h_process );
return ( HANDLE ) exit_code ;
}
Anteckningar
- ↑ 1 2 James Shewmaker. Analysera DLL-injektion . GSM-presentation . bluenotch. Hämtad 31 augusti 2008. Arkiverad från originalet 3 december 2008. (obestämd)
- ↑ 12 Iczelion . Handledning 24: Windows Hooks . Iczelions Win32 Assembly-hemsida (augusti 2002). Hämtad 31 augusti 2008. Arkiverad från originalet 1 augusti 2008. (obestämd)
- ↑ Stenig remskiva. Utöka Task Manager med DLL-injektion . kodprojekt . CodeProject (19 maj 2005). Hämtad 1 september 2008. Arkiverad från originalet 6 februari 2009. (obestämd)
- ↑ 1 2 Nasser R. Rowhani. Handledning för DLL-injektion och funktionsavlyssning . kodprojekt . CodeProject (23 oktober 2003). Hämtad 31 augusti 2008. Arkiverad från originalet 15 juni 2008. (obestämd)
- ↑ 1 2 3 Ivo Ivanov. API hooking avslöjad . kodprojekt . CodeProject (2 december 2002). Hämtad 31 augusti 2008. Arkiverad från originalet 14 oktober 2008. (obestämd)
- ↑ 1 2 3 Robert Kuster. Tre sätt att injicera din kod i en annan process . kodprojekt . CodeProject (20 augusti 2003). Hämtad 31 augusti 2008. Arkiverad från originalet 20 juli 2008. (obestämd)
- ↑ Arbeta med registervärdet AppInit_DLLs . Microsoft (21 november 2006). Hämtad 28 december 2021. Arkiverad från originalet 1 januari 2017.
- ↑ Raymond Chen. AppInit_DLLs bör döpas om Deadlock_Or_Crash_Randomly_DLLs . Den gamla nya saken . Microsoft (13 december 2007). Hämtad 28 december 2021. Arkiverad från originalet 17 december 2007.
- ↑ dllmain.c (engelska) (otillgänglig länk - historia ) . Reager OS . React OS Foundation.
- ↑ 'Atombombing' Microsoft Windows via kodinjektion , mörk läsning (27 oktober 2016). Arkiverad 17 maj 2021. Hämtad 28 december 2021.
- ↑ Trent Waddington. InjectDLL (engelska) (nedlänk) (31 augusti 2008). Hämtad 28 december 2021. Arkiverad från originalet 30 december 2019.
- ↑ Dll-injektion (engelska) (nedlänk) . DreamInCode.net . MediaGroup1 (31 augusti 2008). Arkiverad från originalet den 2 september 2008.
- ↑ Greg Jenkins. DLL Injection Framework (engelska) (inte tillgänglig länk) . Ring3 Circus (1 november 2007). Hämtad 28 december 2021. Arkiverad från originalet 28 juni 2020.
- ↑ Drew Benton. En mer komplett DLL-injektionslösning med CreateRemoteThread . kodprojekt . CodeProject (17 augusti 2007). Hämtad 28 december 2021. Arkiverad från originalet 28 december 2021.
- ↑ Ställ in WindowsHookEx- funktion . Plattforms-SDK för Windows XP SP2 . Microsoft (31 augusti 2008). Hämtad 28 december 2021. Arkiverad från originalet 17 augusti 2016.
- ↑ AppInit_DLLs registervärde och Windows 95 . Microsoft Hjälp och support . Microsoft (1 mars 2005). Hämtad 28 december 2021. Arkiverad från originalet 20 mars 2016.
- ↑ Dll-injektion med SetWindowsHookEx()- metoden . Game Reversal (3 april 2008). Hämtad 28 december 2021. Arkiverad från originalet 4 april 2016.
- ↑ SetThreadContext DLL Injection ( 16 januari 2007). Hämtad 28 december 2021. Arkiverad från originalet 28 december 2021.
- ↑ Ben Botto. DLL Injector (engelska) (inte tillgänglig länk) (6 september 2008). Arkiverad från originalet den 7 februari 2009.
- ↑ Osäker biblioteksladdning kan tillåta fjärrkodexekvering . Microsoft (20 april 2016). Hämtad 28 december 2021. Arkiverad från originalet 2 juli 2017.
- ↑ Säker laddning av bibliotek för att förhindra DLL-förladdningsattacker . Microsoft (10 juni 2011). Hämtad 28 december 2021. Arkiverad från originalet 23 september 2016.
- ↑ Microsofts säkerhetsrådgivning: Osäker biblioteksladdning kan tillåta fjärrkörning av kod . support.microsoft.com . Hämtad 28 december 2021. Arkiverad från originalet 28 december 2021. (obestämd)
- ↑ Endpoint Protection - Symantec Enterprise . community.broadcom.com . Hämtad 28 december 2021. Arkiverad från originalet 28 december 2021. (obestämd)
- ↑ Torvalds, Linus; Linus Torvalds, David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Lars Wirzenius, Mitch D'Souza. ld.so/ld-linux.so - dynamisk länkare/lastare (engelska) (inte tillgänglig länk) . UNIX man-sidor (14 mars 1998). Arkiverad från originalet den 6 februari 2009.
- ↑ Peter Goldsborough. LD_PRELOAD-tricket . Peter Goldsborough . Hämtad 28 december 2021. Arkiverad från originalet 9 december 2021. (obestämd)
- ↑ Kodinjektion i kör Linux- applikation ? . CodeProject (12 februari 2009). Hämtad 28 december 2021. Arkiverad från originalet 28 december 2021. (obestämd)