如何在 dllmain 中调用消息框

Posted

技术标签:

【中文标题】如何在 dllmain 中调用消息框【英文标题】:Howto call MessageBox in dllmain 【发布时间】:2011-12-04 18:27:29 【问题描述】:

我正在创建一个小 dll 以在 DLL-INJECTION POC(概念验证)中使用。我正在使用代码块的 c++ ide。

我的 dll 的 main (dllmain) 看起来像这样:

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

    MessageBox(0, "myfirstdll loaded", "SUCCESS STATUS", MB_OK);
    switch (fdwReason)
    
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    
    return TRUE; // succesful

现在,当我从客户端程序(希望它加载!)加载 dll(使用 LoadLibrary)时,我的消息框不会弹出。这很令人沮丧,因为我正在做一个 poc。我知道我们在dllmain中做kernel32.dll等密集型业务时普遍存在的安全问题,但是,我这里的问题不是安全;我只需要直接从 dllmain 中弹出一个消息框。

那么,如何在加载 dll 时让我的消息框弹出?

【问题讨论】:

请格式化您的代码。 检查LoadLibrary结果,可能DLL没有加载。 感谢您的评论;那确实很脏。 @tenfour,请将此作为答案。 使用 OutputDebugString() 和 SysInternals 的 DebugView 实用程序。 【参考方案1】:

See this question 了解DllMain 中的大量限制。这不仅仅是安全问题。 user32 导出的任何内容都属于这一类。

换句话说,您不能在DllMain 中使用MessageBox。改用 OutputDebugString 之类的东西,它在 kernel32 中并且不显示任何 UI。

【讨论】:

有点晚了,但你为什么不能呢? @Agguro:因为允许 UI 的东西依赖于加载 DLL,而你不能从 DllMain 加载 DLL。【参考方案2】:

有很多有用的东西在 DllMain 中无法完成。阅读Raymond Chen's blog 中的所有相关文章以获取更多信息。甚至不能使用SetTimer 延迟执行,因为该函数在 user32.dll 中,并且该库可能尚未加载。

【讨论】:

谢谢。那真是太可惜了。我正在查看建议的文章。 好的,这篇文章很有帮助。现在漫游了一段时间后,我通过添加以下行解决了我的问题: BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);到我的 dll 的主标头 (main.h),因此“导出 DllMain”\L/。现在我得到了我的 POC 弹出窗口(尽管存在安全隐患,但是我正在编写一个漏洞利用代码,而不是一个漂亮的客户端的一些不错的应用程序 :))。非常感谢。

以上是关于如何在 dllmain 中调用消息框的主要内容,如果未能解决你的问题,请参考以下文章

如何在消息框中显示来自 C# 的带有 WCHAR* 的 C 函数

AJAX调用完成后的消息提示框

用户输入值时如何从文本框中填充消息框?

WinForm,消息框怎样显示在窗体正中?

如何在 AvaloniaUI(测试版)中显示消息框

抑制消息框 R6025 纯虚函数调用