我最近了解了代码混淆。当你有空闲时间,这是件好事,但我有不同的问题。为什么要这样做?
首先,有些语言我确信它是伟大的东西 - 解释的那些,如php,JavaScript等等。这似乎是一件好事,更安全的事情。
其次,有些语言似乎对我没有任何实际影响 - 所有本机代码编译语言。以C为例。在编译时,所有变量名,函数名,大多数混淆技术都会消失。如果有些人可以将它变成本机代码,那就像递归而不是循环等等,但反汇编的代码无论如何都会有一些反汇编程序生成的标识符,对吧?
最后一类是我不太确定的语言。这就是我要问的主要原因。这些语言将是Java,C#(.NET)以及WP7中使用的最后一个Silverlight。我问,因为我读了一些文章,说明在WP7应用程序中,代码混淆有助于防止代码被黑客入侵。但我一直认为字节码与标准汇编代码非常相似,因此再次没有关于真正的预编译变量名,函数名等的任何信息。那么,真相在哪里?
答案 0 :(得分:2)
如果你愿意,可以这样做,但不要指望任何坚定的人被它吓跑。存在去混淆器,人们也可以读取混淆代码(就像有人可以读取优化的汇编并重建原始C代码一样)。代码混淆只会给你一种虚假的安全感,并可能会阻止一个只是好奇的人(而不是阻止那些认真窃取你的代码的人)。所有它给你的是一种虚假的安全感,但没有真正的安全感。施奈尔恰当地命名了这个“安全剧院”。
是的,许多保留有关源的更多信息的现代语言可以比编译到机器代码的语言更好地进行模糊处理。对于后者,编译器已经在优化方面做得非常好。不过,你的字节码概念类似于传统的汇编程序。特别是.NET字节码保留了足够的元数据来几乎完全重建原始源(参见Reflector)。没有保留的是局部变量的名称和方法的参数。但是你仍然需要并保留方法和类名。
您应该注意的另一个问题:如果您向客户提供模糊的可执行文件并且程序崩溃,请确保您有办法获得真正的堆栈跟踪而不是混淆的堆栈跟踪。说“对不起,我无法确定为什么我的程序因为我选择对其进行模糊处理而导致我的工作数小时失效的根本原因”并不会削减它,我猜: - )
答案 1 :(得分:0)
对于具有硬件限制的移动应用程序,混淆是一种常见技术。混淆的代码往往具有较短的标识符,因此较小的二进制文件。