當系統中的任何進程加載特定的DLL或所有DLL加載事件(我可以過濾掉)時,是否可以在我的程序中獲得通知? 就像進程管理器如何從所有進程獲取通知一樣。 我可以使用進程資源管理器來達到這個目的,但是我想在一個特定的DLL加載事件的情況下采取行動(顯示一個彈出窗口)。DLL負載通知
我也在尋找任何可以爲我完成這項工作的開源程序。
非常感謝您提前。
當系統中的任何進程加載特定的DLL或所有DLL加載事件(我可以過濾掉)時,是否可以在我的程序中獲得通知? 就像進程管理器如何從所有進程獲取通知一樣。 我可以使用進程資源管理器來達到這個目的,但是我想在一個特定的DLL加載事件的情況下采取行動(顯示一個彈出窗口)。DLL負載通知
我也在尋找任何可以爲我完成這項工作的開源程序。
非常感謝您提前。
是的,您可以通過Windows'ETW(Windows事件跟蹤)工具獲取映像(.dll,.exe)加載事件。 ETW是一種快速,低開銷的日誌記錄機制,並且大多數Windows內核都是用來發布事件的。
ETW具有發佈事件集合的「提供者」的概念。例如,.NET運行時有一個CLR提供程序,內存管理器/驅動程序/映像/文件系統/用戶事件的內核提供程序,HTTP /網絡事件的IIS提供程序,甚至是第三方編寫的自定義提供程序。
您需要在ETW內核提供者上啓用EVENT_TRACE_FLAG_IMAGE_LOAD
才能獲得Image_Load
事件。對於託管代碼,您可以使用CLR ETW提供程序中的AssemblyLoad
或ModuleLoad
事件。
您可以從本機代碼和託管代碼生成並使用ETW事件。與之合作有點困難,但一旦你開始收集數據,就有大量數據可用。 Vance Morrison創建了short walkthrough on consuming ETW events via C#並創建了TraceEvent庫。
此外,請參閱我以前的SO帖子here和here瞭解ETW的更多信息。
或者,您可以使用WMI(Windows Management Instrumentation)來獲取這些事件,但您必須爲它們進行輪詢。與輪詢系統中所有進程中的所有模塊相比,輪詢WMI仍然需要的資源更少。
如果你走WMI路線,看看Win32_ModuleLoadTrace
and Win32_Process
類型。 .NET框架有一個reasonable WMI API。
非常感謝chris! – rplusg
請與我裸露,我是相當新的C#和.NET,但你可以使用這裏顯示的東西,如例如:https://msdn.microsoft.com/en-us/library/27688t9c(v=vs.90).aspx和迭代ProcessModuleCollection列出DLL的每個進程加載,記錄這些和監控改變?可能資源密集雖然.....
看到此問題[C#相當於C(WinAPI)中的DllMain](http://stackoverflow.com/questions/8206736/c-sharp-equivalent-of-dllmain-in-c-winapi) – lsalamon
@lsalamon你可以使用'DllMain'來知道*特定的* DLL在一個進程中被加載的時間,但是它不會幫助你知道什麼時候一個任意的DLL被加載到一個任意的進程中,這兩個進程都是你控制的,我認爲這是@rplusg在尋找。 –