Tato technika injekce kódu do cizího procesu je dlouhodobě známá, a proto by se zdálo, že v současnosti již nepoužitelná. Přesto se jí stále hojně využívá. Na straně dobra i na straně zla. Autoři malware využívají této techniky pro ukrytí svého kódu do jiného procesu, kde následně může „nepozorovaně“ vegetovat/pracovat. V případě antivirových pracovníků a různých reverze-code-engineerů se jedná hlavně o možnost využívat/volat kód uvnitř injektované DLL knihovny (inicializační kód, veřejně přístupné funkce…) pro usnadnění práce.

Jak tedy principiálně DLL Injection funguje? Ve vzdáleném procesu chceme spustit funkci LoadLibrary s argumentem v podobě řetězce jména DLL knihovny, kterou chceme do tohoto procesu nahrát. Tedy, nejdříve je třeba požadovaný proces otevřít s příslušnými právy (nejlépe se všemi 🙂 ). Lze využít třeba funkci OpenProcess. Následně ve zpřístupněném procesu alokujeme paměťový prostor, do kterého bude uložena absolutní cesta k DLL knihovně. Nabízí se třeba funkce VirtualAllocEx s právy pro čtení a zápis. Když už máme v procesu alokován prostor, stačí do něj řetězec překopírovat. K tomu se hodí funkce WriteProcessMemory. Nyní už zbývá jediné. Nějakým způsobem tuto knihovnu načíst. Nabízí se nám třeba funkce CreateRemoteThread, které jako čtvrtý argument (lpStartAdress – pointer na funkci, která bude reprezentovat počáteční adresu vlákna vzdáleného procesu) předáme adresu funkce LoadLibrary. Tímto jsme nahráli požadovanou DLL knihovnu do adresního prostoru cizího procesu a máme tedy možnost ji využívat.

Zdrojové kódy DLL Injectoru
Binárka DLL Injectoru
Zdroják testovací DLL
Binárka testovací DLL

Program byl testován na Windows XP SP3 CZ. Kód pravděpodobně nebude správně (vůbec??) fungovat na Windows s ASLR (díky za upozornění, kernelhunter a VrtuleX).

dll_injector