Programming languages 各种语言中的代码混淆用法

Programming languages 各种语言中的代码混淆用法,programming-languages,obfuscation,Programming Languages,Obfuscation,我最近学习了代码混淆。当你有空闲的时候,这是件好事,但我有不同的问题。为什么要这样做 首先,我确信有一些语言是很好的解释语言,比如php、JavaScript等等。在那里,这似乎是一件更安全的好事情 第二,有些语言似乎对我没有实际影响——所有本机代码编译语言。以C为例。编译时,所有变量名、函数名和大多数模糊处理技术都消失了。如果有人能将其转换为本机代码,那将是递归,而不是循环等等,但是反汇编代码将使用反汇编程序生成的标识符,而不是名称,对吗 最后一类是我不太确定的语言。这就是我问的主要原因。这些

我最近学习了代码混淆。当你有空闲的时候,这是件好事,但我有不同的问题。为什么要这样做

首先,我确信有一些语言是很好的解释语言,比如php、JavaScript等等。在那里,这似乎是一件更安全的好事情

第二,有些语言似乎对我没有实际影响——所有本机代码编译语言。以C为例。编译时,所有变量名、函数名和大多数模糊处理技术都消失了。如果有人能将其转换为本机代码,那将是递归,而不是循环等等,但是反汇编代码将使用反汇编程序生成的标识符,而不是名称,对吗


最后一类是我不太确定的语言。这就是我问的主要原因。这些语言将是Java、C#(.NET)和WP7中最后使用的Silverlight。我之所以这么问是因为我读了一篇文章,其中指出在WP7应用程序上,代码混淆有助于防止代码被黑客攻击。但我一直认为字节码与标准汇编代码非常相似,因此也没有任何关于真正的预编译变量名、函数名等的信息。那么,真相在哪里呢?

如果你愿意,可以这样做,但不要指望任何有决心的人会被它吓跑。有解模糊器,人们也可以读取模糊代码(就像有人可以读取优化的汇编并重构原始C代码一样)。代码混淆只会给你一种虚假的安全感,可能会吓阻一个好奇的人(而不是吓阻那些认真想偷你代码的人)。它给你的只是一种虚假的安全感,而不是真正的安全感。施奈尔很贴切地把这个叫做“安全剧场”

是的,许多保留了更多源代码信息的现代语言可以比那些直接编译为机器代码的语言更好地进行模糊处理。对于后者,编译器已经在优化方面做了相当好的工作。不过,您认为字节码类似于传统汇编程序的想法在这里有点错误。尤其是.NET字节码保留了足够的元数据,几乎可以准确地重建原始源代码(参见Reflector)。没有保留的是局部变量的名称和方法的参数。但是您仍然需要并保留方法和类名


另一个你应该注意的问题是:如果你给你的客户一个模糊的可执行文件,而你的程序崩溃了,确保你有办法得到真正的堆栈跟踪,而不是模糊的。说“对不起,我无法确定为什么我的程序因为我选择了模糊处理而浪费了您数小时的工作的根本原因”并不能解决问题,我想:-)

对于有硬件限制的移动应用程序来说,模糊处理是一种常见的技术。模糊代码往往具有较短的标识符,因此二进制文件较小。

事实是,除非你感到无聊,喜欢这种消遣,或者是一个偏执狂,认为全世界都会试图窃取他们的超级复制者创新想法,否则你不会这么做。它带来的“安全感”并不存在,它是一种虚假的安全感,类似于“通过默默无闻的安全感”。等等,沃特?正如问题中已经提到的,本机编译无论如何都会删除所有标识符。另外,它甚至没有接近于回答这个问题。Java不是一种本地语言!首先谢谢。我更多的是一个“学生”而不是开发者。我最感兴趣的是硬件而不是软件,我主要用C或汇编语言编写高精度的MCU计时。我最想知道的是,在字节码编译平台上这样做有什么真正的好处。我必须说,我对你的回答感到非常惊讶,.net保存元数据几乎可以重建原始源代码。为什么?我总是倾向于寻找事物的逻辑目的。你知道,读取汇编代码是一回事,但能够重构代码也是另一回事。@B.Gen:请记住,字节码只是执行代码的第一步。之后还有一个即时编译器生成本机代码。至于为什么会保留这么多元数据,我不清楚。但其中一些可能用于与其他.NET语言的互操作性,一些可能用于调试支持(例如标记编译器或工具生成的代码),等等。Reflector还能够重建LINQ表达式的表达式树,尽管在字节码中只保留静态方法调用和lambda函数。