检查所有已加载的模块是否来自操作系统,或者是否在运行时自动加载

时间:2017-11-08 06:18:16

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

我进行了以下实验:

我注意到当我启动程序/ exe时它会自动加载modules / 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加载。

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

谢谢你,美好的一天!

1 个答案:

答案 0 :(得分:0)

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

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

第二种方法假设没有DLL在其DllMain方法中显式调用LoadLibrary本身。但是,这样做会很糟糕,因为它可能会导致Loader Lock出现死锁。