DLL injekció

DLL injekció ( eng.  DLL injekció ) - a programozásban olyan módszer, amellyel kódot futtatnak egy másik folyamat címterében, kényszerítve azt egy dinamikusan csatolt könyvtár betöltésére [1] . A DLL-injekciókat gyakran használják külső programok arra, hogy olyan módon befolyásolják egy másik program viselkedését, ahogyan azt a szerzők nem szándékozták vagy nem szándékozták [1] [2] [3] . Például a beinjektált kód elfoghatja a [4] [5] függvények rendszerhívásait, vagy beolvassa a jelszó szövegmezőinek tartalmát, amit a szokásos módon nem lehet megtenni [6] . A tetszőleges kód tetszőleges folyamatokba történő beillesztésére használt programot DLL-injektornak nevezik .

Microsoft Windows

Microsoft Windows rendszeren számos mód van arra, hogy egy folyamatot az alkalmazás szerzőjének akarata ellenére kód betöltésére kényszerítsen egy DLL-be:

Unix-szerű operációs rendszerek

Unix-szerű operációs rendszereken az ld.so ( BSD -n ) és ld-linux.so ( Linux - on ) alapú dinamikus linker használatával tetszőleges könyvtárakat tölthet be egy új folyamatba úgy, hogy egy környezet segítségével megadja a könyvtár elérési útját. változó LD_PRELOAD.amely globálisan hozzárendelhető vagy egy adott folyamathoz egyedileg is hozzárendelhető. [24]

Például egy Linux rendszeren ez a parancs elindítja a "prog" folyamatot az indításkor hozzárendelt "test.so" megosztott könyvtárral együtt:

LD_PRELOAD = "./test.so" prog

Az ilyen könyvtárak ugyanúgy jönnek létre, mint a megosztott objektumok. A könyvtár hozzáfér a programban megadott külső szimbólumokhoz, akárcsak bármely más könyvtár.


MacOS rendszeren ez a parancs elindítja a „prog” folyamatot az indításkor hozzárendelt „test.dylib” megosztott könyvtárral együtt: [25]

DYLD_INSERT_LIBRARIES = "./test.dylib" DYLD_FORCE_FLAT_NAMESPACE = 1 prog

Unix-szerű rendszereken lehetőség van hibakeresőkön alapuló módszerek használatára is. [26]

Mintakód

A LoadLibrary API használata

Az alábbi mintafüggvény egy DLL-befecskendezési technikát használ, amely azt a tényt használja ki, hogy a kernel32.dll szinte minden folyamattal azonos címre van leképezve. Ezért a LoadLibrary (amely a kernel32.dll függvénye) is ugyanarra a címre van leképezve. A LoadLibrary a CreateRemoteThread által igényelt szálindítási rutinhoz is alkalmas.

#include <windows.h> HANDLE inject_DLL ( const char * fájlnév , int PID ) { HANDLE h_process , h_rThread ; char fullDLLPath [ _MAX_PATH ]; LPVOID DLLPath_addr , LoadLib_addr ; DWORD kilépési_kód ; /* A célfolyamat fogantyújának lekérése */ h_process = OpenProcess ( PROCESS_ALL_ACCESS , HAMIS , PID ); /* A DLL fájl teljes elérési útjának lekérése */ GetFullPathName ( fájlnév , _MAX_PATH , fullDLLPath , NULL ); /* Memória lefoglalása a célfolyamatban */ DLLPath_addr = VirtualAllocEx ( h_process , NULL , _MAX_PATH , MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE ); /* Írja be a DLL fájl elérési útját az újonnan létrehozott memóriablokkba */ WriteProcessMemory ( h_process , DLLPath_addr , fullDLLPath , strlen ( fullDLLPath ), NULL ); /* A futtatás megkezdéséhez szerezze be a LoadLibraryA címét (minden folyamathoz ugyanaz) */ LoadLib_addr = GetProcAddress ( GetModuleHandle ( "Kernel32" ), "LoadLibraryA" ); /* Indítson el egy távoli szálat a LoadLibraryA programban, és adja át a DLL elérési útját argumentumként */ h_rThread = CreateRemoteThread ( h_process , NULL , 0 , ( LPTHREAD_START_ROUTINE ) LoadLib_addr , DLLPath_addr , 0 , NULL ); /* Várd meg, amíg befejeződik */ WaitForSingleObject ( h_rThread , VÉGTELEN ); /* Szerezze be a kilépési kódot (vagyis a LoadLibraryA hívása által visszaadott leíró értékét */ GetExitCodeThread ( h_rThread , & kilépési_kód ); /* A beágyazott adatfolyam gazdagépének felszabadítása. */ CloseHandle ( h_rThread ); /* Valamint a DLL elérési útjához lefoglalt memória */ VirtualFreeEx ( h_process , DLLPath_addr , 0 , MEM_RELEASE ); /* És a célfolyamat kezelőazonosítója is */ CloseHandle ( h_process ); return ( HANDLE ) kilépési_kód ; }

