是否有可能得到我的程序中的通知,当系统中的任何进程加载特定的DLL或所有的DLL加载事件(我可以过滤掉)? 就像进程pipe理器如何从所有进程获取通知一样。 我可以使用进程pipe理器来达到这个目的,但是我想在一个特定的DLL加载事件的情况下采取一个行动(显示一个popup窗口)。
我也寻找任何开源的程序,可以为我做这个工作。
非常感谢你提前。
是的,您可以通过Windows的ETW (Windows事件跟踪)工具获取映像(.dll,.exe)加载事件。 ETW是一种快速,低开销的日志记录机制,大多数Windows内核都是用来发送事件的。
ETW有一个“提供者”的概念,它发出一系列的事件。 例如,.NET运行时有一个CLR提供程序,内存管理器/驱动程序/映像/文件系统/用户事件的内核提供程序,HTTP /网络事件的IIS提供程序,甚至是第三方编写的自定义提供程序。
您需要在ETW内核提供程序上启用EVENT_TRACE_FLAG_IMAGE_LOAD
以获取Image_Load
事件。 对于托管代码,可以在CLR ETW提供程序中使用AssemblyLoad
或moduleeLoad
事件。
您可以从本地代码和托管代码生成和使用ETW事件。 一起工作有点困难,但是一旦开始收集,就有大量的数据可用。 Vance Morrison创建了一个通过C#使用ETW事件的简短演练,并创建了TraceEvent库。
此外,请参阅我以前的帖子, 在这里和这里的ETW更多。
或者,您可以使用WMI (Windows Management Instrumentation)来获取这些事件,但您必须为它们进行轮询。 轮询WMI应该比不断枚举系统中所有进程中的所有模块的资源密集度要低。
如果你去WMI路线,看看Win32_moduleeLoadTrace
和Win32_Process
类型。 .NET框架有一个合理的WMI API 。
因为我对c#和.net相当陌生,所以请原谅我,但可以使用如下所示的示例: https : //msdn.microsoft.com/en-us/library/27688t9c(v=vs.90 ).aspx并迭代ProcessmoduleeCollection以列出为每个进程加载的DLL,记录这些并监视更改? 可能资源密集虽然…..