gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:46:25 25 4
gpt4 key购买 nike


我正在开发一个在进程启动时注入(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com