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

时间:2011-11-22 11:47:15

标签: c++ dll code-injection crt


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

  

运行时错误!
程序:C:\ Program Files \ Microsoft   Office \ Office14 \ OUTLOOK.EXE

R6030
- CRT未初始化

例如,Outlook和Winword可以重现这一点。虽然记事本,IE,CMD,Calc和许多其他人 - 打印消息框并继续正常。

打印消息框对我来说不是必须的,所以我只想检查CRT是否已经完成初始化,所以我可以正常地继续这样:

case DLL_PROCESS_ATTACH:
     if (IsCRTInitialized())
        MessageBox(...);

如果缺少某些信息,请告诉我。 谢谢!

2 个答案:

答案 0 :(得分:3)

当调用入口点函数 DLLMain 时,保证在进程地址空间中加载Kernel32.dll。 MessageBox 驻留在 user32.dll 中,并且根据 Best practices for creating DLL user32.dll 调用函数是严格禁止。

你可以

  1. 调用 OutputDebugString 进行任何调试程序跟踪。此函数驻留在kernel32.dll中,应该可以安全地调用。

  2. 在您的应用程序加载任何其他dll之前,请自行调用 MessageBox 。这将确保user32.dll及其依赖项 已加载。这样在DllMain中调用 MessageBox 可能会有 更好的成功机会。但你的里程可能会有所不同。

答案 1 :(得分:2)

问题不在于CRT。您不能从MessageBox

致电DllMain或任何其他非重要功能