【问题标题】:In Windows, how can I trace in C which files a child process reads and writes?在 Windows 中,如何在 C 中跟踪子进程读取和写入的文件?
【发布时间】:2015-04-02 13:22:08
【问题描述】:

我的目标是确定何时执行命令,准确地确定它读取和写入的文件。在 Linux 上,我可以使用 ptrace (通过工作,类似于 strace 所做的)来完成此操作,在 FreeBSD 和 MacOS 上,我可以使用 ktrace 系统命令来完成此操作。您将在 Windows 上使用什么来获取此信息?

到目前为止,我的研究表明我要么使用调试器接口(在许多方面类似于 ptrace),要么可能使用ETW。第三种选择是插入一个 DLL 来拦截系统调用。不幸的是,我没有经验来猜测每种方法的挑战性。

有什么建议吗?

【问题讨论】:

  • 使用 GUI 工具可能就足够了吗?试试 Windows Internals (filemon)。
  • 如何在windows 7或进程资源管理器中使用资源监视器
  • 不,GUI 工具是不够的,我必须能够从我的程序中执行此操作,该程序是用 C 编写的(但如果需要也可以使用 C++)。
  • Detours
  • 这是一个非常糟糕的功能规范。听起来它除了审计之外不需要任何东西。使用组策略编辑器将其打开并阅读事件日志。

标签: c windows


【解决方案1】:

正如您所建议的,这是一个相当简单的任务,可以通过 DLL 注入的 API 挂钩来解决。

这是一篇关于应用程序的不错的文章:API hooking revealed

我相信您可以找到更多关于该问题的最新文章。

但是,您可能需要使用 C++ 来实现这样的实用程序。顺便说一句,程序可以禁用 DLL 注入。例如,我无法在Photoshop 的试用版上使用这种方法。

因此,在开始编写自己的解决方案之前,您可能需要检查是否可以在所需的进程中使用现有解决方案注入 DLL 文件。

【讨论】:

    【解决方案2】:

    不幸的是,在 Windows 上似乎没有简单的方法来拦截文件级操作。

    这里有一些提示:

    • 您可以尝试使用Sysinternals 中的FileMon,如果它足以满足您的需求,或者尝试查看该工具的源代码
    • 您可以使用像 Detours 这样的商业软件 - 请注意,我自己从未使用过,我不确定它是否真的满足您的需求

    如果您想要更好地理解并且不害怕手动操作,Windows 拦截文件 I/O 的方式是使用File System Filter Driver。事实上,Windows 系统中嵌入了一个FilterManager,可以将所有文件系统调用转发到minifilters

    要构建它,与系统的接口由 FilterManager 提供,您只需 (...) 编码并安装执行实际过滤的 minifilter - 再次注意从未测试过那……

    【讨论】:

    • 我已经开始研究文件系统微过滤器,但很难了解它们如何提供帮助。看起来过滤器需要安装到系统中,也许是使用管理权限?
    【解决方案3】:

    请看文章CDirectoryChangeWatcher - ReadDirectoryChangesW all wrapped up

    这是一种非常古老但正在运行的监视目录更改的方法。

    【讨论】:

    • 在我看来,这种方法不允许找出哪个进程执行了修改。此外,它似乎没有提供一种机制来确定读取了哪些文件。
    【解决方案4】:

    Microsoft 拥有一组名为 Sysinternals 的工具。有一个名为Process Monitor 的程序将向您显示特定进程的所有文件访问。这很可能是您想要的。

    【讨论】:

      【解决方案5】:

      检查这个特定的 Stack Overflow 问题以了解您的问题...这可能会对您有所帮助: Is there something like the Linux ptrace syscall in Windows?

      另外,如果您正在运行像Windows XP 这样的较低版本,那么您应该查看Process Monitor

      另外,我希望您检查一下... Monitoring certain system calls done by a process in Windows

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多