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:
- A rendszerleíró adatbázisban a kulcs által felsorolt DLL-fájlok HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLsminden olyan folyamatban betöltődnek, amely a User32.dll könyvtárat a kezdeti híváskor betölti. [7] [8] [9]
- Kulcsos DLL -ek HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLsbetöltődnek minden olyan folyamatban, amely meghívja a CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW és WinExec Windows API függvényeket. Ez az egyik legális DLL-befecskendezési módszer a Windows 10 rendszerben, feltéve, hogy a DLL-fájlt a megfelelő tanúsítvánnyal írták alá.
- Folyamatmanipulációs funkciók, mint például a CreateRemoteThread, vagy kódbefecskendezési technológiák, mint például az AtomBombing [10] , amelyek segítségével DLL-t lehet beilleszteni egy programba annak lefutása után. [5] [6] [11] [12] [13] [14]
- Windows-hívások elfogása, például a SetWindowsHookEx. [2] [5] [6] [15] [16] [17]
- A SuspendThread vagy az NtSuspendThread függvények használata az összes szál felfüggesztésére, és a SetThreadContext vagy NtSetContextThread függvények használata az alkalmazásban lévő meglévő szálak kontextusának módosítására a DLL betöltésére alkalmas beszúrt kód futtatásához. [4] [18] [19]
- Használja ki a Windows korlátozásait és azokat az alkalmazásokat, amelyek meghívják a LoadLibrary vagy LoadLibraryEx alkalmazást anélkül, hogy megadnák a betöltendő DLL elérési útját. [20] [21] [22]
- Működés a rendszerszintű rétegekkel .
- Az alkalmazástól függő DLL-ek egyikének cseréje egy hamis DLL-re, amely ugyanazokat az exportált objektumokat tartalmazza, mint az eredeti. [23]
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 2 James Shewmaker. DLL-injekció elemzése . GSM bemutató . bluenotch. Letöltve: 2008. augusztus 31. Az eredetiből archiválva : 2008. december 3.. (határozatlan)
- ↑ 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.. (határozatlan)
- ↑ 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.. (határozatlan)
- ↑ 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. (határozatlan)
- ↑ 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.. (határozatlan)
- ↑ 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. (határozatlan)
- ↑ 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..
- ↑ 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..
- ↑ dllmain.c (angol) (elérhetetlen hivatkozás - előzmények ) . React OS . React OS Foundation.
- ↑ „AtomBombing” Microsoft Windows kódbefecskendezéssel , Dark Reading (2016. október 27.). Archiválva : 2021. május 17. Letöltve: 2021. december 28.
- ↑ Trent Waddington. InjectDLL (angol) (downlink) (2008. augusztus 31.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2019. december 30.
- ↑ Dll Injection (angol) (lefelé irányuló kapcsolat) . DreamInCode.net . MediaGroup1 (2008. augusztus 31.). Az eredetiből archiválva: 2008. szeptember 2.
- ↑ 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.
- ↑ 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..
- ↑ 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..
- ↑ 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.
- ↑ 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..
- ↑ SetThreadContext DLL Injection ( 2007. január 16.). Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28..
- ↑ Ben Botto. DLL Injector (angol) (nem elérhető link) (2008. szeptember 6.). Az eredetiből archiválva: 2009. február 7.
- ↑ 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.
- ↑ 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..
- ↑ 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.. (határozatlan)
- ↑ Endpoint Protection – Symantec Enterprise . Community.broadcom.com . Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 28.. (határozatlan)
- ↑ 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.
- ↑ Peter Goldsborough. Az LD_PRELOAD trükk . Peter Goldsborough . Letöltve: 2021. december 28. Az eredetiből archiválva : 2021. december 9.. (határozatlan)
- ↑ 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.. (határozatlan)