如何在dllmain中调用消息框

时间:2011-12-04 18:27:30

标签: c++ windows dll

我正在创建一个用于DLL-INJECTION POC(概念验证)的小dll。我正在使用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时弹出我的消息框?

2 个答案:

答案 0 :(得分:6)

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

换句话说,您无法在MessageBox中使用DllMain。使用类似OutputDebugString的内容,它位于kernel32中,不显示任何UI。

答案 1 :(得分:2)

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