c++ - 检测 CRT 初始化是否在注入(inject)进程中完成

标签 c++ dll code-injection crt


我正在开发一个在进程启动时注入(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 调用函数是严格禁止的。

你可以

  1. 调用 OutputDebugString 用于任何调试器跟踪。此函数位于 kernel32.dll 中,应该可以安全调用。

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

关于c++ - 检测 CRT 初始化是否在注入(inject)进程中完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8226259/

相关文章:

c++ - 我该如何解决错误 C2059 : syntax error : 'string' "

windows - 函数 Hook 实际上是如何工作的? WinAPI, C++

c++ - 从终端手动运行时,我的项目找不到它的库

macos - SIMBL/Bundle/dylib 注入(inject) Dock.app

php - 准备好的语句会完全保护我的网站免受 MySQL 注入(inject)吗?

c++ - wxCheckListBox 过滤函数

c++ - HTTPS 客户端和服务器一起使用 C++ 和 POCO 库(SSL 上下文问题)?

c++ - 将具有任意参数和占位符的函数存储在类中并稍后调用

java.lang.UnsatisfiedLinkError : Error looking up function 'GetModuleFileNameEx' 错误

dll - 如何集中 VB6 dll 引用的 .net dll(com 互操作)