怎么让DLL中代码完全执行完,然后卸载DLL

如何让DLL中代码完全执行完,然后卸载DLL?
本帖最后由 VisualEleven 于 2013-03-06 15:50:36 编辑
正在学习注入,有个问题,当DLL中线程还没执行完,DLL就被卸载了,导致被监控的目标程序崩溃,如何让DLL中代码完全执行完,然后卸载DLL.
以下是简化代码
BOOL loadDLL()
{
......
if( (hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0, 
pfnStartAddr,pszLibFileRemote,0,NULL))==NULL)
{
MessageBox(NULL,"注入失败","注入提示";MB_OK);
return FALSE;
}
 WaitForSingleObject(hRemoteThread ,INFINITE); 
return TRUE;
}
void UNLoadDLL()
{
卸载DLL,和loadLL方法一致........
}
int main()
{
while(1)    
 //连续监控if(loadDLL(...))
{
Sleep(...);//停顿一下,让DLL代码执行完
UnLoadDLL(...);
}
}
}
以下为DLL代码
OOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DWORD dwThreadId;
CreateThread(NULL,NULL,Thread,NULL,0,&dwThreadId);
     break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
break;
}
    return TRUE;
}
DWORD WINAPI Thread(LPVOID lpParam)
{
char PassWord[80]={0};
char UserName[80]={0};
............//获取取目标程序用户名和密码
MessageBox(NULL,UserName,"Username",MB_OK);
MessageBox(NULL,PassWord,"password",MB_OK);
return 0;
}

------解决方案--------------------
尝试下Hook FreeLibrary
------解决方案--------------------
在远程线程中使用一个Named event.
在外部线程,wait这个Named event.
------解决方案--------------------
外部调用者需要通过一个标志位等,Event等事件来判断是否执行完,执行完了,才释放
------解决方案--------------------

VOID WINAPI FreeLibraryAndExitThread(
  __in  HMODULE hModule,
  __in  DWORD dwExitCode
);