处理资源解密密码

Handling Resource Decryption Passwords

[此问题与登录凭据或user/player输入任何类型的密码等无关;谢谢,请继续阅读。]

首先,我的问题已经有人问过了,here and here。不过,我的问题与这两个问题都不同,因为我不是通过互联网连接来获取数据或关心任何类型的 "logging in"。尽可能简单地说,我正在制作一个游戏,我的游戏资源都被加密成一种专有格式,它需要一个密码来解密数据。我必须在源代码中隐藏该密码。除了将密码保存在应用程序本身之外,我想不出任何其他方法。在另一个文件中加密密码仍然需要一个密码,这只是开始了这个无休止的隐藏密码的循环,等等。

这让我想知道,现代游戏如何处理它们的资源解密密码?想想像使命召唤、上古卷轴、侠盗猎车手等游戏。他们加密他们的资源数据对吧?所以这意味着他们需要 password/salt/etc 来解密它。这样的密码也需要在可执行文件中。 那么他们把它藏在哪里呢?他们如何混淆它?

我考虑了一个方案,看起来其实还不错。基本上,我会构造一个方法,该方法 运行 通过一些奇怪的数学计算,构造一个字符串,然后 return 数据用作密码。有人可以将方法从代码中删除,然后在他们自己的私人应用程序中启动它,但至少不会像这样公然:

public const string ResourceDecryptionPassword = "MY_AWESOME_DECRYPTION_PASSWORD";

另外,我考虑过将密码保存为一个大的硬编码字节数组,我可以在应用程序启动期间将其转换回字符串。

任何人都可以提出解决此问题的任何其他解决方案吗?

还有,我忘了说:我的游戏源代码会被混淆。这很容易,所以它已经很难直观地浏览代码。 如何隐藏加密资源的密码,我只需要一个好的解决方案。

根据您收到的评论,您已经知道"hiding"代码中的安全密钥不是一个好的做法。这是 Security through obscurity and it's not efficient.

对于游戏来说,很久以前就用过了。然后随着万维网的发展,游戏需要在线连接到 register/activate 游戏。
然而,这些游戏非常受欢迎,以至于最终都破解了(通过用虚拟支票代替在线激活)。这就是为什么大部分现代游戏内容(如果不是全部)现在只有在连接到游戏服务器时才可用。

反正有些游戏保留了部分旧方案并使用DRM while others (Pillars of Eternity) 没有。

共同的原则是所有DRM都是为了使密钥的逆向工程(或整个程序的调试)变得困难:易于计算,难以调试。

  • 大约有一百个嵌入式 encryption/decryption(有数百个键)。
  • 另一个例子是 DRM software 将代码处理到 VM 中。
  • 调用非托管代码解密数据。
  • 检测任何调试器并杀死它。
  • 生成解密非托管代码,编译它并运行它。

任何足够复杂的东西都可以。

我什至看到一些著名的金融控制台在 VNC 在机器上 运行 时拒绝启动...其他人抱怨 Process Explorer。
然而,这样的隐藏工作很复杂,如果你说代码将被混淆,它应该已经被混淆软件处理了。
顺便说一句,如果你的目的是玩游戏,你不应该错过windbg