DLL加载通知

时间:2015-10-14 17:29:22

标签: c# windows visual-c++

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

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

非常感谢您提前。

2 个答案:

答案 0 :(得分:2)

是的,您可以通过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库。

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

或者,您可以使用WMI(Windows Management Instrumentation)来获取这些事件,但您必须对它们进行轮询。与不断枚举系统中所有进程中的所有模块相比,轮询WMI的资源密集程度仍然较低。

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

答案 1 :(得分:0)

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