Injection de dll dans un processus

Soyez le premier à donner votre avis sur cette source.

Vue 12 492 fois - Téléchargée 563 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
Messages postés
1
Date d'inscription
vendredi 24 novembre 2006
Statut
Membre
Dernière intervention
10 janvier 2009

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
Messages postés
45
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
27 juin 2008

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

Salut, tu as tout à fait raison, je corrige ça tout de suite.
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
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 .
Messages postés
12
Date d'inscription
dimanche 2 décembre 2007
Statut
Membre
Dernière intervention
3 février 2008

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.