注入的DLL主循环使进程崩溃

时间:2016-04-11 20:09:11

标签: c++ c winapi dll

我目前正在尝试将DLL注入项目中,但每次使用while循环时,进程都会崩溃。 这是代码:

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved ){
    switch(ul_reason_for_call){
    case DLL_PROCESS_ATTACH:
        while(char c = getch()){
            if(c == 'p'){
                MessageBox(0,L"CAPT",L"CAPT",MB_OK);
            }
        }   
        break;
    }
return TRUE;
}

1 个答案:

答案 0 :(得分:2)

既然你改变了原来的问题,我会稍微重新安排一下我的答案......

在DLL入口点可以安全地执行的操作存在很大的限制。

请仔细阅读以下页面上的翻拍: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspxhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa370448(v=vs.85).aspx

例如,在DLL_PROCESS_ATTACH期间,它不应超过300毫秒(推荐时间)。你也没有返回任何东西(应该是一个布尔值)。

但是,我认为您的软件挂起的主要原因是因为MessageBox和/或getch()可能会在那里造成死锁。关于MessageBox使用OutputDebugString,请参阅此答案:https://stackoverflow.com/a/10981735/5874704

同样如评论中所述:

  

不要在DllMain中放置while循环。在DllMain中使用CreateThread启动新线程。把while循环放在那里

以前您还询问了DLLMain的定义。这是DllMain的"裸"功能:

BOOL WINAPI DllMain( 
   HINSTANCE hDllHandle, 
   DWORD     nReason, 
   LPVOID    Reserved)
{
   BOOL bSuccess = TRUE;
   switch ( nReason )
   {
      case DLL_PROCESS_ATTACH:
          break;
      case DLL_PROCESS_DETACH:
         break;  
      case DLL_THREAD_ATTACH:
         break;
      case DLL_THREAD_DETACH:
         break;
   }

   return bSuccess;

}