与主题一样,我想知道如何为特定的Windows驱动程序“打开”ETW或WPP。 让我们举一个例子来看一个vdrvroot.sys。当我们反汇编这个驱动程序时,我们在DriverEntry函数调用的开头看到了:
McGenEventRegister();
WppLoadTracingSupport()
WppInitKm()
打开跟踪功能。 对于McGenEventRegister中的ETW,我看到以下提供者注册:
result = EtwRegister(
&VDRVROOT_PROVIDER_ID,
McGenControlCallbackV2,
&VDRVROOT_PROVIDER_ID_Context,
&Microsoft_Windows_VDRVROOTHandle);
其中VDRVROOT_PROVIDER_ID等于900448e4-b685-dd11-ad8b-0800200c9a66。 我尝试记录最终日志:
tracelog.exe -start MyTrace -guid #900448e4-b685-dd11-ad8b-0800200c9a66
(...) //some actions here
tracelog.exe -start MyTrace
并通过TraceView查看日志文件。没有抓到但是在这个驱动程序中EtwWrite仅在一个地方被调用,我可能没有触发我的动作。 问题是我是否可以在不反转驱动程序的情况下打开提到的跟踪机制;)?
答案 0 :(得分:0)
我不确定您所显示的GUID会得到什么。我将E4480490-85B6-11DD-AD8B-0800200C9A66视为VDRVROOT_PROVIDER_ID的GUID。我不确定900448E4 GUID的用途。另请注意,TraceView仅显示WPP事件(通过TraceMessage或TraceMessageVa编写),而不显示基于清单的ETW事件。另请注意,WPP事件需要访问PDB或TMF文件 - 否则TraceView无法解码它们。 (只要在系统上注册了正确的清单,您就可以自动解码基于清单的事件。)
您可以尝试使用tracerpt解码ETL文件,因为它支持更多类型的ETW事件编码。
一般来说,ETW并没有提供一个非常好的方式来说明如何从特定的驱动程序中获取事件"。您可以使用tracelog列出系统中所有活动提供程序的所有活动GUID,并且您可以使用tracelog列出所有已注册的清单,但是没有方法可以说"提供商已经提供了什么由这个特殊的DLL"激活。一个DLL可能会激活多个提供程序GUID(可能一个用于基于清单的事件,另一个用于基于WPP的事件),或者许多DLL都共享相同的清单,因此它们都使用相同的提供程序GUID。即使您确实拥有驱动程序的正确GUID,如果驱动程序只使用WPP(这是常见的),您也无法解码事件而无需访问TMF或PDB文件。