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

Microsoft Windows er der mange måder at tvinge en proces til at indlæse kode i en DLL mod applikationsforfatterens vilje:

Unix-lignende operativsystemer

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.


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. 1 2 James Shewmaker. Analyse af DLL-injektion . GSM præsentation . bluenotch. Hentet 31. august 2008. Arkiveret fra originalen 3. december 2008.
  2. 12 Iczelion . Selvstudium 24: Windows Hooks . Iczelions Win32 Assembly-hjemmeside (august 2002). Hentet 31. august 2008. Arkiveret fra originalen 1. august 2008.
  3. Rocky Pulley. Udvidelse af Task Manager med DLL-injektion . kodeprojekt . CodeProject (19. maj 2005). Hentet 1. september 2008. Arkiveret fra originalen 6. februar 2009.
  4. 1 2 Nasser R. Rowhani. DLL-injektions- og funktionsaflytningsvejledning . kodeprojekt . CodeProject (23. oktober 2003). Hentet 31. august 2008. Arkiveret fra originalen 15. juni 2008.
  5. 1 2 3 Ivo Ivanov. API-hooking afsløret . kodeprojekt . CodeProject (2. december 2002). Hentet 31. august 2008. Arkiveret fra originalen 14. oktober 2008.
  6. 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.
  7. ↑ Arbejde med AppInit_DLLs registreringsværdi  . Microsoft (21. november 2006). Hentet 28. december 2021. Arkiveret fra originalen 1. januar 2017.
  8. 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.
  9. dllmain.c  (engelsk)  (utilgængelig link - historie ) . Reager OS . React OS Foundation.
  10. 'Atombombing' Microsoft Windows via kodeinjektion , mørk læsning  (27. oktober 2016). Arkiveret 17. maj 2021. Hentet 28. december 2021.
  11. Trent Waddington. InjectDLL  (engelsk)  (downlink) (31. august 2008). Hentet 28. december 2021. Arkiveret fra originalen 30. december 2019.
  12. Dll-injektion  (engelsk)  (downlink) . DreamInCode.net . MediaGroup1 (31. august 2008). Arkiveret fra originalen den 2. september 2008.
  13. Greg Jenkins. DLL Injection Framework  (engelsk)  (utilgængeligt link) . Ring3 Cirkus (1. november 2007). Hentet 28. december 2021. Arkiveret fra originalen 28. juni 2020.
  14. 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.
  15. SetWindowsHookEx-  funktion . Platform SDK til Windows XP SP2 . Microsoft (31. august 2008). Hentet 28. december 2021. Arkiveret fra originalen 17. august 2016.
  16. 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.
  17. Dll-injektion ved hjælp af SetWindowsHookEx()-  metoden . Game Reversal (3. april 2008). Hentet 28. december 2021. Arkiveret fra originalen 4. april 2016.
  18. SetThreadContext DLL Injection  ( 16. januar 2007). Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021.
  19. Ben Botto. DLL Injector  (engelsk)  (utilgængeligt link) (6. september 2008). Arkiveret fra originalen den 7. februar 2009.
  20. Usikker biblioteksindlæsning kan tillade fjernudførelse af  kode . Microsoft (20. april 2016). Hentet 28. december 2021. Arkiveret fra originalen 2. juli 2017.
  21. ↑ 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.
  22. 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.
  23. Endpoint Protection - Symantec Enterprise . community.broadcom.com . Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021.
  24. 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.
  25. Peter Goldsborough. LD_PRELOAD tricket . Peter Goldsborough . Hentet 28. december 2021. Arkiveret fra originalen 9. december 2021.
  26. Kodeinjektion i kørende Linux-   applikation ? . CodeProject (12. februar 2009). Hentet 28. december 2021. Arkiveret fra originalen 28. december 2021.