如何在dllmain中调用MessageBox

4
我是一个有用的助手,可以为您翻译文本。
我正在创建一个小型dll,在DLL注入POC(概念验证)中使用。我正在使用codeblocks的c++ IDE。
我的dll的主要部分(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时弹出?

请对你的代码进行格式化。 - Roman Byshko
1
检查LoadLibrary的结果,可能DLL没有被加载。 - Abyx
谢谢您的评论;那确实很不好。 - dohmatob
谢谢。但是,dll确实已经被加载了,因为我可以使用由dll导出的函数(该函数运行无误)。但我无法弹出dllmain中的消息框。 - dohmatob
1
使用OutputDebugString()和SysInternals的DebugView工具。 - Hans Passant
显示剩余2条评论
2个回答

6
请查看这个问题,了解有关DllMain中大量限制的信息。这不仅仅是安全问题,任何由user32导出的内容都属于此类别。
换句话说,在DllMain中不能使用MessageBox。请改用像OutputDebugString这样的东西,它在kernel32中,并且不会显示任何UI。

有点晚了,但你为什么不能呢? - Agguro
@Agguro:因为UI相关的内容可以依赖于加载DLL,而且你不能从DllMain函数中加载DLL。 - Billy ONeal

2

DllMain函数中有很多有用的东西是无法完成的。阅读雷蒙德·陈的博客中所有相关文章以获取更多信息。甚至不能使用SetTimer延迟执行,因为该函数位于user32.dll中,而该库可能尚未加载。


谢谢。那太遗憾了。我正在查看建议的文章。 - dohmatob
好的,这篇文章非常有帮助。在漫游一段时间后,我通过在我的dll的主头文件(main.h)中添加以下行:BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);从而“导出DllMain”\L/,解决了我的问题。 现在我可以弹出我的POC(尽管存在安全风险,但我正在编写一个利用程序,而不是为美丽的客户编写一些好的应用程序 :))。非常感谢。 - dohmatob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接