各位好,我有一段注入DLL的C++程序,由于需要在C#项目中运行,我把这段注入DLL的程序封装成了DLL中的一个函数,用C#程序来调用这个函数。
现在遇到一个很诡异的问题,我在C#程序的调试模式下运行程序,DLL可以成功地注入到目标进程里。而如果我用exe直接执行(debug/release都试过),就没法实现注入,目标进程的句柄hProcess会直接返回一个空值。不知道大家遇没遇到过这种问题,请高手指点一下,万分感谢!BOOL WINAPI LoadLib(DWORD dwProcessId, LPTSTR lpszLibName)
{
BOOL   bResult          = FALSE; 
HANDLE hProcess         = NULL;
HANDLE hThread          = NULL;
PSTR   pszLibFileRemote = NULL;
    MessageBox(NULL,_T("LoadLib"),NULL,0);
__try 
{
// 获得想要注入代码的进程的句柄.

hProcess = OpenProcess(
PROCESS_ALL_ACCESS, 
FALSE, 
dwProcessId
); if (hProcess == NULL) 
__leave;
MessageBox(NULL,_T("OpenProcess"),NULL,0);

    // 计算DLL路径名需要的字节数.
int cch = 1 + strlen(lpszLibName); // 在远程线程中为路径名分配空间.
pszLibFileRemote = (PSTR)VirtualAllocEx(
hProcess, 
NULL, 
cch, 
MEM_COMMIT, 
PAGE_READWRITE
); if (pszLibFileRemote == NULL) 
__leave;
MessageBox(NULL,_T("VirtualAllocEx"),NULL,0);
    
// 将DLL的路径名复制到远程进程的内存空间.
if (!WriteProcessMemory(
hProcess, 
(PVOID)pszLibFileRemote, 
(PVOID)lpszLibName, 
cch, 
NULL)) 
__leave;
    MessageBox(NULL,_T("WriteProcessMemory"),NULL,0);

   // 获得LoadLibraryA在Kernel32.dll中的真正地址. 
PTHREAD_START_ROUTINE pfnThreadRtn = 
(PTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle(_T("Kernel32")), "LoadLibraryA"); if (pfnThreadRtn == NULL) 
__leave;  MessageBox(NULL,_T("GetProcAddress"),NULL,0);     // 创建远程线程,并通过远程线程调用用户的DLL文件. 
hThread = CreateRemoteThread(
hProcess, 
NULL, 
0, 
pfnThreadRtn, 
(PVOID)pszLibFileRemote, 
0, 
NULL
);
if (hThread == NULL) 
__leave;
        MessageBox(NULL,_T("CreateRemoteThread"),NULL,0);
// 等待远程线程终止.
WaitForSingleObject(hThread, INFINITE); bResult = TRUE; 
}
__finally 

// 关闭句柄. 
if (pszLibFileRemote != NULL) 
VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE); if (hThread  != NULL) 
CloseHandle(hThread); if (hProcess != NULL) 
CloseHandle(hProcess);
}
return bResult;
}