2011-06-15 2 views
1

J'essaie d'injecter une DLL dans un processus existant. J'essaie d'utiliser la méthode CreateRemoteThread LoadLibrary. Je comprends comment cela fonctionne, mais je ne peux pas comprendre pourquoi CreateRemoteThread renvoie null (échouer) ... Je suis sur Windows 7 donc c'est peut-être la raison, mais je ne sais pas avec certitude si c'est ... Peut-être que j'ai besoin définir des privaleges? Mon code est ci-dessous:Windows 7 DLL Injection

#define DLL_NAME "message.dll" 

void main() 
{ 
    InjectDLL(1288, DLL_NAME); 
} 

BOOL InjectDLL(DWORD dwProcessId, LPCSTR lpszDLLPath) 
{ 

    HANDLE hProcess, hThread; 
    LPVOID lpBaseAddr, lpFuncAddr; 
    DWORD dwMemSize, dwExitCode; 
    BOOL bSuccess = FALSE; 
    HMODULE hUserDLL; 

    if((hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION 
     |PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, dwProcessId))) 
    { 
     dwMemSize = lstrlen(lpszDLLPath) + 1; 
     if(lpBaseAddr = VirtualAllocEx(hProcess, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE)) 
     { 
      if(WriteProcessMemory(hProcess, lpBaseAddr, lpszDLLPath, dwMemSize, NULL)) 
      { 
       if(hUserDLL = LoadLibrary(TEXT("kernel32.dll"))) 
       { 
        if(lpFuncAddr = GetProcAddress(hUserDLL, TEXT("LoadLibraryA"))) 
        { 
         if(hThread = CreateRemoteThread(hProcess, NULL, 0, lpFuncAddr, lpBaseAddr, 0, NULL)) 
         { 
          WaitForSingleObject(hThread, INFINITE); 
          if(GetExitCodeThread(hThread, &dwExitCode)) { 
           bSuccess = (dwExitCode != 0) ? TRUE : FALSE; 
          } 
          CloseHandle(hThread); 
         } 
        } 
        FreeLibrary(hUserDLL); 
       } 
      } 
      VirtualFreeEx(hProcess, lpBaseAddr, 0, MEM_RELEASE); 
     } 
     CloseHandle(hProcess); 
    } 

    return bSuccess; 
} 
+0

Votre processus est-il exécuté en tant qu'administrateur (et élevé)? –

+2

quelle erreur est renvoyée par 'GetLastError'? – Necrolis

Répondre

1

oui vous avez besoin de privilèges avant d'ouvrir la précession, voici le code:


int GimmePrivileges(){ 
HANDLE Token; 
TOKEN_PRIVILEGES tp;  
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &Token)  
{ 
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);  
tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(Token, 0, &tp, sizeof(tp), NULL, NULL); } }

Une autre chose ... ce code est source de confusion !!! vous devez synthétiser!