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;
}
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.