DLL加载通知

3
在我的程序中,是否有可能在系统中的任何进程加载特定DLL或所有DLL加载事件(我可以过滤掉)时获得通知?就像Process Explorer从所有进程获得通知一样。我可以使用Process Explorer来实现此目的,但如果发生特定的DLL加载事件,我希望采取行动(显示弹出窗口)。
我还在寻找能够为我完成此工作的开源程序。
非常感谢您的帮助。

请查看此答案C#中DllMain在C(WinAPI)中的等效项 - lsalamon
@lsalamon 您可以使用 DllMain 来了解在进程中加载 特定的 DLL 的时间,但这并不能帮助您知道任意 DLL 在任意进程中被加载的时间,而这两者都不受您控制,我认为这就是 @rplusg 所寻找的。 - Chris Schmich
2个回答

2
是的,你可以通过Windows的ETW(Windows事件跟踪)机制获取图像(.dll,.exe)加载事件。 ETW是一种快速,低开销的日志记录机制,并且大部分Windows内核都被仪器化以发出事件。
ETW有一个“提供程序”的概念,用于发出一组事件。例如,有一个CLR提供程序用于.NET运行时,一个内核提供程序用于内存管理器/驱动程序/映像/文件系统/用户事件,一个IIS提供程序用于HTTP/网络事件,甚至是第三方编写的自定义提供程序。
您需要在ETW内核提供程序上启用EVENT_TRACE_FLAG_IMAGE_LOAD,以获取Image_Load事件。对于托管代码,您可以使用CLR ETW提供程序的AssemblyLoadModuleLoad事件。
你可以在本地代码和托管代码中生成和消费ETW事件。这有点难以处理,但是一旦开始收集数据,就会有大量的数据可用。Vance Morrison创建了一个使用C#消耗ETW事件的简短演练并创建了TraceEvent库。
另外,查看我的之前的SO帖子这里这里,了解更多关于ETW的信息。
或者,您可以使用WMI(Windows管理 Instrumentation)获取这些事件,尽管您必须轮询它们。轮询WMI应该比在系统中不断枚举所有模块的所有进程仍然少使用资源。
如果您选择WMI路线,请查看Win32_ModuleLoadTraceWin32_Process类型。 .NET框架具有合理的WMI API

非常感谢你,克里斯! - rplusg

0

是的,枚举所有已加载的 DLL 是一项资源密集型操作,而且不能频繁执行。不过还是感谢您的建议。 - rplusg
这里可能会有帮助:http://stackoverflow.com/questions/6503013/how-to-get-notification-of-dll-loads-happening-in-my-software-inside-my-own-pro 看起来热补丁到LoadLibrary选项是你想要的,但看起来相当复杂。 - Gavzooka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接