Charger / Décharger un module dans un processus


Propriétés du code


Date de création : 28/12/2006 à 18:08:00
8 Commentaire(s)
  sebdraluorg

 

Présentation


Ce code montre comment injecter une dll dans un autre processus et comment la dechargée

Il montre aussi par la meme occasion comment executer une fonction dans un autre processus.

J'ai essayé de commenter au mieux j'espere que c'est suffisement clair ?

Rem: Cette source est une adaptation d'une source de EbArtSoft sur VbFrance.com

++

 

Code


Option Explicit


Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
Private Declare Function CreateRemoteThread Lib "kernel32" (ByVal hProcess As Long, lpThreadAttributes As Any, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Const KRN_LOAD  As String = "LoadLibraryA"
Private Const KRN_FREE  As String = "FreeLibrary"
Private Const KRN_DLL   As String = "Kernel32"
Private Const GET_HMOD  As String = "GetModuleHandleA"

Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Private Const PROCESS_CREATE_THREAD     As Long = &H2
Private Const PROCESS_VM_OPERATION      As Long = &H8
Private Const PROCESS_VM_READ           As Long = &H10
Private Const PROCESS_VM_WRITE          As Long = &H20

Private Const MEM_RELEASE = &H8000
Private Const MEM_FREE = &H10000
Private Const MEM_COMMIT = &H1000

Public Const PAGE_READWRITE = &H4

Public Function LoadModuleInProcess(ByVal ProcessId As Long, ByVal ModulePathName As String) As Long
        
    Dim hKernel32   As Long
    Dim hThread     As Long
    Dim hVirtual    As Long
    Dim hProcess    As Long
    Dim hFunc       As Long
    
    'Ouverture du process
    hProcess = OpenProcess(PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE Or PROCESS_VM_READ, False, ProcessId)
    
    If hProcess Then
        'On recupere le Handle de Kernel32 qui contient la fontion LoadLibrary
        hKernel32 = GetModuleHandle(KRN_DLL)
        
        'On recupere l'adresse de la fonction LoadLibrary
        hFunc = GetProcAddress(hKernel32, KRN_LOAD)
        
        'On alloue une zone memoire dans le process de destination
        hVirtual = VirtualAllocEx(hProcess, ByVal 0&, Len(ModulePathName), MEM_COMMIT, PAGE_READWRITE)
        
        'On ecrit le chemin du module dans la zone memoire que l'on vient d'allouer
        If WriteProcessMemory(hProcess, ByVal hVirtual, ByVal ModulePathName, Len(ModulePathName), ByVal 0&) Then
            
            'Creation d'un Thread dans le Process,
            'ce Thread va faire appel a LoadLibrary avec pour parametre hVirtual
            'qui pointe vers la zone contenant le nom du module a charger
            hThread = CreateRemoteThread(hProcess, ByVal 0&, 0, ByVal hFunc, ByVal hVirtual, 0, ByVal 0&)
            If hThread Then
                'Maitenant on attend la fin du Thread
                'Ici on attend 2,5 secondes ce qui est plus que suffisant pour
                'charger un module
                WaitForSingleObject hThread, &H9C4
                'On recupere code de sortie du Thread qui est le code de
                'retour de la fonction LoadLibrary et qui contient le Handle
                'du module chargé si tout s'est bien passé
                GetExitCodeThread hThread, LoadModuleInProcess
                'On ferme le Handle du Thread
                CloseHandle hThread
            End If
            
        End If
        
        'On libere la zone allouée dans le Process
        VirtualFreeEx hProcess, hVirtual, Len(ModulePathName), MEM_RELEASE
          
        'On ferme le Handle du Process
        CloseHandle hProcess
    End If
    
End Function

'Pour decharger un module c'est pareil sauf qu'on a besoin du Handle du module
'Si on a charger le module nous meme avec la fonction ci dessus c'est pas un probleme,
'sinon il faut le recuperer.
'Pour ca y a 2 methodes possible:
'
'Methode 1: On enumere les modules du process
'Methode 2: On fait un GetModuleHandle dans le process
'
'Ici tant qu'a faire on va rester dans le meme bain et utiliser la methode 2
'La fonction est un peu moins commentée car elle est tres semblable a la premiere

Public Function UnLoadModuleFromProcess(ByVal ProcessId As Long, Optional ByVal ModulePathName As String = "", Optional ByVal hMod As Long = 0) As Long
    
    Dim hKernel32   As Long
    Dim hThread     As Long
    Dim hProcess    As Long
    Dim hFunc       As Long
    Dim hVirtual    As Long
    
    hProcess = OpenProcess(PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE Or PROCESS_VM_READ, False, ProcessId)
  
    If hProcess Then
        hKernel32 = GetModuleHandle(KRN_DLL)
        hFunc = GetProcAddress(hKernel32, GET_HMOD)
        
        ' Si on a pas le handle du module on le recupere en faisant appel
        ' a GetModuleHandle depuis le process cible
        If Not hMod Then
            hVirtual = VirtualAllocEx(hProcess, ByVal 0&, Len(ModulePathName), MEM_COMMIT, PAGE_READWRITE)
            If WriteProcessMemory(hProcess, ByVal hVirtual, ByVal ModulePathName, Len(ModulePathName), ByVal 0&) Then
                hThread = CreateRemoteThread(hProcess, ByVal 0&, 0, ByVal hFunc, ByVal hVirtual, 0, ByVal 0&)
                If hThread Then
                    WaitForSingleObject hThread, &H9C4
                    'on recupere le handle du Module dans hMod
                    GetExitCodeThread hThread, hMod
                    CloseHandle hThread
                End If
            End If
        End If
        
        'Si on le handle
        If hMod Then
            hFunc = GetProcAddress(hKernel32, KRN_FREE)
            hThread = CreateRemoteThread(hProcess, ByVal 0&, 0, ByVal hFunc, ByVal hMod, 0, ByVal 0&)
            If hThread Then
                WaitForSingleObject hThread, &H9C4
                'on recupere le code de retour de FreeLibrary (si = 1 le module a bien été dechargé)
                GetExitCodeThread hThread, UnLoadModuleFromProcess
                CloseHandle hThread
            End If
        End If
        
        CloseHandle hProcess
    End If
    
End Function


 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De MadMatt le 28/12/2006 à 21:21


Salut,
vraiment très bon code, j'en apprend pas mal ce soir, par contre je me posais un question.
Imaginons qu'on charge une DLL dans un processus en créant un nouveau thread (si j'ai bien compris j'espère ??), quelle est la fonction qui va s'executer ? La sub Main()
Car CreateRemoteThread va executer LoadLibrary avec comme parametre le chemin d'accès à la DLL (qui sera chargée en mémoire dans la mémoire du process), mais LoadLibrary ça execute quelque chose dans la librairie chargée après ?

 

De sebdraluorg le 28/12/2006 à 21:51


Salut Mad,

Eh oui la fonction Main de la dll sera executée, mais si on prend le cas d'une dll api elle n'execute rien au chargement, elle renvoi juste un code de retour.

Pour executer une fonction de la dll apres son chargement tu fais:
MaFonction = GetProcAddress(Handle_Dll,Nom_Fonction)
Et puis tu fais un CreateRemoteThread sur cette fonction

C'est le meme principe qu'avec LoadLibrary sauf que tu dois d'abord charger ta dll contrairement a LoadLibrary qui est dans Kernel32.dll et qui est d'office chargée par tous les process Win32.

++

 

De MadMatt le 28/12/2006 à 21:54


ahhh ok

Et donc derrière, tout thread créé avec cette méthode s'execute derrière le processus visé (et non pas le notre) ?
Ah ouais je vois tout de suite les "portes" que ça ouvre ^^
Et pas moyen à partir d'un thread, de remonter à quel processus qui l'a créé ?

 

De sebdraluorg le 28/12/2006 à 23:02


Eh tu veux dire savoir quel process a crée un RemoteThread ?

Eh honnetement je ne sais pas, faudrait voir ce que renvoi les proprietes des threads voir si on sait recuperer le "Parent Process".

 

De MadMatt le 29/12/2006 à 01:22


Ouais histoire de voir quel processus injecte des dll dans d'autre processus.
Mais logiquement, si le remotethread a été créé dans l'autre processus, toute cette manip est faite pour que son process parent soit le processus visé, et non pas le processus original (enfin je sais pas remarque)
Effectivement c'est à creuser

 

De sebdraluorg le 29/12/2006 à 13:06


Yep c'est ce que je me suis dit aussi, de toutes facons dans cet exemple le Thread s'arrete une fois la dll chargée. Donc je ne pense pas que l'on puisse retrouver quel process a chargé la dll.

Par contre si je fais appel a CreateRemoteThread sur un Sub genre Sleep, le RemoteThread ne s'arrete pas apres l'appel a Sleep sans doutes parceque Sleep ne renvoi rien... Et donc faut penser a le terminer.

Sinon encore une petite precision, il n'est pas necessaire de charger la dll dans le process pour utiliser une de ses fonctions depuis CreateRemoteThread.
On peut charger la dll dans notre process et Creer un RemoteThread. Ici c'etait un exemple mais en general ce ne seront pas des dll api que l'on va charger mais plus des dll de debogage ou de Hooking ou encore un bot pour un jeu etc...

++

 

De Draccovlad le 24/12/2008 à 14:17


Vraiment un code interressant!!
mais lorsque j'essaie de remplacer la fonction "LoadLibraryA" par -par example-: "GetCommandLineA" et bien comment poursuivre/faire pour l'avoir??

merci infiniment..

 

De sebdraluorg le 24/12/2008 à 15:50


Salut,

Pas besoin d'injection de code pour recuperer le CommandLine meme si c'est faisable, je t'ai repondu ici:
http://vbsystemlibrary.free.fr/code.php?ID=34

++

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.015 s
www.mnapoli.fr