覆盖c库文件功能?

时间:2013-09-03 16:20:47

标签: c++ c file stdio

我正在开发游戏,根据我正在使用的声音资产的许可协议的要求之一是,它们的分发方式使得最终用户无法访问它们。所以,我正在考虑将它们聚合成一个平面文件,加密它们,或者其他一些文件。问题是我正在使用的声音库(Hekkus Sound System)只接受'char *'文件路径并在内部处理文件读取。所以,如果我要继续使用它,我将不得不重写c stdio文件函数来处理加密或我决定做的任何事情。这似乎可行,但它让我担心。在网络上看,我看到人们在我关注的平台(Win32,Android和iOS)上遇到奇怪的令人沮丧的问题。

是否碰巧有一个跨平台的图书馆负责这个?你会推荐更好的方法吗?

6 个答案:

答案 0 :(得分:7)

您是否可以选择使用命名管道而不是普通文件?如果是这样,您可以将管道作为要读取的文件呈现给声音库,您可以解密数据并将其写入管道,没问题。 (有关命名管道的说明,请参阅Beej's Guide。)

答案 1 :(得分:5)

覆盖stdio的方式是一个你不知道它如何工作的lib完全以开发人员没有想到的方式工作,对我来说看起来不是正确的方法,因为它并不容易。实现ramdrive需要这么多努力,我建议搜索另一个音频库。

我发现的Hekkus Sound System是由一个人构建的,并且最后更新了2012年。我不会依赖只有一个人工作的lib而不共享源。

我的建议是,花时间寻找合适的声音,而不是寻找一个可疑的工作。

答案 2 :(得分:2)

一种可能性是使用encrypted loopback filesystem(谷歌获取其他资源)。

这种方法的工作方式是将资产放在加密文件系统上,该文件系统实际上位于一个简单的文件中。这个文件系统作为环回设备安装在某个地方。密码需要在附加/挂载时提供。安装后,所有文件都可作为常规文件提供给您的软件。但除此之外,文件已加密且无法访问。

答案 3 :(得分:1)

它依赖于编译器而不是保证功能,但是许多允许您将文件/资源​​直接嵌入到exe中并在代码中读取它们,就像从磁盘中读取它们一样。您可以通过这种方式嵌入声音文件。但是它会显着增加你的exe的大小。

答案 4 :(得分:1)

另一种基于UNIX的方法:

环境变量LD_PRELOAD可用于覆盖任何已链接的可执行文件的共享库。 LD_PRELOAD中提到的库导出的所有符号都将解析为该库,包括对openreadclose等libc函数的调用。使用libdl,包装库也可以调用原始实现。

因此,您需要做的就是在适当设置LD_PRELOAD的环境中启动使用Hekkus音响系统的过程,并且您可以对它所读取的文件执行任何您喜欢的操作。

但请注意,绝对没有办法让用户无法访问数据:他必须能够听到这个数据意味着他必须具有访问权限。即使链中的所有软件都使用加密,并且您的用户不愿意破解硬件,将音频输出插孔与音频输入插孔连接也不是很难,是吗?并且你不能禁止用户使用耳机,对吗?当然,内核可以看到未加密的所有音频输出,并可以在其他地方发送副本......

答案 5 :(得分:0)

您的问题的解决方案将是ramdisk。 http://en.wikipedia.org/wiki/RAM_drive 在ram中使用一块内存,就像它是一个磁盘一样。 也有可用的软件。 ram中的缓存数据库正变得越来越流行。

它使文件不会出现在磁盘上,使用户可以轻松访问该文件。