我正在开发一款使用脚本语言进行自动化的闭源游戏。几乎所有游戏逻辑都由脚本处理。脚本可以编译为字节码格式,但由于语言的性质,必须保留标识符。可以使用二进制到文本编码将编译的脚本嵌入到其他基于文本的资源格式中。
我想加密已编译的脚本以在发布期间保护源,但由于语言,字节码格式和二进制到文本编码方案都是专有的,我是否需要担心加密?如果是这样,我应该干扰一些字节并将其称为一天,还是应该使用功能齐全的加密解决方案?加密不应该过度增加可执行文件的大小,因为脚本可能很大并且加载时间很重要。
答案 0 :(得分:1)
您不应该假设人们无法读取二进制专有格式。有许多人在没有任何文档的情况下非常擅长逆向工程协议。
因此,如果您想保持源安全,则需要一些真正的安全性。唯一的问题是,如果你加密文件,你需要给你的用户提供解密密钥才能玩游戏,当你这样做时,只有时间问题才有人知道如何获得密钥并用它来解密所有文件。
所以基本上,不幸的是,你做的并不多。您可以尝试模糊代码,但即使这样也不会阻止所有人。
答案 1 :(得分:1)
在Windows上,可执行文件的大小对加载时间没有影响,因为exe只是映射到内存中,然后根据需要进行分页。我无法想象为什么对于* nix来说也不是这样。
因此,如果脚本不需要与.exe分开更改,则可以将它们嵌入到.exe中,这会使用户难以更改,即使他们可以找到它们。我编写了一个小工具,一旦将数据文件转换为.obj文件,这使得将数据嵌入到我的exe中非常容易 - 结果很容易编写一个只包含数据的目标文件。
当然,如果你非常关心保护这些数据,而不是完全加密,只有你自己选择,但如果你只是想阻止偶然的黑客攻击,那么让文件难以理解可能会很好够了。
答案 2 :(得分:1)
你所说的不是加密,因为你将不得不随身携带解密密钥。这只是混淆。无论您尝试隐藏解密密钥多少,如果您的程序可以找到它,那么用户也可以。
因此,一旦您了解我们只是在讨论各种混淆方案,问题就是您需要多少混淆。专有的字节编译可能比加密更高,我称之为一天。无论您是否加密,任何想要跟踪逻辑的人都可以在其上放置一个调试器。如果他们已经对运行时引擎进行了逆向工程来计算字节码,那么它们就已经存在于具有未加密数据的代码部分中。
也就是说,如果您发现文件中的标识符有问题,您可以在字节编译之前将它们机械地转换为随机字符串。
答案 3 :(得分:0)
加密在这里不会给你太多。
基本上,无论您添加什么加密层,可执行文件本身都必须能够执行解密才能运行脚本。你锁门,但你把钥匙留在锁里。这是不可避免的。
加密的作用是,它有点提高了谁可以访问数据的标准。它需要一些拆卸技巧。简单地将文件嵌入可执行文件中就已经过滤掉了非常好的黑客。那些没有被这种嵌入阻止的人也是那些能够遵循数据处理路径,找到解密逻辑并随意抽出解密代码的人。加密层也可能增加重要性:加密的内容当然是值得的。因此,尝试过于时髦的事情可能会让你的情况变得更糟,而不是更好。
另一方面,将文件嵌入可执行二进制文件可能是一个好主意。它将消除在运行时在文件系统上定位它们的需要(因为硬链接,在Unix系统上定位运行时比在Windows上更困难一些:在Windows上,可执行文件可以很容易地获得自己的路径,但是在Unix上,硬链接的存在意味着“可执行路径不明确”。