【问题标题】:Intercept windows open file拦截windows打开的文件
【发布时间】:2009-07-10 13:36:53
【问题描述】:

我正在尝试制作一个可以拦截文件打开过程的小程序。

目的是当用户双击给定文件夹中的文件时,windows会通知软件,然后它处理该请求并将文件的数据返回给windows。

也许会有另一种解决方案,例如监控打开消息并强制 Windows 在程序准备文件内容时等待。

此概念的一个应用可能是以对用户透明的方式管理文件的解密。 在这种情况下,加密文件将在磁盘上,当用户打开它(双击它或使用记事本等应用程序)时,后台进程将拦截该打开事件,对文件进行解密并提供内容该文件的请求应用程序。

这是一个有点奇怪的概念,可能类似于“中间人”的网络概念,但使用的是文件而不是网络数据包。

感谢阅读。

【问题讨论】:

    标签: c++ windows winapi events file-io


    【解决方案1】:

    覆盖从任何程序打开的所有情况的最佳方法是通过file system filter driver。不过,这可能对您的需求来说太复杂了。

    【讨论】:

    【解决方案2】:

    您可以使用Process Explorer 使用的技巧将自己替换为任务管理器。基本上创建一个这样的密钥:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe

    'taskmgr.exe' 替换为要拦截的进程的名称。然后添加一个名为'Debugger' 的字符串值,其中包含您的可执行文件的路径。例如:

    Debugger -> "C:\windows\system32\notepad.exe"

    运行的每个进程与映像名称匹配,您的进程实际上将被称为该进程的调试器,并将实际进程的路径作为参数。

    【讨论】:

    • 我相信这将是最好的方法,但我如何将它用于 openfiledialogs?打开文件对话框在 comdlg32.dll 中对吗?
    • 这很好用,但请注意在您的拦截器想要执行原始进程的情况下潜在的无限递归。简单的解决方法:stackoverflow.com/questions/1109564/intercept-windows-open-file
    【解决方案3】:

    您可以使用代码注入和 API 重定向。您将启动目标进程,然后注入一个 DLL,该 DLL 挂钩您要拦截的 Windows API 函数。然后,当目标进程认为它正在调用 OpenFile() 或其他任何东西时,你就会被调用,并且你可以在将调用传递给真正的 API 之前做你想做的事情。

    Google 用于“IAT 挂钩”。

    【讨论】:

      【解决方案4】:

      Windows 可以选择加密磁盘上的文件(文件->属性->高级->加密),此选项对应用程序完全透明。

      也许要加密磁盘的解密文件部分,您应该考虑使用 criptainer 之类的软件?

      也有这个软件http://www.truecrypt.org/downloads(免费和开源),但我没试过。

      开发自定义解决方案听起来非常困难。

      【讨论】:

      • 好吧,你也许可以把它作为一个文件系统过滤驱动程序,但我不认为这是一个“可行”的解决方案..除非你有足够的时间和技能 :-) 并且正在开发一些东西非常具体,只需要这样做。
      • 地穴的例子只是为了说明疑问。我根本不需要任何加密:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多