我正在开发一个在进程启动时注入(inject) dll 的应用程序(挂起 --> 注入(inject) --> 恢复)
使用 DLL_PROCESS_ATTACH(在我注入(inject)的 dll 中)在 DllMain 中的第一个调用是对 MessageBox() 的调用(仅用于调试目的)。
但是,此对 MessageBox() 的调用有时会弹出错误并使注入(inject)的进程崩溃。
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 中并根据 Best practices for creating DLL 从 user32.dll 调用函数是严格禁止的。
你可以
调用 OutputDebugString 用于任何调试器跟踪。此函数位于 kernel32.dll 中,应该可以安全调用。
在您的应用程序加载任何其他 dll 之前,您自己调用 MessageBox。这将确保 user32.dll 及其依赖项是 已经加载。这样在 DllMain 中调用 MessageBox 可能有 更好的成功机会。但您的里程可能会有所不同。
关于c++ - 检测 CRT 初始化是否在注入(inject)进程中完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8226259/