Jegyzetek

  1. 1 2 James Shewmaker. DLL-injekció elemzése . GSM bemutató . bluenotch. Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. december 3..
  2. 12 Iczelion . 24. oktatóanyag: Windows Hooks . Iczelion Win32 Assembly honlapja (2002. augusztus). Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. augusztus 1..
  3. Rocky Pulley. A Feladatkezelő kiterjesztése DLL-befecskendezéssel . kódprojekt . CodeProject (2005. május 19.). Letöltve: 2008. szeptember 1. Az eredetiből archiválva : 2009. február 6..
  4. 1 2 Nasser R. Rowhani. DLL-befecskendezés és funkcióelfogás oktatóanyag . kódprojekt . CodeProject (2003. október 23.). Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. június 15.
  5. 1 2 3 Ivo Ivanov. Felfedték az API-bekapcsolást . kódprojekt . CodeProject (2002. december 2.). Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. október 14..
  6. 1 2 3 Robert Kuster. Három módszer a kód beillesztésére egy másik folyamatba . kódprojekt . CodeProject (2003. augusztus 20.). Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. július 20.
  7. Munka az AppInit_DLLs beállításjegyzék  értékével . Microsoft (2006. november 21.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2017. január 1..
  8. Raymond Chen. Az AppInit_DLL-eket át kell nevezni  Deadlock_Or_Crash_Randomly_DLL- nek . A Régi Új Dolog . Microsoft (2007. december 13.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2007. december 17..
  9. dllmain.c  (angol)  (elérhetetlen hivatkozás - előzmények ) . React OS . React OS Foundation.
  10. „AtomBombing” Microsoft Windows kódbefecskendezéssel , Dark Reading  (2016. október 27.). Archiválva : 2021. május 17. Letöltve: 2021. december 28.
  11. Trent Waddington. InjectDLL  (angol)  (downlink) (2008. augusztus 31.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2019. december 30.
  12. Dll Injection  (angol)  (lefelé irányuló kapcsolat) . DreamInCode.net . MediaGroup1 (2008. augusztus 31.). Az eredetiből archiválva: 2008. szeptember 2.
  13. Greg Jenkins. DLL Injection Framework  (angol)  (nem elérhető hivatkozás) . Ring3 Circus (2007. november 1.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2020. június 28.
  14. Drew Benton. Egy teljesebb DLL-befecskendezési megoldás a CreateRemoteThread használatával  . kódprojekt . CodeProject (2007. augusztus 17.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..
  15. SetWindowsHookEx  függvény . Platform SDK Windows XP SP2 rendszerhez . Microsoft (2008. augusztus 31.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2016. augusztus 17..
  16. AppInit_DLLs Registry Value és Windows  95 . Microsoft Súgó és támogatás . Microsoft (2005. március 1.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2016. március 20.
  17. Dll-befecskendezés a SetWindowsHookEx()  metódussal . Game Reversal (2008. április 3.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2016. április 4..
  18. SetThreadContext DLL Injection  ( 2007. január 16.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..
  19. Ben Botto. DLL Injector  (angol)  (nem elérhető link) (2008. szeptember 6.). Az eredetiből archiválva: 2009. február 7.
  20. A nem biztonságos könyvtárbetöltés lehetővé teheti a távoli  kódfuttatást . Microsoft (2016. április 20.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2017. július 2.
  21. ↑ A könyvtárak biztonságos betöltése a DLL előtöltési támadások megelőzése érdekében  . Microsoft (2011. június 10.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2016. szeptember 23..
  22. Microsoft biztonsági figyelmeztetés: A nem biztonságos könyvtárbetöltés lehetővé teheti a távoli kódfuttatást . support.microsoft.com . Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..
  23. Endpoint Protection – Symantec Enterprise . Community.broadcom.com . Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..
  24. Torvalds, Linus; Linus Torvalds, David Engel, Eric Youngdale, Peter MacDonald, Hongjiu Lu, Lars Wirzenius, Mitch D'Souza. ld.so/ld-linux.so - dinamikus linker/betöltő  (angol)  (nem elérhető hivatkozás) . UNIX kézikönyvoldalak (1998. március 14.). Az eredetiből archiválva: 2009. február 6.
  25. Peter Goldsborough. Az LD_PRELOAD trükk . Peter Goldsborough . Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 9..
  26. Kódbefecskendezés a futó Linux   alkalmazásba ? . CodeProject (2009. február 12.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..