Сбой CreateRemoteThread на 64-битной Windows7 для 32-битных приложений - PullRequest
0 голосов
/ 19 июня 2019

У меня есть код, который внедряет DLL в процесс. Процесс, который выполняет функцию внедрения, всегда имеет ту же архитектуру (x86 или x64), что и внедренный процесс. Но по какой-то причине вызов функции CreateRemoteThread завершается неудачно в 64-битной ОС Win7, когда процессы внедрения и внедрения имеют архитектуру x86. Удивительно, но когда ОС Win10 64bit. 32-битные процессы работают нормально. Код также хорошо работает для 64-битной Win7 с 64-битными процессами и для 32-битной Win7 с 32-битными процессами.

Я искал в Интернете возможную причину, и все, что я мог найти, это то, что в Win7 иногда возникают проблемы с сессиями процесса. Я не думаю, что это так, поскольку и процессы внедрения, и инъекции являются сеансами пользователя.

При запуске GetLastError () я получаю 5 (ERROR_ACCESS_DENIED)

Это моя функция впрыска:

    DWORD Inject(DWORD PID, const char *dllname)
    {
        HANDLE hThread = NULL;
        BOOL writeSucceed = false;
        int cch = 0;

        cout << "Injector.dll : Injecting " << dllname << " to " << PID << endl;
        DWORD hLibModule;

        HMODULE hKernel32 = GetModuleHandle (TEXT ("Kernel32"));
        void *hProcess = OpenProcess (PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |
                                      PROCESS_VM_WRITE, false, PID);  

        cch = strlen (dllname) + 1;

        void *pLibRemote = VirtualAllocEx (hProcess, NULL, cch, MEM_COMMIT,
            PAGE_READWRITE);

        writeSucceed = WriteProcessMemory (hProcess, pLibRemote, (void *) dllname, cch, NULL);

        hThread = CreateRemoteThread (hProcess, NULL, 0,
                                            (PTHREAD_START_ROUTINE)
                                            GetProcAddress (hKernel32,
                                            "LoadLibraryA"),
                                            pLibRemote, 0, NULL);

        WaitForSingleObject (hThread, INFINITE);
        GetExitCodeThread( hThread, &hLibModule );
        CloseHandle (hThread);

        VirtualFreeEx (hProcess, pLibRemote, sizeof (dllname), MEM_RELEASE);

        hThread = CreateRemoteThread (hProcess, NULL, 0,
                                     (PTHREAD_START_ROUTINE) GetProcAddress (hKernel32,
                                     "FreeLibrary"),
                                     (void *) hLibModule, 0, NULL);
        WaitForSingleObject (hThread, INFINITE);
        CloseHandle (hThread);
        return 0;
    }

Is there some special treatment I should do in code for Windows 7?

1 Ответ

1 голос
/ 23 июня 2019

Проблема была в том, что мне пришлось добавить PROCESS_QUERY_INFORMATION к OpenProcess флажкам.Это было очень сложно, так как если вы не включите этот флаг, он все равно будет работать везде, кроме случая 64-битной ОС Win7 и 32-битного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...