0

就像在主题中一样,我想知道如何为特定的 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 只在一个地方被调用,我可能没有用我的动作触发。问题是我是否可以在不反转驱动程序的情况下打开上述跟踪机制;)?

4

1 回答 1

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 文件的情况下解码事件。

于 2016-06-10T01:37:00.407 回答