[ARCHIVE] Injection de Dll dans un processus

Aujourd’hui je vais vous présenter une méthode plutôt connue pour injecter une dll dans un processus. Pour cela on va d’abord faire un loader qui s’occupera de charger notre dll dans un processus puis on construira ensuite celle-ci.
Pour le loaders on distingue 5 étapes :

1.Récupérer l’adresse de LoadLibraryA()
Pour récupérer l’adresse de LoadLibraryA() il suffit d’utiliser la fonction GetModuleHandleA(). Le prototype de la fonction :

HMODULE WINAPI GetModuleHandle(
__in_opt  LPCTSTR lpModuleName
);


2.Ouvrir le processus voulu
Pour cela on créera une liste de tous les processus actifs et on récupèrera l’id de celui voulu. On ouvrira simplement le processus avec OpenProcess(). Le prototype de la fonction :

HANDLE WINAPI OpenProcess(
__in  DWORD dwDesiredAccess,
__in  BOOL bInheritHandle,
__in  DWORD dwProcessId
);

3.Allouer un espace de mémoire dans le processus
Pour allouer un espace de mémoire on utilisera VirtualAllocEx(). Le prototype de la fonction :

LPVOID WINAPI VirtualAllocEx(
__in      HANDLE hProcess,
__in_opt  LPVOID lpAddress,
__in      SIZE_T dwSize,
__in      DWORD flAllocationType,
__in      DWORD flProtect
);

4. Ecrire les donnes nécessaires au chargement de la dll
Pour ceci on va utiliser WriteProcessMemory(). On pourrait écrire quelque chose du genre LoadLibraryA(“dll.dll”) dans le processus, ce qui donne en assembleur :

PUSH offset_nom_dll
CALL LoadLibraryA
RET

Mais pour faire simple on se contentera d’écrire seulement le nom de la dll dans l’espace de mémoire et on exécutera LoadLibraryA() grâce à notre thread.
Le prototype de la fonction WriteProcessMemory est :

BOOL WINAPI WriteProcessMemory(
__in   HANDLE hProcess,
__in   LPVOID lpBaseAddress,
__in   LPCVOID lpBuffer,
__in   SIZE_T nSize,

__out  SIZE_T* lpNumberOfBytesWritten
);

5.Créer un thread dans le processus afin d’exécuter le code écris dans l’espace de mémoire alloué
C’est l’étape la plus importante, ici on utilisera CreateRemoteThread() pour créer un thread dans le processus qui exécutera LoadLibraryA() avec en paramètre le nom de notre dll. Le prototype de la fonction :

HANDLE WINAPI CreateRemoteThread(
__in   HANDLE hProcess,
__in   LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in   SIZE_T dwStackSize,
__in   LPTHREAD_START_ROUTINE lpStartAddress,
__in   LPVOID lpParameter,
__in   DWORD dwCreationFlags,
__out  LPDWORD lpThreadId
);

Viens ensuite notre dll. Je vais faire simple pour bien montrer le concept.
Lorsqu’on va charger notre dll avec LoadLibaryA(), la fonction va ensuite appeler la fonction main de la Dll avec DLL_PROCESS_ATTACH comme second parametre. On vérifiera donc que le seconde parametre est bien à cette valeur et le tour est joué.
Vous trouverez plus d’info ici : http://msdn2.microsoft.com/en-us/library/ms684175(VS.85).aspx
et ici :

http://msdn2.microsoft.com/en-us/library/ms682583(VS.85).aspx

Le code de la dll : Injectme.cpp
Le code du loader : DllInjector.cpp

Voilà ce sera tout pour aujourd’hui.
Have Fun :)
lilxam.

    • Genghis
    • March 23rd, 2010

    Hi!
    juste pour signaler que les liens injectme.cpp et Dllinjector.cpp renvoient sur la même source. pas de code de dll.

  1. January 12th, 2010
Comment are closed.