6

所以我用visual 2012制作了一个加载图像和着色器(纯文本)的应用程序。但实际上,我不希望人们打开图像和着色器并乱七八糟。如何将所有这些外部文件压缩成单个或多个文件,但仍可由可执行文件读取?

4

3 回答 3

5

这个问题很难权威地回答,因为如果没有防篡改硬件,基本上不可能保护内容免受老练的黑客攻击。但是考虑到一个简单的威慑就足够好的说明,那么将您的内容作为资源嵌入到可执行文件中怎么样?请注意,有一些免费的工具可用于从 .exe 文件中提取资源。

或者,您可以加密每个文件并在应用程序加载它时对其进行解密。加密可以简单到将每个字节与已知的常量字节进行异或运算,或者您可以使用真正的加密算法,例如 Microsoft CryptoAPI中的加密算法。使用真正的算法将改善混淆,但仍然不会真正安全。

这是一个简单的程序,它使用这个 RC4 实现(比 CryptoAPI 更容易使用)来加密或解密文件并将其写入标准输出:

#include <algorithm>
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

// insert RC4 implementation here

int main(int argc, char *argv[]) {
   const std::string password = "no more secrets";
   const std::string filename = argv[1];

   // Read file into a buffer.
   std::ifstream f(filename.c_str(), std::ios::in | std::ios::binary);
   std::vector<char> buffer;
   f >> std::noskipws;
   std::copy(
      std::istream_iterator<char>(f), std::istream_iterator<char>(),
      std::back_inserter(buffer));

   // Initialize the key from a password.
   rc4_key key;
   prepare_key((unsigned char *)password.data(), (int)password.size(), &key);

   // Encrypt or decrypt (same operation).
   rc4((unsigned char *)&buffer[0], (int)buffer.size(), &key);

   // Write result to stdout.
   std::cout.write(&buffer[0], buffer.size());

   return 0;
}

请注意,这不是使用 RC4 的安全方式,并且 RC4 算法本身不再被认为是安全的。

于 2013-05-23T18:38:39.040 回答
2

查看http://en.wikipedia.org/wiki/PAK_(file_format)
SourceForge 上有一个用于 Quake2 pak 文件的库:http: //sourceforge.net/projects/paklib/
但是,我建议直接访问源代码:https ://github.com/id-Software/Quake-2/blob/master/qcommon/files.c

于 2013-05-23T18:57:30.313 回答
2

将文件编码到源代码中的可执行文件中。创建一个数组,文件的每个字节一次编码一个字节。在可执行文件中包含数据是一种非常简单的技术。

于 2013-05-29T03:05:43.600 回答