【问题标题】:How to encode external files that come with the .exe如何对 .exe 附带的外部文件进行编码
【发布时间】:2013-05-19 19:07:11
【问题描述】:

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

【问题讨论】:

  • 您是否试图阻止人们将您的图像和着色器用于其他目的,或者阻止人们修改它们以使您的程序看起来或行为不同?或两者?前者需要某种加密或混淆,而后者只需要验证。此外,除非你有防篡改的硬件支持,否则这两项任务对于坚定的攻击者实际上是不可能的,所以另一个问题是你想让它有多难?劝阻一个普通用户并不难,但一个严肃的黑客是另一回事。
  • 您好,感谢您的回答。我对一个简单的很满意,这样他们就不会轻易获得图像、着色器、模型等。

标签: c++ visual-studio-2012 executable


【解决方案1】:

这个问题很难权威地回答,因为如果没有防篡改硬件,基本上不可能保护内容免受老练的黑客攻击。但考虑到一个简单的威慑就足够好的澄清,那么 embedding your content as resources in the executable 怎么样?请注意,有一些免费工具可用于从 .exe 文件中提取资源。

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

这是一个简单的程序,它使用this RC4 implementation(比 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 算法本身不再被认为是安全的。

【讨论】:

  • 严格来说,将简单的异或称为“加密”是不负责任的。
  • @IronSavior 我试图向后弯腰说这不安全。有各种各样的加密算法——有些(被认为)安全,有些则不安全。 XOR 是替代密码的一个示例 - 我不同意替代密码不是原始加密形式。
  • 你能提供一些加密和解密文件的代码吗?它是如何工作的?
  • 你有文章加样例代码在这里:msdn.microsoft.com/en-us/library/ms867086.aspx
  • @marcg11 基本上,您会将文件读入缓冲区,然后在缓冲区上应用加密或解密。我在答案中添加了一个示例。
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多