【问题标题】:DLL load notificationDLL 加载通知
【发布时间】:2015-10-14 17:29:21
【问题描述】:

当系统中的任何进程加载特定 DLL 或所有 DLL 加载事件(我可以过滤掉)时,是否可以在我的程序中获得通知? 就像流程资源管理器如何从所有流程中获取通知一样。 我可以为此目的使用进程资源管理器,但我想在特定 DLL 加载事件的情况下采取行动(显示弹出窗口)。

我也在寻找任何可以为我完成这项工作的开源程序。

提前非常感谢您。

【问题讨论】:

  • @lsalamon 您可以使用DllMain 了解特定 DLL 何时被加载到进程中,但它无法帮助您了解任意DLL 何时加载到进程中。任意进程,您都无法控制,我认为这是@rplusg 正在寻找的。​​span>

标签: c# windows visual-c++


【解决方案1】:

是的,您可以通过 Windows 的 ETW(Windows 事件跟踪)工具获取图像(.dll、.exe)加载事件。 ETW 是一种快速、低开销的日志记录机制,并且大多数 Windows 内核都可以发出事件。

ETW 具有发出事件集的“提供者”的概念。例如,有一个用于 .NET 运行时的 CLR 提供程序,一个用于内存管理器/驱动程序/图像/文件系统/用户事件的内核提供程序,一个用于 HTTP/网络事件的 IIS 提供程序,甚至是第三方编写的自定义提供程序。

您需要在 ETW 内核提供程序上启用 EVENT_TRACE_FLAG_IMAGE_LOAD 以获取 Image_Load 事件。对于托管代码,您可以将 AssemblyLoadModuleLoad 事件与 CLR ETW 提供程序一起使用。

您可以从本机代码和托管代码生成和使用 ETW 事件。使用起来有些困难,但是一旦开始收集,就会有大量数据可用。 Vance Morrison 创建了一个short walkthrough on consuming ETW events via C# 并创建了TraceEvent 库。

另外,有关 ETW 的更多信息,请参阅我之前的 SO 帖子 herehere

或者,您可以使用WMI (Windows Management Instrumentation) 来获取这些事件,尽管您必须轮询它们。与不断枚举系统中所有进程中的所有模块相比,轮询 WMI 占用的资源应该更少。

如果您走 WMI 路线,请查看 Win32_ModuleLoadTrace and Win32_Process 类型。 .NET 框架有一个reasonable WMI API

【讨论】:

  • 非常感谢克里斯!
【解决方案2】:

您能否使用此处显示的示例:https://msdn.microsoft.com/en-us/library/27688t9c(v=vs.90).aspx 并遍历 ProcessModuleCollection 以列出为每个进程加载的 DLL,记录这些并监视更改?不过可能是资源密集型的。

【讨论】:

  • 是的,枚举所有加载的 DLL 是资源密集型的,而且执行次数过多不是一种选择。不过感谢您的建议。
  • 这可能会有所帮助:stackoverflow.com/questions/6503013/… 看起来 LoadLibrary 的热补丁选项是您想要的,但看起来很复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多