繁体   English   中英

DLL_PROCESS_ATTACH无法在Windows 7 C ++上执行

[英]DLL_PROCESS_ATTACH failing to execute on Windows 7 C++

我正在尝试加载.dll文件,并使其在加载时显示一个消息框。 据我了解,一旦加载了.dll ,它就会调用dllmain()并切换到DLL_PROCESS_ATTACH选项。 我已经为.dll.exe加载了代码。 .exe可以正确加载它并打印出已加载dll的地址,但我看不到显示消息框。 我在Microsoft.com上的某个地方读到,DLL加载时会进入“锁定”状态,以防止出于安全目的执行某些功能或代码。 此功能是否阻止显示消息框? 有没有解决的方法,例如提升的特权,系统等? 我不确定DEP是否也有效,我将其设置为仅保护关键的Windows进程。

调用过程:

#include <iostream>
#include <windows.h>
int main()
{
    HMODULE hDll = LoadLibraryA("dll.dll");
    if (hDll == NULL)
        std::cerr << "Unable to load dll";
    else
        std::cout << "Dll loaded @ " << hDll;
    FreeLibrary(hDll);
}

dll文件:

#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK);
            break;
    }
    return TRUE;
}

我想如果我有办法通过调试器运行.dll并查看MessageBox()返回了什么,那可能会对我有帮助,但是我不确定该怎么做。 谢谢!

雷蒙德·陈(Raymond Chen)在他的博客文章“ 一些不对您的DllMain做任何令人恐惧的事情的原因 ”中话要说:

而且绝对不要在任何情况下都可以像在DLL_PROCESS_ATTACH中创建一个窗口一样疯狂。 除了线程相似性问题外,还存在全局挂钩的问题。 在装载机锁内部运行的挂钩是灾难的根源。 如果您的计算机出现死锁,请不要感到惊讶。

除了博客文章Greg链接之外,还有其他一些有用的信息,涉及装载程序锁以及 在DllMain中 不应 执行的操作

通常,您只应在kernel32中调用不会创建线程/窗口,使用COM或调用LoadLibrary的函数(或其他涉及加载程序锁的函数)。

恕我直言,一个安全的合理清单是:DisableThreadLibraryCalls,Tls *,InitializeCriticalSection,以及您的情况(出于调试目的); OutputDebugString的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM