远程注入Dll宿主崩溃解决方法

远程注入Dll宿主崩溃
这两天在学习Dll以及Hook的相关知识,确切的说是《win核心编程的22章节》。
学习了一下Dll的远程注入,刚看了前4节,基本都是在讲Dll的远程注入,书本写的比较精简,有些不了解的看了一些博客。下午着手写了一些Dll注入的代码,现在有个致命的问题:一旦Dll导入到宿主程序,宿主程序就会崩溃。

系统是win764位的,开始的时候有些权限问题,后面百度+谷歌基本解决。

具体代码如下:
//启动程序我写的是MFC的程序,实现思路是在如下Inject按钮的响应函数中开启一个线程,在线程中进行相应的远程注入操作。
具体注入代码如下:
基本思路是:获取远程进程句柄,分配内存,写入文件路径名,注入Dll。
	HANDLE hDestHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, g_dwPID);
if (!hDestHandle)
{
CloseHandle(hDestHandle);
AfxMessageBox(L"查找进程失败!");
return 0;
}
PVOID lpDest = VirtualAllocEx(hDestHandle, NULL, 1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (NULL == lpDest)
{
CloseHandle(hDestHandle);
AfxMessageBox(L"内存分配失败!");
return 0;
}
if (!WriteProcessMemory(hDestHandle, lpDest, L"E:\\shanyy\\workspace\\vs2012\\FloatPowerProj\\MFCApplication4\\Debug\\VirusDll.dll", sizeof(L"E:\\shanyy\\workspace\\vs2012\\FloatPowerProj\\MFCApplication4\\Debug\\VirusDll.dll"), NULL))
{
VirtualFreeEx(hDestHandle, lpDest, 1024, MEM_RELEASE);
CloseHandle(hDestHandle);
AfxMessageBox(L"远程写入数据失败!");
return 0;
}
EnableDebugPrivilege(GetCurrentProcess());
LPTHREAD_START_ROUTINE lpnThreadRtn = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryW");
HANDLE hThread = CreateRemoteThread(hDestHandle, NULL, 0, lpnThreadRtn, lpDest, 0, NULL);
if (!hThread)
{
DWORD e = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL
);
AfxMessageBox((LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
VirtualFreeEx(hDestHandle, lpDest, 1024, MEM_RELEASE);
CloseHandle(hDestHandle);
return 0;
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hDestHandle, lpDest, 1024, MEM_RELEASE);
CloseHandle(hDestHandle);


由于只是测试,我这里的Dll写的很简单,只有一个DllMain函数,在case DLL_PROCESS_ATTACH里启动一个线程,然后在线程里FreeLibraryAndExitThread,这样可以不用写释放的代码,看了下,释放代码跟注入代码差不多。中途适当地给了一些对话框。
Dll的代码如下:
HINSTANCE hMudle;

unsigned int _stdcall DllProc(void* lpP)
{
MessageBox(NULL, L"Virus is delete!", L"Warnning!",MB_OK);
FreeLibraryAndExitThread(hMudle, 0);
return 0;
}

BOOL APIENTRY DllMain(HINSTANCE hMudle, DWORD dwReason, void* lpR)
{
HANDLE hThread;
switch (dwReason)
{
case DLL_THREAD_ATTACH:
case DLL_PROCESS_ATTACH:
MessageBox(NULL, L"Virus is Injected!", L"Virus.exe", MB_OK);
hThread = (HANDLE)_beginthreadex(NULL, 0, DllProc, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
MessageBox(NULL, L"Virus is delete!", L"Virus.exe", MB_OK);
break;
}
return TRUE;
}


问题是,一旦注入到目标程序,可以弹出响应的对话框,但是宿主程序会不响应,查了很长时间也没查出具体原因,求指导。。。
------解决思路----------------------
本帖最后由 VisualEleven 于 2015-04-13 18:22:28 编辑
BOOL APIENTRY DllMain(HINSTANCE hMudle, DWORD dwReason, void* lpR)
{
HANDLE hThread;
switch (dwReason)
{
case DLL_THREAD_ATTACH:
case DLL_PROCESS_ATTACH:
MessageBox(NULL, L"Virus is Injected!", L"Virus.exe", MB_OK);
hThread = (HANDLE)_beginthreadex(NULL, 0, DllProc, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE); <----- 这一行
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
MessageBox(NULL, L"Virus is delete!", L"Virus.exe", MB_OK);
break;
}
return TRUE;
}


把WaitForSingleObject(hThread, INFINITE); 注释掉试一下,