我正在开发一个在进程启动时注入一个dll的应用程序(Suspend – > Inject – > Resume)
DllMain中第一次调用DLL_PROCESS_ATTACH(在我注入的DLL中)是对MessageBox()的调用(仅用于调试目的).
但是,对MessageBox()的这种调用有时会弹出错误并导致注入的进程崩溃.
Runtime Error!
Program: C:\Program Files\Microsoft
Office\Office14\OUTLOOK.EXER6030
– CRT not initialized
例如,Outlook和Winword可以重现这一点.虽然记事本,IE,CMD,Calc和许多其他人 – 打印消息框并继续正常.
打印消息框对我来说不是必须的,所以我只是想能够检查CRT是否已经完成初始化,所以我可以像这样继续:
case DLL_PROCESS_ATTACH:
if (IsCRTInitialized())
MessageBox(...);
如果缺少某些信息,请告诉我.
谢谢!
解决方法:
当调用入口点函数DLLMain时,保证Kernel32.dll被加载到进程地址空间中. MessageBox驻留在user32.dll中,并且根据来自user32.dll的Best practices for creating DLL调用函数是严格禁止的.
你也可以
>调用OutputDebugString进行任何调试器跟踪.此函数驻留在kernel32.dll中,应该可以安全地调用.
>在您的应用程序加载任何其他dll之前,请自行调用MessageBox.这将确保user32.dll及其依赖项
已加载.这样在DllMain中调用MessageBox可能有
更好的成功机会.但你的里程可能会有所不同