3

好的,我编写了使用 Adob​​e ActiveX 控件来显示 PDF 文件的应用程序。

Adobe ActiveX 控件仅从文件系统加载文件。所以我需要为这个控件提供一个文件路径。

问题是我不想在文件系统上存储 PDF 文件。活动临时!我不想将我的 PDF 文件只存储在内存中,我想使用 Adob​​e ActiveX 控件。

所以我需要:

1)一种在文件系统上伪造文件的方法。所以这个控件会“认为”有一个文件,但会从内存中加载它

2)一种在文件系统上创建文件的方法,该文件仅对一个应用程序“可见”,因此我的 PDF 控件可以加载它,而其他用户甚至看不到它。

3) 别的东西

PS:我不是要“完成我的家庭作业”,我只是在问 - 有没有办法做到这一点?

4

3 回答 3

5

几乎可以做到(意思是:不,你不能,但你可以做一些接近的事情)。

创建文件原则上FILE_ATTRIBUTE_TEMPORARY 临时创建一个文件。但是,只要有足够的缓冲区缓存(通常情况下总是如此,除非您的文件是几十到几百兆字节),系统就不会写入磁盘。这不仅仅是偶然发生的事情,而是这个标志的实际指定行为。

此外,指定0为共享模式FILE_FLAG_DELETE_ON_CLOSE并将阻止任何其他进程打开您的文件,只要您保持打开状态,即使有人知道它在那里,并且当您关闭它时文件将“消失”。即使您的应用程序崩溃,操作系统也会在您身后清理(如果 DRM 是原因)。如果您处于超级偏执模式并担心文件存在时系统蓝屏,您也可以另外安排待处理的移动。如果系统崩溃,这将在引导期间删除文件。

最后,给定 NTFS,您可以在任何文件甚至目录上创建一个具有随机的、最好是唯一的名称(例如文档的 SHA1 或 UUID)的备用流。目录上的备用流是......一种讨厌的黑客,但完全合法,它们工作得很好,并且不会出现在资源管理器中。这不会真正使您的文件不可见,但几乎如此(几乎在每个实际方面,无论如何)。如果你是一个好公民,你会想要使用系统临时文件夹来做这样的事情,而不是程序文件夹或其他你不应该写的地方。
创建备用流也非常简单,只需使用普通文件或目录名称并附加一个冒号 ( :) 和您想要的流的名称。不需要额外的 API。

除此之外,它变得有点困难。当然,您总是可以创建类似 ramdisk 之类的东西(虽然很难隐藏它),或者尝试使用内存流功能之一来欺骗应用程序,使其根据文件的指控从内存缓冲区读取...但这不是微不足道的事情。

于 2012-04-20T10:28:44.263 回答
1

您可以创建虚拟磁盘并将对其的访问限制为仅特定应用程序。为此,您必须编写文件系统驱动程序或文件系统过滤器驱动程序。两者都在内核模式下工作,并且很难编写和维护。我们公司提供的组件让您避免自己编写驱动程序并在用户模式下编写业务逻辑(我们在这些产品中提供驱动程序)。

您最明显的选择是摆脱 Adob​​e Reader 控制并使用一些第三方组件来显示 PDF 并可以从内存中加载它们。

但总的来说,聪明的黑客能够捕获您的数据,除非您有 (a) 非标准数据格式,和/或 (b) 从服务器动态流式传输数据,而不是将完整数据保存在计算机上。这些也不是万无一失的解决方案,但它们使黑客的工作更加困难。

于 2012-04-20T11:19:32.710 回答
1

如果某些东西需要在文件系统上传递给另一个应用程序,您不能将其隐藏/限制到某些进程。您的应用程序可以看到的任何内容,相同权限级别的其他任何内容也可以查看/访问。您可能可以锁定它,但如何锁定它取决于您要保护的原因。

请记住,用户的 PC 是他们的,而不是您的,因此他们可以完全访问其中的所有内容。

于 2012-04-20T10:32:41.250 回答