【问题标题】:How to intercept Win32 API calls with C#?如何使用 C# 拦截 Win32 API 调用?
【发布时间】:2014-05-19 00:58:49
【问题描述】:

我想托管一个虚拟驱动器并拦截 I/O,或者拦截对硬盘驱动器上某些文件夹的 I/O 调用,然后对该调用执行任意操作,例如将文件写入第二个位置。例如,如果 Notepad.exe 将文件写入 C:\Data\test.txt - 我想访问该文件名和文件数据。同样,当任何用户尝试读取 C:\Data\test.txt 或尝试获取 C:\Data 的目录列表时,我想运行任意代码。

理想情况下,我希望有一个处理程序,用于处理文件何时:创建、更新、删除或打开 - 以及何时(从命令行或 Shell)列出目录。

我可以使用 FileSystemWatcher 执行写入部分 - 但我无法拦截磁盘“读取”。所以,我接下来研究了 MS Detours 和 EasyHook。这不会真正起作用,因为我需要监视计算机上的每个进程并在所有这些进程上连接到 OpenFile。我不想使用 Shell 扩展,因为这种行为也需要在命令行中存在。因此,剩下的就是编写文件系统 MiniFilter 驱动程序 - 或者用 C++ 编写我自己的可安装文件系统。

我可以在 C++ 中使用其中的一部分 - 虽然驱动程序的内容有点超出我的想象,但最终大部分其余代码都应该在 C# 中,理想情况下。

是否有一些直接的方法来拦截特定文件夹或虚拟驱动器的 I/O?如果答案是 EasyHook 或 MiniFilter,有人有样品吗?尤其是 EasyHook,它仅包含 2000 年代后期的样本,此后 API 发生了变化。谢谢!

【问题讨论】:

  • 如果你的预算足够大,我相信至少有一款第三方产品实现了可编程文件系统过滤驱动。
  • 这不是不可能的。我看了看,我找不到任何能做到这一点的东西。你能推荐任何产品吗?
  • 不是来自个人经验,没有。但我确实找到了对我正在考虑的产品的引用:见stackoverflow.com/a/3541555/886887
  • 实际上,我不知道这是正确的产品,但可以肯定它是正确的公司。无论如何值得联系作者并询问。
  • 我知道 Sandboxie 有一个 API you can hook in to,如果这个 API 提供的对你有没有帮助,我不知道。

标签: c# c++ winapi intercept easyhook


【解决方案1】:

看起来像一个 XY 问题。您似乎想要的是重新解析点处理程序。

您的“将文件写入另一个位置”的示例只是一个链接,并且已经存在。由标准重解析点处理程序实现。

您没有具体说明您还想做什么,但类似的事情可以通过自定义重解析点处理程序来完成。简而言之,重解析点是代替文件的一小部分数据,它 (1) 指定应该调用哪个处理程序,以及 (2) 为该处理程序提供自定义数据。例如,文件的实际位置。由于它是自定义数据,因此您可以使用任何您喜欢的格式。

【讨论】:

  • 好吧,写入另一个位置只是一种情况。本质上,我需要完全控制最终用户对目录的“外观”。一些虚拟文件可能指向磁盘上的物理文件,一些项目在内存中,在某些情况下我还需要操作文件内容。谢谢!
  • @RobertSeder:这只是加强了我的信念,即您提出了错误的问题,因为您已经想到了一半的解决方案。例如,文件系统的最终用户视图是 Explorer。其中已经可以集成诸如手机视图、打印机面板或控制面板之类的东西。我认为那里也有一个示例项目,其中集成了注册表。
  • 不,大多数功能将通过命令行完成 - 而不是通过 shell!
  • 在这种情况下,重新解析点。但是“某些项目在内存中”是什么意思? 谁的记忆?
  • 这不是一个杀毒程序,但你可以这样想。 AV 程序截获保存到磁盘的文件,它可以访问文件的字节,如果发现感兴趣的内容,它可能会取消写入并将文件写入磁盘上的其他目的地。同样,当用户查询文件夹的内容时,我需要控制提供给他们的文件/文件夹列表。因此,完全控制文件夹或虚拟驱动器的 I/O。谁的记忆——是我进程中的记忆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2018-07-08
  • 2019-07-07
  • 2023-04-02
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多