远程线程注入DLL有关问题,dll中有死循环的话,主进程会阻塞,求解释

远程线程注入DLL问题,dll中有死循环的话,主进程会阻塞,求解释
本帖最后由 VisualEleven 于 2014-03-18 10:51:34 编辑
我在用远程载入dll的时候,dll里写入了消息循环(我试过不只是消息循环,只要是死循环现象都一样),但是注入时,被注入的应用程序(即进程,试过多个应用程序,都一样) 会一直阻塞(不是崩溃)。 我的理解是既然是新的线程,不论是不是死循环 都不应该影响主进程的操作,求解释。这是创建远程线程代码。
// 试图打开目标进程
HANDLE hProcess = ::OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|
PROCESS_VM_OPERATION, FALSE, dwProcessId);
if(hProcess == NULL)
return FALSE;


// 在目标进程中申请空间,存放字符串pszDllName,作为远程线程的参数
int cbSize = (strlen(m_szDllName) + 1);
LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, NULL, cbSize, MEM_COMMIT, 
PAGE_READWRITE);
::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL);

// 取得LoadLibraryA函数的地址,我们将以它作为远程线程函数启动
HMODULE hModule=::GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINE pfnStartRoutine = 
(LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "LoadLibraryA");


// 启动远程线程
HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, pfnStartRoutine, 
lpRemoteDllName, 0, NULL);
if(hRemoteThread == NULL)
{
::CloseHandle(hProcess);
return FALSE;
}
// 等待目标线程运行结束,即LoadLibraryA函数返回
::WaitForSingleObject(hRemoteThread, INFINITE);

::CloseHandle(hRemoteThread);
::CloseHandle(hProcess);
return TRUE;



下面是dll中的代码
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

switch(reason)
{
case DLL_PROCESS_ATTACH:
{
Form2=new TForm2(NULL);
Form2->Show();
}
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
{
Form2=new TForm2(NULL);
Form2->Show();
while(::GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); 
DispatchMessage(&msg); 
}
}
break;
case DLL_THREAD_DETACH:{
Form2=new TForm2(NULL);
Form2->Show();
while(::GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); 
DispatchMessage(&msg); 
}
}
break;
}
return 1;
}

------解决方案--------------------
引用:
Quote: 引用:

你是刚注入进去就卡死了还是做了什么操作才卡死?我这里注入计算器, 不会卡死, 但做一些操作才会卡死

我和你现象一样,感觉就是有消息发生后就卡死了,感觉注入的线程拦截了所有的消息

如果你的情况和我一样, 推荐阅读一下下面的几篇博客, 应该有帮助:
http://blog.****.net/breaksoftware/article/category/1294271