使用 ETW 的 Windows 用户模式进程系统调用跟踪

Posted

技术标签:

【中文标题】使用 ETW 的 Windows 用户模式进程系统调用跟踪【英文标题】:Windows User Mode Process Syscall Tracing With ETW 【发布时间】:2017-11-04 10:44:27 【问题描述】:

有人告诉我,ETW 提供了一种机制来捕获用户模式进程进行的系统调用。我列举了可用的提供者,并且只提出了两个可能提供此信息的可能。第一个是 Microsoft-Windows-Kernel-Audit-API-Calls。该提供商向我显示以下数据:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
	<System>
		<Provider Name="Microsoft-Windows-Kernel-Audit-API-Calls" Guid="e02a841c-75a3-4fa7-afc8-ae09cf9b7f23" />
		<EventID>5</EventID>
		<Version>0</Version>
		<Level>4</Level>
		<Task>0</Task>
		<Opcode>0</Opcode>
		<Keywords>0x0</Keywords>
		<TimeCreated SystemTime="2017-06-01T11:59:05.831179100-0500" />
		<Correlation ActivityID="00000000-0000-0000-0000-000000000000" />
		<Execution ProcessID="1860" ThreadID="9628" ProcessorID="1" KernelTime="210" UserTime="1260" />
		<Channel />
		<Computer />
	</System>
	<EventData>
		<Data Name="TargetProcessId">4294967295</Data>
		<Data Name="DesiredAccess"> 1052672</Data>
		<Data Name="ReturnCode">3221225483</Data>
	</EventData>
	<RenderingInfo Culture="en-US">
		<Level>Information </Level>
		<Opcode>Info </Opcode>
		<Provider>Microsoft-Windows-Kernel-Audit-API-Calls </Provider>
	</RenderingInfo>
</Event>

这看起来很有希望,但是 EventId 是否对应于系统调用名称?是否有任何文档详细说明 EventId 的实际含义?我在 MSDN 或其他地方找不到任何相关内容。我正在专门寻找 API 调用,例如 NtCreateFile、NtCreateThreadEx、NtAllocateVirtualMemory 等。

我查看的另一个提供程序是“Windows 内核跟踪”。这实际上允许使用诸如“syscall”之类的关键字,然后将为您提供 SysClEnter/SysClExit 日志,但是这些日志不提供启动它们的进程 ID 或 API。相反,它们只是给出似乎是正在输入的系统调用的内核地址。

是否有更熟悉 ETW 内部运作的人能够回答您将如何通过 ETW 收集这些信息?

【问题讨论】:

【参考方案1】:

您可以轻松监控与 Windows 中任何进程相关的系统调用。使用 cmd 管理员,运行以下命令:

logman start "NT Kernel Logger" -p "Windows Kernel Trace" (syscall) -o sys.etl -ets

然后停止

logman stop "NT Kernel Logger" -ets

当您使用 tracerpt 解析 .etl 文件时

tracerpt sys.etl

您可以在 dumpfile.xml 中查看系统调用地址。 使用 windbg 并使用以下命令从命令行启动它:

windbg.exe -kl -c x*!nt*

您可以看到映射到系统调用名称的地址。

【讨论】:

如何获取系统调用的参数? 你没有!没有办法

以上是关于使用 ETW 的 Windows 用户模式进程系统调用跟踪的主要内容,如果未能解决你的问题,请参考以下文章

窗口 - 基于清单的 ETW 提供程序问题

学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪

如何使用 Windows 性能分析器查看 EventSource 创建的 ETW 事件?

如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

未从实时 ETW 消费者接收 Microsoft-Windows-Kernel-Process 事件

从多个进程和同一进程内注册相同的 ETW TraceLogging 提供程序 GUID