簡體   English   中英

對於32位應用程序,Windows 7 64位上的CreateRemoteThread失敗

[英]CreateRemoteThread fails on Windows7 64bit for 32bit applications

我有一個將dll注入進程的代碼。 執行注入功能的進程始終與注入進程具有相同的體系結構(x86或x64)。 但是由於某些原因,當注入和注入的進程是x86體系結構時,CreateRemoteThread函數調用在Win7 64位OS上失敗。 令人驚訝的是,當操作系統為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?

問題是我必須將PROCESS_QUERY_INFORMATION添加到OpenProcess標志中。 這非常棘手,因為如果不包括該標志,它將在除Win7 64位OS和32位應用程序外的任何地方都可以使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM