各位好,我有一段注入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;
}
现在遇到一个很诡异的问题,我在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;
}
解决方案 »
- 树形控件的俩个问题
- 关于聊天室服务端的实现
- 关于IplImage中的imageData的问题,请教各位!
- 当应用程序(如游戏)进入全屏模式之后,怎么在屏幕的某一区域绘制自己的图形?
- 如何获取某个托盘图标在屏幕上的位置?
- 关于MSChart显示的问题
- 菜鸟请教:关于打印RMB符号,为什么这样写不行啊?请指点……
- 菜鸟散分:CEdit::GetLine这个函数返回值怎么多两个字符啊?
- 请高手指教关于Microsoft Visual Studio .NET 2003通信的问题
- 请问为什么给对话框的线程设了钩子,却得不到点击对话框的按钮的消息(详情请进)
- 属性表单
- ConCreateInstance失败???
hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION | PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);
权限问题 这样处理就好了