通过事件跟踪(ETW)会话中的特定进程获取创建/修改/删除的文件

时间:2016-06-30 15:16:26

标签: windows events etl tracing etw

我一直在寻找一个解决方案,通过事件跟踪(ETW)会话中的特定进程获取所有创建/修改和删除的文件(我将处理来自etl文件的数据而不是来自实时会话的数据)。

显然,完成此操作的最简单方法是从FileIo_Name类获取 FileCreate FileDelete 事件,并将它们映射到相应的{{3} }事件。但是,由于我没有收到相应 FileDelete 事件的任何 DiskIo_TypeGroup1 事件,因此我无法使用此解决方案,因此我无法获取此过程ID。此外,并非所有 FileCreate 事件都有关联的 DiskIo_TypeGroup1 事件(我认为这适用于空的已创建文件或仅适用于已打开的文件)。

注意:我需要 DiskIo_TypeGroup1 映射,因为 FileIo_Name 事件没有 ThreadId ProcessId 成员填充 - 它们设置为(ULONG)-1 。另外,在不知道"文件写入大小"的情况下,我无法确定哪些文件刚刚打开或修改过。 DiskIo_TypeGroup1 也没有填充 ThreadId ProcessId (在事件标题中,在较新的操作系统上),但是它有 IssuingThreadId 结构成员,我可以从中获取 ProcessId Thread_TypeGroup1 类事件的映射。

所以我调查了 FileIo_Create 类如何帮助我,并说我可以获得 CreateOptions 成员,该成员可以有以下标志:(FILE_SUPERSEDE, FILE_CREATE,FILE_OPEN,FILE_OPEN_IF,FILE_OVERWRITE,FILE_OVERWRITE_IF)。但最初的问题仍然存在。如何检查文件是从头创建而不是刚刚打开(例如,在 FILE_SUPERSEDE 的情况下)?

也许我可以使用 FileIo_ReadWrite 类来获取 Write 事件。就像使用 DiskIo_TypeGroup1 类一样。因此,如果某些内容被写入文件,那么我可以假设该文件是创建还是修改过的?

要查找已删除的文件,我认为 FileIo_Info 类和删除事件是解决方案。猜猜我可以收到删除事件并将它们映射到 FileIo_Name 以获取文件名。

注意: FileIo_Create FileIo_Info FileIo_ReadWrite 包含有关进程ID的信息。

我的假设是对的吗?什么是我的问题的最佳解决方案?

1 个答案:

答案 0 :(得分:2)

我将按照以下方式分享我实施的解决方案:

  1. 创建文件:

    • 我已将所有<​​strong> FileIo_Create 事件存储为待处理的创建操作,并等待接收关联的 FileIo_OpEnd 以确定该文件是否已被打开,创建,覆盖或取代 ExtraInfo 结构成员。
  2. 修改过的文件:

    • 我将 FileIo_ReadWrite 中的每个 Write 事件标记为脏,并使用 InfoClass-&gt; FileEndOfFileInformation将每个 SetInfo 事件标记为来自 FileIo_Info 的em>和 InfoClass-&gt; FileValidDataLengthInformation 。最后来自 FileIo_SimpleOp 清理事件,验证文件是否标记为脏并存储为已修改。
  3. 已删除的文件:

    • 如果使用 FileIo_Create 中的 CreateOptions-&gt; FILE_DELETE_ON_CLOSE 标记打开文件,或者如果删除事件来自< strong> FileIo_Info 出现。最后, FileIo_SimpleOp 中的清理事件将文件存储为已删除。
  4. 此过程ID和文件名也是从 FileIo_Create 事件中获取的,更准确地说是从 OpenPath 结构成员和 ProcessId 事件标头成员获得的。