c – 检测CRT初始化是否在注入过程中完成

我正在开发一个在进程启动时注入一个dll的应用程序(Suspend – > Inject – > Resume)
DllMain中第一次调用DLL_PROCESS_ATTACH(在我注入的DLL中)是对MessageBox()的调用(仅用于调试目的).
但是,对MessageBox()的这种调用有时会弹出错误并导致注入的进程崩溃.

Runtime Error!
Program: C:\Program Files\Microsoft
Office\Office14\OUTLOOK.EXE

R6030
– 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可能有
更好的成功机会.但你的里程可能会有所不同

上一篇:群晖开启https ssl证书获取及安装


下一篇:「2019.7.22 考试」AC和WA0一步之遥