有些人告诉我,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 Kernel Trace”。这实际上允许使用诸如“syscall”之类的关键字,然后它将为您提供 SysClEnter/SysClExit 日志,但是这些日志不提供启动它们的进程 ID 也不提供 API。相反,它们只是给出了所输入的系统调用的内核地址。
有更熟悉 ETW 内部运作的人能够回答您如何通过 ETW 收集这些信息吗?
您可以轻松监控与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*
您可以看到映射到系统调用名称的地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)