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
相关产品推荐
相关产品推荐

