DLL-injektion
DLL-injektion ( eng. DLL-injection ) - i programmering, en metode, der bruges til at køre kode i adresserummet i en anden proces, hvilket tvinger den til at indlæse et dynamisk linket bibliotek [1] . DLL-injektioner bruges ofte af eksterne programmer til at påvirke adfærden af et andet program på en måde, som dets forfattere ikke havde til hensigt eller havde til hensigt [1] [2] [3] . For eksempel kan indsprøjtet kode opsnappe systemkald til funktioner [4] [5] eller læse indholdet af kodeordstekstfelter, hvilket ikke kan gøres på den sædvanlige måde [6] . Programmet, der bruges til at injicere vilkårlig kode i vilkårlige processer, kaldes en DLL-injektor .
Microsoft Windows
På Microsoft Windows er der mange måder at tvinge en proces til at indlæse kode i en DLL mod applikationsforfatterens vilje:
- DLL-filer, der er angivet i systemregistret efter nøglen HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs, vil blive indlæst i hver proces, der indlæser User32.dll -biblioteket ved dets første opkald. [7] [8] [9]
- Nøglede DLL'er HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLsvil blive indlæst i hver proces, der kalder CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW og WinExec Windows API -funktionerne. Dette er en af de legitime DLL-injektionsmetoder på Windows 10, forudsat at DLL-filen er signeret med det korrekte certifikat.
- Procesmanipulationsfunktioner, såsom CreateRemoteThread, eller kodeinjektionsteknologier, såsom AtomBombing [10] , som kan bruges til at injicere en DLL i et program, efter at det er kørt. [5] [6] [11] [12] [13] [14]
- Aflytning af Windows-opkald, såsom SetWindowsHookEx. [2] [5] [6] [15] [16] [17]
- Brug af SuspendThread- eller NtSuspendThread-funktionerne til at suspendere alle tråde og brug af SetThreadContext- eller NtSetContextThread-funktionerne til at ændre konteksten af eksisterende tråde i applikationen til at køre injiceret kode, der kan indlæse DLL'en. [4] [18] [19]
- Udnyt Windows-begrænsninger og applikationer, der kalder LoadLibrary eller LoadLibraryEx uden at angive stien til den DLL, der skal indlæses. [20] [21] [22]
- Arbejder med lag af systemniveauet.
- Udskiftning af en af applikationens afhængige DLL'er med en falsk, der indeholder de samme eksporterede objekter som originalen. [23]
Unix-lignende operativsystemer
På Unix-lignende operativsystemer kan du ved at bruge en dynamisk linker baseret på ld.so (på BSD ) og ld-linux.so (på Linux ) indlæse vilkårlige biblioteker i en ny proces ved at angive stien til biblioteket ved hjælp af et miljø variabel LD_PRELOAD, som kan tildeles globalt eller tildeles en specifik proces individuelt. [24]
På et Linux-system starter denne kommando f.eks. processen "prog" sammen med det delte bibliotek "test.so", der er knyttet til det ved opstartstidspunktet:
LD_PRELOAD = "./test.so" prog
Sådanne biblioteker oprettes på samme måde som delte objekter. Biblioteket har adgang til eksterne symboler specificeret i programmet, ligesom ethvert andet bibliotek.
På macOS starter denne kommando "prog"-processen sammen med det delte bibliotek "test.dylib", der er knyttet til det ved opstartstidspunktet: [25]
DYLD_INSERT_LIBRARIES = "./test.dylib" DYLD_FORCE_FLAT_NAMESPACE = 1 prog
På Unix-lignende systemer er det også muligt at bruge metoder baseret på debuggere. [26]
Eksempelkode
Brug af LoadLibrary API
Eksempelfunktionen nedenfor bruger en DLL-injektionsteknik, der udnytter det faktum, at kernel32.dll er knyttet til den samme adresse som næsten alle processer. Derfor er LoadLibrary (som er en funktion fra kernel32.dll) også knyttet til den samme adresse. LoadLibrary er også velegnet til trådstartsrutinen, der kræves af CreateRemoteThread.
#include <windows.h>
HANDLE inject_DLL ( const char * filnavn , int PID )
{
HANDLE h_process , h_rThread ;
char fullDLLPath [ _MAX_PATH ];
LPVOID DLLPath_addr , LoadLib_addr ;
DWORD exit_code ;
/* Hent håndtaget til målprocessen */
h_process = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , PID );
/* Hent den fulde sti til DLL-filen */
GetFullPathName ( filnavn , _MAX_PATH , fullDLLPath , NULL );
/* Tildel hukommelse i målprocessen */
DLLPath_addr = VirtualAllocEx ( h_process , NULL , _MAX_PATH ,
MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
/* Skriv stien til DLL-filen til den nyoprettede hukommelsesblok */
WriteProcessMemory ( h_process , DLLPath_addr , fullDLLPath ,
strlen ( fullDLLPath ), NULL );
/* Hent adressen på LoadLibraryA (samme for alle processer) for at begynde at køre den */
LoadLib_addr = GetProcAddress ( GetModuleHandle ( "Kernel32" ), "LoadLibraryA" );
/* Start en ekstern tråd i LoadLibraryA, og send stien til DLL'en som et argument */
h_rThread = CreateRemoteThread ( h_process , NULL , 0 , ( LPTHREAD_START_ROUTINE ) LoadLib_addr , DLLPath_addr , 0 , NULL );
/* Vent til det er færdigt */
WaitForSingleObject ( h_rThread , INFINITE );
/* Hent udgangskoden (det vil sige værdien af håndtaget returneret af opkaldet til LoadLibraryA */
GetExitCodeThread ( h_rThread , & exit_code );
/* Slip værten for den indlejrede strøm. */
Luk Håndtag ( h_rThread );
/* Samt den hukommelse, der er allokeret til stien til DLL'en */
VirtualFreeEx ( h_process , DLLPath_addr , 0 , MEM_RELEASE );
/* Og også handle-id'et for målprocessen */
CloseHandle ( h_process );
returnere ( HANDLE ) exit_code ;
}
Noter
- ↑ 1 2 James Shewmaker. Analyse af DLL-injektion . GSM præsentation . bluenotch. Hentet 31. august 2008. Arkiveret fra originalen 3. december 2008. (ubestemt)
- ↑ 12 Iczelion . Selvstudium 24: Windows Hooks . Iczelions Win32 Assembly-hjemmeside (august 2002). Hentet 31. august 2008. Arkiveret fra originalen 1. august 2008. (ubestemt)
- ↑ Rocky Pulley. Udvidelse af Task Manager med DLL-injektion . kodeprojekt . CodeProject (19. maj 2005). Hentet 1. september 2008. Arkiveret fra originalen 6. februar 2009. (ubestemt)
- ↑ 1 2 Nasser R. Rowhani. DLL-injektions- og funktionsaflytningsvejledning . kodeprojekt . CodeProject (23. oktober 2003). Hentet 31. august 2008. Arkiveret fra originalen 15. juni 2008. (ubestemt)
- ↑ 1 2 3 Ivo Ivanov. API-hooking afsløret . kodeprojekt . CodeProject (2. december 2002). Hentet 31. august 2008. Arkiveret fra originalen 14. oktober 2008. (ubestemt)
- ↑ 1 2 3 Robert Kuster. Tre måder at injicere din kode i en anden proces . kodeprojekt . CodeProject (20. august 2003). Hentet 31. august 2008. Arkiveret fra originalen 20. juli 2008. (ubestemt)
- ↑ Arbejde med AppInit_DLLs registreringsværdi . Microsoft (21. november 2006). Hentet 28. december 2021. Arkiveret fra originalen 1. januar 2017.
- ↑ Raymond Chen. AppInit_DLLs skal omdøbes Deadlock_Or_Crash_Randomly_DLLs . Den gamle nye ting . Microsoft (13. december 2007). Hentet 28. december 2021. Arkiveret fra originalen 17. december 2007.
- ↑ dllmain.c (engelsk) (utilgængelig link - historie ) . Reager OS . React OS Foundation.
- ↑ 'Atombombing' Microsoft Windows via kodeinjektion , mørk læsning (27. oktober 2016). Arkiveret 17. maj 2021. Hentet 28. december 2021.
- ↑ Trent Waddington. InjectDLL (engelsk) (downlink) (31. august 2008). Hentet 28. december 2021. Arkiveret fra originalen 30. december 2019.
- ↑ Dll-injektion (engelsk) (downlink) . DreamInCode.net . MediaGroup1 (31. august 2008). Arkiveret fra originalen den 2. september 2008.
- ↑ Greg Jenkins. DLL Injection Framework (engelsk) (utilgængeligt link) . Ring3 Cirkus (1. november 2007). Hentet 28. december 2021. Arkiveret fra originalen 28. juni 2020.
- ↑ Drew Benton. En mere komplet DLL-injektionsløsning ved hjælp af CreateRemoteThread . kodeprojekt . CodeProject (17. august 2007). Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021.
- ↑ SetWindowsHookEx- funktion . Platform SDK til Windows XP SP2 . Microsoft (31. august 2008). Hentet 28. december 2021. Arkiveret fra originalen 17. august 2016.
- ↑ AppInit_DLLs Registry Value og Windows 95 . Microsoft Hjælp og support . Microsoft (1. marts 2005). Hentet 28. december 2021. Arkiveret fra originalen 20. marts 2016.
- ↑ Dll-injektion ved hjælp af SetWindowsHookEx()- metoden . Game Reversal (3. april 2008). Hentet 28. december 2021. Arkiveret fra originalen 4. april 2016.
- ↑ SetThreadContext DLL Injection ( 16. januar 2007). Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021.
- ↑ Ben Botto. DLL Injector (engelsk) (utilgængeligt link) (6. september 2008). Arkiveret fra originalen den 7. februar 2009.
- ↑ Usikker biblioteksindlæsning kan tillade fjernudførelse af kode . Microsoft (20. april 2016). Hentet 28. december 2021. Arkiveret fra originalen 2. juli 2017.
- ↑ Sikker indlæsning af biblioteker for at forhindre DLL-forudindlæsningsangreb . Microsoft (10. juni 2011). Hentet 28. december 2021. Arkiveret fra originalen 23. september 2016.
- ↑ Microsoft Sikkerhedsrådgivning: Usikker biblioteksindlæsning kan tillade fjernudførelse af kode . support.microsoft.com . Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021. (ubestemt)
- ↑ Endpoint Protection - Symantec Enterprise . community.broadcom.com . Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021. (ubestemt)
- ↑ Torvalds, Linus; Linus Torvalds, David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Lars Wirzenius, Mitch D'Souza. ld.so/ld-linux.so - dynamisk linker/indlæser (engelsk) (utilgængeligt link) . UNIX man pages (14. marts 1998). Arkiveret fra originalen den 6. februar 2009.
- ↑ Peter Goldsborough. LD_PRELOAD tricket . Peter Goldsborough . Hentet 28. december 2021. Arkiveret fra originalen 9. december 2021. (ubestemt)
- ↑ Kodeinjektion i kørende Linux- applikation ? . CodeProject (12. februar 2009). Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021. (ubestemt)