【问题标题】:CreateRemoteThread fails on Windows7 64bit for 32bit applications对于 32 位应用程序,CreateRemoteThread 在 Windows7 64 位上失败
【发布时间】:2019-06-19 06:29:32
【问题描述】:

我有一个将 dll 注入进程的代码。执行注入功能的进程始终与注入的进程处于相同的架构(x86 或 x64)中。但是由于某种原因,当注入和注入进程是 x86 架构时,在 Win7 64 位操作系统上,CreateRemoteThread 函数调用失败。令人惊讶的是,当操作系统是 Win10 64bit 时。 32 位进程工作正常。该代码也适用于带有 64 位进程的 Win7 64 位以及带有 32 位进程的 Win7 32 位。

我在 Internet 上查找了可能的原因,我所能找到的只是在 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?

【问题讨论】:

  • CreateRemoteThread 失败时,GetLastError() 会给出什么?
  • @GauravSehgal 我编辑了这篇文章。 GetLastError() 方法返回 5。
  • 5 表示ACCESS DENIED,你想注入什么进程?检查不同的进程(可能以较低的权限运行)。
  • @GauravSehgal 我正在注入多种进程,但主要是在 java 应用程序上进行测试。我以管理员身份运行。我认为情况并非如此,因为在 64 位模式下运行完全相同的 java 时,一切正常。
  • 它必须与 32-64 不匹配有关。仔细检查您尝试注入的进程和 dll 是否具有相同的架构。还要记住 wow64 重定向,检查 procmon 以确定是否某些 dll 或其依赖的 dll 正在从 64 位位置(system32)访问。

标签: c windows-7-x64 32-bit dll-injection createremotethread


【解决方案1】:

问题是我必须将PROCESS_QUERY_INFORMATION 添加到OpenProcess 标志。这是非常棘手的,因为如果你不包括这个标志,它仍然可以在任何地方工作,除了 Win7 64 位操作系统和 32 位应用程序的情况。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2016-05-17
    相关资源
    最近更新 更多