Injection de dll dans un processus

0/5 (8 avis)

Vue 13 456 fois - Téléchargée 597 fois

Description

Bonjour/Bonsoir,
Ce petit programme montre comment injecter une dll dans un processus.
Ce n'est pas très original mais bon...
Vous trouverez des explications ici : http://lilxam.blogspot.com/2008/01/injection-de-dll-dans-un-processus.html

Have Fun ;)
lilxam.

Source / Exemple :


#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

using namespace std;

void SetDebugPrivilege();
DWORD GetPIDByProcess(char argv[]);
int DllInject(char dll[], char process[]);

//Privilege DEBUG
void SetDebugPrivilege()
{
    TOKEN_PRIVILEGES privilege;
    LUID Luid;
    HANDLE handle1;
    HANDLE handle2;
    handle1 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    OpenProcessToken(handle1, TOKEN_ALL_ACCESS, &handle2);
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid);
    privilege.PrivilegeCount = 1;
    privilege.Privileges[0].Luid = Luid;
    privilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(handle2, FALSE, &privilege, sizeof(privilege), NULL, NULL);
    CloseHandle(handle2);
    CloseHandle(handle1);
}
//GetPIDByProcess
DWORD GetPIDByProcess(char argv[])
{
      HANDLE hSnapShot;
      PROCESSENTRY32 uProcess;
      
      hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);
      
      int p = 0;
      DWORD PID;
      
      p = Process32First(hSnapShot, &uProcess);
      
      while(p)
      {
              if(strstr(uProcess.szExeFile, argv))
              {
                                           PID = uProcess.th32ProcessID;
                                           break;
              }
              p = Process32Next(hSnapShot, &uProcess);
      }
      CloseHandle(hSnapShot);
      return PID;
}

int DllInject(char dll[], char process[])
{
    SetDebugPrivilege();
    
    // Etape 1 // On récupère l'adresse de LoadLibraryA() dans kernel32
    HMODULE module;
    module = GetModuleHandle("kernel32.dll");
    
    LPTHREAD_START_ROUTINE code;
    code = (LPTHREAD_START_ROUTINE)GetProcAddress(module, "LoadLibraryW");
    printf("\nAdresse de LoadLibrary() : %x", code);
    
    CloseHandle(module);
    
    // Etape2 // On récupère l'id de notre processus et on l'ouvre
    DWORD PID;
    PID = GetPIDByProcess(process);
    printf("\nProcess ID : %ld",PID);
    HANDLE hProcess = NULL;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    if(hProcess == NULL)
    {
                printf("\n\n[-]Echec lors de l'ouverture du processus\n----Erreur : %x ", GetLastError());
                return 0;
    }
    else
                printf("\n\n[+]Processus ouvert : %x",hProcess);
    
    
    // Etape 3 // On alloue un espace de mémoire dans le processus
    char *data = NULL;
    data = (char*) VirtualAllocEx(hProcess, 0, strlen(dll)+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if(data == NULL)
    {
            printf("\n[-]Echec de l'allocation de la memoire\n----Erreur : %x ",GetLastError());
            return 0;
    }
    else
            printf("\n[+]Mémoire allouee : ");
            printf("%x", data);
            
    // Etape 4 // On écrit le nom de notre dll dans l'espace alloué
    DWORD nboctets;
    WriteProcessMemory(hProcess, data, dll, strlen(dll)+1, &nboctets);

    if(strlen(dll)+1 != nboctets)
    {
                     printf("\n[-]Echec de l'ecriture dans le processus\n----Erreur : %x ", GetLastError());
                     return 0;
    }
    else
                     printf("\n[+]Ecriture dans le processus reussie\n----Avec %ld octets ecrits", nboctets);
    
    // Etape 5 // On créé un thread dans le processus qui executera LoadLibaryA() avec le nom de la dll comme parametre
    DWORD dwThreadID = 0;
    HANDLE hThread = NULL;
    hThread = CreateRemoteThread(hProcess, NULL, 0, code, data, 0, &dwThreadID);
    if(hThread == NULL)
    {
               printf("\n[-]Echec lors de l'execution des donnees\n----Erreur : %x ", GetLastError());
               return 0;
    }
    else
               printf("\n[+]Donnees executees");
    CloseHandle(hProcess);
    CloseHandle(hThread);
    
    return 1;
    
    
}

int main()
{
    SetDebugPrivilege();
    
    char process[100];
    char dll[100];
    
    cout<<"Process : ";
    cin>>process;
    
    cout<<"\n\nDll : ";
    cin>>dll;
    
    DllInject(dll, process);
    
    system("pause");
    return 0;
}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_Bleys
Messages postés
1
Date d'inscription
vendredi 24 novembre 2006
Statut
Membre
Dernière intervention
10 janvier 2009

10 janv. 2009 à 19:13
Bonsoir à tous,
Désole de faire remonter un ci vieux topic, mais en voulant réutiliser la méthode SetDebugPrivilege() j'ai une erreur lors de l'exécution de CloseHandle(handle2) ...
L'erreur est : invalid handle was specified

Une idée ?

Merci d'avance
ironzorg
Messages postés
45
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
27 juin 2008

21 févr. 2008 à 17:39
C'est possible de faire de l'injection de DLL en POSIX ? C4est a dire pas avec les API Win32 quoi...
lilxam7
Messages postés
12
Date d'inscription
dimanche 2 décembre 2007
Statut
Membre
Dernière intervention
3 février 2008

8 févr. 2008 à 18:50
Salut, tu as tout à fait raison, je corrige ça tout de suite.
deck_bsd
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
7 févr. 2008 à 19:38
Yop,


Es-tu sur de ceci ?

nbdebits *= 8;
if(strlen(dll)+1 != nbdebits)

Pour moi nbdebits sera tjrs différent car WriteProcessMemory renvoie le nombre de Bytes écrit et non de bit. 1 Bytes = 8 bits, donc pas besoin de faire * 8 .
lilxam7
Messages postés
12
Date d'inscription
dimanche 2 décembre 2007
Statut
Membre
Dernière intervention
3 février 2008

20 janv. 2008 à 19:36
Voilà, désolé j'avais voulu aller un peu trop vite.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.