2015-07-01 5 views
2

Я думаю, что мой код, наконец, работает сейчас. Проблема только в том, что по какой-то причине, хотя я открыл процесс с PROCESS_ALL_ACCESS, CreateRemoteThread возвращает ошибку: ERROR_ACCESS_DENIED.CreateRemoteThread - ERROR_ACCES_DENIED

Ошибка была получена с помощью GetLastError, и она выплевывает «5», что соответствует ERROR_ACCESS_DENIED.

#include <iostream> 
#include <windows.h> 
#include <TlHelp32.h> 

char* dllPath = "C:\\Users\\Kalist\\Desktop\\Projects\\DLL\\bin\\Debug\\DLL.dll"; 
char* ProcToInject = "calc.exe"; 

int main(){ 
    PROCESSENTRY32 pe32; 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if(procSnap == INVALID_HANDLE_VALUE){ 
     std::cout << "Snapshot function failed" << std::endl; 
    } 

    DWORD procID = 0; 
     if(Process32First(procSnap, &pe32)){ 
      do{ 
       if(!strcmp(pe32.szExeFile, ProcToInject)){ 
        procID = pe32.th32ProcessID; 
        break; 
       } 
      }while(Process32Next(procSnap, &pe32)); 
     } 
    CloseHandle(procSnap); 

    if(procID != 0){ 

     HANDLE procAccess = OpenProcess(PROCESS_ALL_ACCESS, false, procID); 
     if(procAccess == NULL){ 
      std::cout << "OpenProcess error: " << GetLastError() << std::endl; 
     } 

     LPVOID remoteString = (LPVOID)VirtualAllocEx(procAccess, NULL, strlen(dllPath)+1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
     if(remoteString == NULL){ 
      std::cout << "VirtualAllocEx error: " << GetLastError() << std::endl; 
     } 

     bool memoryWritten = WriteProcessMemory(procAccess, (LPVOID)remoteString, dllPath, strlen(dllPath)+1, NULL); 
     if(memoryWritten == 0){ 
      std::cout << "WriteProcessMemory error: " << GetLastError() << std::endl; 
     } 

     LPVOID getLibAdd = (LPVOID)GetProcAddress(GetModuleHandle("Kernel32.dll"), "LoadLibraryA"); 
     if(getLibAdd == NULL){ 
      std::cout << "GetProcAddress error: " << GetLastError() << std::endl; 
     } 

     HANDLE remoteThread = CreateRemoteThread(procAccess, NULL, 0, (LPTHREAD_START_ROUTINE)getLibAdd, (LPVOID)remoteString, 0, NULL); 
     if(remoteThread == NULL){ 
      std::cout << "CreateRemoteThread error: " << GetLastError() << std::endl; 
     } 
     CloseHandle(procAccess); 
    }else{ 
     std::cout << "Failed to retrieve procID" << std::endl; 
    } 
} 

ответ

3

Вы получите эту ошибку при попытке вызова CreateRemoteThread из 32 битного процесса, но когда целевой процесс 64-битный процесс. Я держу пари, что это то, что ты делаешь.

Для ввода в 64-разрядный процесс требуется также, чтобы процесс форсунки составлял 64 бит. И, очевидно, поскольку, как я уверен, вы уже знаете, DLL, которую вы вводите, также должна быть 64 бит.

Для чего вам не нужно много спрашивать, когда вы звоните OpenProcess. Я считаю, что все, что вам нужно, это:

PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION 
    | PROCESS_VM_WRITE | PROCESS_VM_READ