【问题标题】:Check all loaded modules if it comes from the OS or if it's automatically loaded at run time检查所有加载的模块是否来自操作系统或是否在运行时自动加载
【发布时间】:2017-11-08 06:18:15
【问题描述】:

我进行了以下实验:

我注意到当我启动程序/exe 时,它​​会自动加载模块/dll。以下是自动加载的模块列表:

D:\test.exe

C:\WINDOWS\SYSTEM32\ntdll.dll

C:\WINDOWS\System32\KERNEL32.DLL

C:\WINDOWS\System32\KERNELBASE.dll

C:\WINDOWS\SYSTEM32\apphelp.dll

C:\WINDOWS\System32\USER32.dll

C:\WINDOWS\System32\win32u.dll

C:\WINDOWS\System32\GDI32.dll

C:\WINDOWS\System32\gdi32full.dll

C:\WINDOWS\System32\msvcp_win.dll

C:\WINDOWS\System32\ucrtbase.dll

C:\WINDOWS\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_50939ec6bcb7c97c\MSVCP90.dll

C:\WINDOWS\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_50939ec6bcb7c97c\MSVCR90.dll

C:\WINDOWS\System32\IMM32.DLL

C:\WINDOWS\system32\uxtheme.dll

C:\WINDOWS\System32\msvcrt.dll

C:\WINDOWS\System32\combase.dll

C:\WINDOWS\System32\RPCRT4.dll

C:\WINDOWS\System32\SspiCli.dll

C:\WINDOWS\System32\CRYPTBASE.dll

C:\WINDOWS\System32\bcryptPrimitives.dll

C:\WINDOWS\System32\sechost.dll

C:\WINDOWS\System32\MSCTF.dll

C:\WINDOWS\System32\OLEAUT32.dll

C:\WINDOWS\system32\dwmapi.dll

我的目标:

我想检查 DLL/模块是由操作系统自动加载还是使用 LoadLibrary API 加载。

如果这是一个重复的问题。你能指导我解决问题吗?

谢谢你,美好的一天!

【问题讨论】:

    标签: c++ visual-c++ dll visual-studio-code


    【解决方案1】:

    我看到了两种可能的方法:

    • 第一种选择,在 DependencyWalker 中运行应用程序。该实用程序可以告诉您何时加载 DLL。这可能会给你一些提示。
    • 第二种选择,在调试器中启动应用程序并在 main 中放置一个断点。然后调查 Visual Studio 中加载的模块。这些模块由 Windows 自动加载。当断点被命中时,可在 Windows 函数 LoadLibrary(和 LoadLibraryEx)上设置断点并查看它何时被命中。这些模块是手动加载的(您可以立即看到是谁加载了它们)。

    第二种方法假定没有在其 DllMain 方法中显式调用 LoadLibrary 本身的 DLL。但是,这样做是不好的做法,因为它可能导致加载程序锁死锁。

    【讨论】:

    • main 中的断点在全局对象(例如构造函数)的初始化器之后触发。您需要在 CRT 入口点上设置一个断点。
    • 感谢您的想法。我将首先尝试 DependencyWalker。依赖步行者可以这样说吗? Windows 7 32 位 dll1 名称 dll2 名称 Windows 7 64 位 dll1 名称 dll2 名称 dll3 名称等等...
    • 这个怎么样。我可以验证模块/dll 是 windows dll 吗?
    • @MSalters。你是对的。最好早点下断点。
    • @LearningCPP。您可以以编程方式获取模块的完整路径并查看它是从哪里加载的。因此,如果它是从 C:\Windows 加载的,那么它可能是一个 Windows DLL,但 Windows DLL 也可以从并行缓存 (WinSxS) 加载。您可以使用 Process Explorer 等实用程序检查所有加载的 DLL,并查看它们的加载位置。 Dependency Walker 还报告了可执行文件使用的 DLL,但我的经验是它没有正确使用清单,因此经常从未使用的位置引用 DLL(或从 64 位引用 32 位 DLL可执行文件)。
    猜你喜欢
    • 2020-05-13
    • 2012-04-17
    • 2017-04-24
    • 2017-02-23
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多