0/5 (8 avis)
Vue 13 456 fois - Téléchargée 597 fois
#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; }
10 janv. 2009 à 19:13
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
21 févr. 2008 à 17:39
8 févr. 2008 à 18:50
7 févr. 2008 à 19:38
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 .
20 janv. 2008 à 19:36
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.