【问题标题】:Can an application pretend to be a file or folder?应用程序可以伪装成文件或文件夹吗?
【发布时间】:2012-03-10 00:58:35
【问题描述】:

我一直在考虑集中我的电脑游戏存档,以便更轻松地备份和恢复,并通过保管箱将它们放在云端,但在某些地方,这使得它变得相当困难。我注意到 Windows 7 和 Vista 现在支持符号链接,所以我一直在玩这个,但我想知道以下内容:

应用程序(vb.net 或 C++)是否有可能(代码示例或指向正确的方向)欺骗文件或文件夹?

例如应用程序 A(像暗黑破坏神 III 或文明 V 之类的游戏)尝试从文件 A(游戏存档)读取或正确读取文件,应用程序 B(存档存储库)检测到此读/写请求并通过自身管道传输请求,从而在文件中执行请求B(实际游戏保存在另一个位置)。应用程序 A 绝不会被更改并正常处理文件。

注意:我意识到本质上执行相同任务有许多简单的方法,例如监视应用程序 A 的使用或定期检查文件 A 并在自上次检查后更改文件 A 时复制它等,但所有这些方法都有退后一步,对让它发挥作用的兴趣不如可能。

【问题讨论】:

标签: c++ windows vb.net file filesystems


【解决方案1】:

您可以像控制面板一样“伪造”特殊文件夹,但我认为您无法创建任何可访问/可写的内容(以简单的方式)。不过我可能是错的。我曾经也有同样的想法(作为某些公司产品的兼容性步骤),但找不到任何支持简单方法的东西。似乎在 Unix 系统上可能更容易完成(但这显然不是这里的选择)。此外,我不希望 .net 有任何好的或简单的解决方案。

我现在能想到的唯一方法是劫持相应的 API 调用(例如 FileOpen)以重新路由/操纵它们(类似于 root 工具包所做的),但我不会说这是个好主意,考虑到它可能会被 punkbuster 或防病毒解决方案检测为可能的恶意软件或作弊。

【讨论】:

    【解决方案2】:

    是或否取决于(使用您的术语)应用程序 A 使用的抽象级别。

    如果应用程序 A 正在执行 CreateFile wto start 访问并传递固定的文件系统路径,则应用程序 B 需要模拟文件系统并在内核中这样做。

    另一方面,如果应用程序 A 使用 RESTful URL 使用 HTTP,那么 HTTP 服务器可以响应来自文件的所有请求或通过动态创建内容。

    所以这个问题只能通过了解Application A的细节来具体回答。

    【讨论】:

    • 不一定“在内核中”。例如。 dokan-dev.net/en/about 是 Windows 的一种 FUSE。
    • @Richard:我的意思是一个完整的 windows/linux/mac 应用程序写入或读取文件系统。我有网络背景,所以我已经了解网络服务。
    • @Mat 看起来像 Dokan 提供了一个设备驱动程序,所以您不需要自己编写它。但它仍然基于设备驱动程序。
    【解决方案3】:

    完全可以通过文件系统过滤器驱动程序来做到这一点。有关这些信息,请查看此处:

    http://msdn.microsoft.com/en-us/windows/hardware/gg462968

    过滤器驱动程序可以挂钩到 CreateFile 操作,并根据需要将创建重定向到不同的位置,但与普通应用程序相比,它们更难编写。它们在内核模式下运行,必须遵守驱动程序的限制。

    【讨论】:

    • 这听起来很有趣!如果在 Linux 和 mac 中有类似的东西有什么想法吗?
    • @wkc;在 linux 上,从最终用户可用性的角度来看,可能不像 windows 那样直接。你可能想看看FUSE system
    猜你喜欢
    • 2020-01-15
    • 2016-04-25
    • 1970-01-01
    • 2017-02-19
    • 2011-01-28
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多