Deimos_ | Salut à tous,
J'ai un petit problème avec mon programme qui injecte un Thread à un processus ... En fait ça marche parfaitement bien lorsque c'est sur un programme ordinaire que j'injecte ma routine, comme par exemple mspaint.exe, ou n'importe quel autre exécutable.
Par contre, dès que c'est un exécutable natif de Windows XP, comme explorer.exe ou winlogon.exe ça plante ... Je le sais grâce au WaitForSingleObject() après le CreateRemoteThread() qui me dit que ya timeout, mais aussi car ya tout qui freeze !
Tout le monde va me dire : "T'as les privilèges ?" ... Ouais, je les ai les pirivilèges avec LookupPrivilegeValue(), AdjustTokenPrivileges() et tout le box ... Et ça marche très bien, j'ai vérifié avec PrivilegeCheck() !
J'ai aussi pensé que c'était la routine que j'injectait qui faisait foirer le tout, mais non, puisque je teste pour l'instant avec qu'une MessageBox(), et comme je l'ai dit avant : avec mspaint.exe, ça marche !
Voilà le bout de code nécessaire :
Code :
- // [...]
- // Déclaration des fonctions
- // [...]
- int injection(HANDLE hProc,char *DLL )
- {
- char *AllocMem;
- LPTHREAD_START_ROUTINE inject;
- int Size = strlen(DLL)+1;
- // On réserve un espace mémoire dans la mémoire du processus
- AllocMem = (char *)VirtualAllocEx(hProc,NULL,Size,MEM_COMMIT,PAGE_READWRITE);
- // On écrit à l'adresse où on a alloué de la mémoire le contenu de la dll
- WriteProcessMemory(hProc,AllocMem,DLL,Size,NULL);
- // On récupère l'adresse de la fonction LoadLibrary de kernel32.dll
- inject = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll" ),"LoadLibraryA" );
- if(!inject)
- MessageBox(NULL,"Erreur récupération adresse de LoadLibrary","Erreur",MB_OK);
- // On créé le Thread dans le processus hProc a l'adresse de LoadLibrary récupérée
- // précédemment avec le GetProcAddress et on passe comme paramètre AllocMem
- HANDLE hThread = CreateRemoteThread(hProc,NULL,0,inject,(void *)AllocMem,0,NULL);
- if (!hThread)
- MessageBox(NULL,"Erreur au CreateRemoteThread","Erreur",MB_OK);
- // On règle le time-out à 20 secondes
- DWORD Result;
- Result = WaitForSingleObject(hThread, 20000);
- if (Result == WAIT_TIMEOUT || Result == WAIT_ABANDONED || Result == WAIT_FAILED)
- MessageBox(NULL,"Time-out","Erreur",MB_OK);
- // On libère la mémoire
- VirtualFreeEx (hProc,(void *)AllocMem,0,MEM_RELEASE);
- if(hThread!=NULL)
- CloseHandle (hThread);
- return 1;
- }
- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
-
- // [ ... ]
- // Récupération des Pid (fonction utilisateur) :
- unsigned long PID,myPID;
- PID = Pid("winlogon.exe" );
- myPID = Pid("injection.exe" );
- HANDLE Token;
- TOKEN_PRIVILEGES TokenIn,TokenOut;
- DWORD TokenLength;
- _LUID Luid;
- HANDLE hProc,myhProc;
- myhProc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,myPID);
- //Obtention des privilèges
- OpenProcessToken(myhProc,TOKEN_ALL_ACCESS,&Token);
- LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid);
- TokenIn.PrivilegeCount = 1;
- TokenIn.Privileges[0].Luid = Luid;
- TokenIn.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- AdjustTokenPrivileges(Token,FALSE,&TokenIn, sizeof(TOKEN_PRIVILEGES),&TokenOut,&TokenLength);
- // Vérification
- int *out = (int *)malloc(sizeof(int *));
- if(PrivilegeCheck(Token,&CheckPriv,out) == TRUE)
- MessageBox(NULL,"ok","ok",MB_OK);
- hProc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,PID);
- char CurrentDirectory[MAX_PATH];
- GetCurrentDirectory(sizeof(CurrentDirectory),CurrentDirectory);
- strcat(CurrentDirectory,"\\testDLL.dll" );
- injection(hProc,CurrentDirectory);
- return 0;
- }
|
Merci et @+,
Deimos |