You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中CreateRemoteThread实现DLL注入返回0的问题求助

DLL注入中CreateRemoteThread返回0的问题排查与解决

CreateRemoteThread返回0意味着调用失败,第一步必须调用GetLastError()获取具体错误代码,这是定位问题的核心依据。你当前的代码没有检查每一步操作的返回值,很多潜在问题被掩盖了,先给你补上完整的错误检查逻辑,再逐一分析可能的原因:

修改后的带错误检查的代码

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

int main() {
    // DLL路径
    LPCSTR dllPath = "C:\\Users\\user\\OneDrive\\Desktop\\dllname.dll";
    DWORD pid = 9440;

    // 请求最小必要权限,避免PROCESS_ALL_ACCESS被系统拒绝
    HANDLE hProcess = OpenProcess(
        PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | 
        PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
        FALSE, pid
    );
    if (hProcess == NULL) {
        std::cout << "OpenProcess失败,错误码: " << GetLastError() << std::endl;
        return 1;
    }

    // 分配远程进程内存
    SIZE_T pathSize = strlen(dllPath) + 1;
    LPVOID baseAddress = VirtualAllocEx(hProcess, NULL, pathSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (baseAddress == NULL) {
        std::cout << "VirtualAllocEx失败,错误码: " << GetLastError() << std::endl;
        CloseHandle(hProcess);
        return 1;
    }

    // 写入DLL路径到远程内存
    BOOL writeSuccess = WriteProcessMemory(hProcess, baseAddress, dllPath, pathSize, NULL);
    if (!writeSuccess) {
        std::cout << "WriteProcessMemory失败,错误码: " << GetLastError() << std::endl;
        VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return 1;
    }

    // 获取LoadLibraryA地址
    HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
    if (hKernel32 == NULL) {
        std::cout << "GetModuleHandleA失败,错误码: " << GetLastError() << std::endl;
        VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return 1;
    }
    LPVOID loadLibrary = GetProcAddress(hKernel32, "LoadLibraryA");
    if (loadLibrary == NULL) {
        std::cout << "GetProcAddress失败,错误码: " << GetLastError() << std::endl;
        VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return 1;
    }

    // 创建远程线程
    HANDLE hLoadThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibrary, baseAddress, 0, NULL);
    if (hLoadThread == NULL) {
        std::cout << "CreateRemoteThread失败,错误码: " << GetLastError() << std::endl;
        VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return 1;
    }

    // 等待线程执行完成
    WaitForSingleObject(hLoadThread, INFINITE);

    // 调试输出
    std::cout << "注入成功。" << std::endl << std::endl;
    std::cout << "hProcess: " << hProcess << std::endl;
    std::cout << "baseAddress: " << baseAddress << std::endl;
    std::cout << "loadLibrary地址: " << loadLibrary << std::endl;
    std::cout << "hLoadThread: " << hLoadThread << std::endl;

    // 资源清理
    CloseHandle(hLoadThread);
    VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
    CloseHandle(hProcess);

    std::cin.get();
    return 0;
}

常见问题排查方向

1. 权限不足

  • 不要使用PROCESS_ALL_ACCESS,该权限过于宽泛,多数系统会直接拒绝。改用代码中的最小必要权限组合。
  • 若目标进程是系统进程或高权限进程,注入程序需要以管理员身份运行。

2. 进程位数不匹配

  • 注入程序与目标进程必须同位数(均为32位或均为64位)。若位数不匹配,LoadLibraryA的地址在两个进程中不兼容,会导致CreateRemoteThread失败,错误码通常为ERROR_BAD_EXE_FORMAT(193)。

3. DLL路径问题

  • 确认DLL路径绝对正确,无拼写错误,且目标进程有权限访问该路径(比如OneDrive路径可能存在同步权限问题,建议先将DLL放到本地磁盘根目录测试)。
  • 若路径包含空格,需确保传递的路径完整,未被截断。

4. 系统防护拦截

  • Windows Defender或第三方杀毒软件会拦截远程线程创建操作,可临时关闭防护或将注入程序与DLL加入白名单测试。

5. 目标进程状态异常

  • 确认PID为9440的进程确实在运行,且未处于挂起、崩溃等异常状态。

运行修改后的代码,根据GetLastError()返回的错误码可精准定位问题:

  • 错误码5:权限不足,需提升程序权限或调整OpenProcess的权限参数。
  • 错误码193:进程位数不匹配。
  • 错误码2:DLL路径不存在或无法访问。

内容的提问来源于stack exchange,提问作者user19435240

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:54:25