Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
528 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Api Win32 : CreateRemoteThread

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Api Win32 : CreateRemoteThread

n°1171310
Deimos_
Posté le 06-08-2005 à 16:42:29  profilanswer
 

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

mood
Publicité
Posté le 06-08-2005 à 16:42:29  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Api Win32 : CreateRemoteThread

 

Sujets relatifs
Api Windows : Cherche code complet pour GetOpenFileName(...)API de SIP
[RESOLU] [MySQL API C] Problème avec mysql_queryAPI à net use
Comment créer des formes avec les API ?Qu'est-ce qui empêche l'émulation parfaite Win32 ?
[win32] Message LB_GETSELITEMSWin32 - bitblt
[résolu]tabulation dans une appli hosté par du win32API du portail Vignette (VAP7.1)
Plus de sujets relatifs à : Api Win32 : CreateRemoteThread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR