Api Win32 : CreateRemoteThread

Api Win32 : CreateRemoteThread - C - Programmation

Marsh Posté le 06-08-2005 à 16:42:29    

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 :D !
 
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 :
  1. // [...]
  2. // Déclaration des fonctions
  3. // [...]
  4. int injection(HANDLE hProc,char *DLL )
  5. {
  6.     char *AllocMem;
  7.     LPTHREAD_START_ROUTINE inject;
  8.     int Size = strlen(DLL)+1;
  9.     // On réserve un espace mémoire dans la mémoire du processus
  10.     AllocMem = (char *)VirtualAllocEx(hProc,NULL,Size,MEM_COMMIT,PAGE_READWRITE);
  11.     // On écrit à l'adresse où on a alloué de la mémoire le contenu de la dll
  12.     WriteProcessMemory(hProc,AllocMem,DLL,Size,NULL);
  13.     // On récupère l'adresse de la fonction LoadLibrary de kernel32.dll
  14.     inject = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll" ),"LoadLibraryA" );
  15.     if(!inject)
  16.         MessageBox(NULL,"Erreur récupération adresse de LoadLibrary","Erreur",MB_OK);
  17.     // On créé le Thread dans le processus hProc a l'adresse de LoadLibrary récupérée
  18.     // précédemment avec le GetProcAddress et on passe comme paramètre AllocMem
  19.     HANDLE hThread = CreateRemoteThread(hProc,NULL,0,inject,(void *)AllocMem,0,NULL);
  20.     if (!hThread)
  21.         MessageBox(NULL,"Erreur au CreateRemoteThread","Erreur",MB_OK);
  22.     // On règle le time-out à 20 secondes
  23.     DWORD Result;
  24.     Result = WaitForSingleObject(hThread, 20000);
  25.     if (Result == WAIT_TIMEOUT || Result == WAIT_ABANDONED || Result == WAIT_FAILED)
  26.        MessageBox(NULL,"Time-out","Erreur",MB_OK);
  27.     // On libère la mémoire
  28.     VirtualFreeEx (hProc,(void *)AllocMem,0,MEM_RELEASE);
  29.     if(hThread!=NULL)
  30.         CloseHandle (hThread);
  31.     return 1;
  32. }
  33. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
  34.  
  35.     // [ ... ]
  36.     // Récupération des Pid (fonction utilisateur) :
  37.     unsigned long PID,myPID;
  38.     PID = Pid("winlogon.exe" );
  39.     myPID = Pid("injection.exe" );
  40.     HANDLE Token;
  41.     TOKEN_PRIVILEGES TokenIn,TokenOut;
  42.     DWORD TokenLength;
  43.     _LUID Luid;
  44.     HANDLE hProc,myhProc;
  45.     myhProc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,myPID);
  46.     //Obtention des privilèges
  47.     OpenProcessToken(myhProc,TOKEN_ALL_ACCESS,&Token);
  48.     LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid);
  49.     TokenIn.PrivilegeCount = 1;
  50.     TokenIn.Privileges[0].Luid = Luid;
  51.     TokenIn.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  52.     AdjustTokenPrivileges(Token,FALSE,&TokenIn, sizeof(TOKEN_PRIVILEGES),&TokenOut,&TokenLength);
  53.     // Vérification
  54.     int  *out = (int *)malloc(sizeof(int *));
  55.     if(PrivilegeCheck(Token,&CheckPriv,out) == TRUE)
  56.         MessageBox(NULL,"ok","ok",MB_OK);
  57.     hProc = OpenProcess(PROCESS_ALL_ACCESS,TRUE,PID);
  58.     char CurrentDirectory[MAX_PATH];
  59.     GetCurrentDirectory(sizeof(CurrentDirectory),CurrentDirectory);
  60.     strcat(CurrentDirectory,"\\testDLL.dll" );
  61.     injection(hProc,CurrentDirectory);
  62.     return 0;
  63. }


 
Merci et @+,
Deimos

Reply

Marsh Posté le 06-08-2005 à 16:42:29   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed