你以前是否混淆过你的代码?是否有正当理由这样做?
13 回答
我混淆了我的 JavaScript。它使它更小,从而减少了下载时间。此外,由于代码已交给客户,我公司不希望他们能够阅读它。
是的,让逆向工程变得更加困难。
当然是为了确保终身工作(开玩笑)。
这是非常有趣和有教育意义的:如何编写不可维护的代码。
它被称为“工作保障”。这也是使用 Perl 的原因——不需要将混淆作为单独的任务进行,因此可以提高生产力,而不会失去工作安全性。
如果您愿意,可以将其称为“通过可混淆性实现的安全性”。
我不认为让逆向工程变得更难是一个正当的理由。
混淆代码的一个很好的理由是减少编译后的占用空间。例如,J2ME 应用程序需要尽可能小。如果您通过混淆器(和优化器)运行您的应用程序,那么您可以将 jar 从几 Mb 减少到几百 Kb。
上面提到的另一点是,大多数混淆器也是可以提高应用程序性能的优化器。
这不是也被用作默默无闻的安全吗?当您的源代码是公开可用的(javascript 等)时,您可能希望至少更难理解客户端实际发生的情况。
安全总是充满妥协。但我认为默默无闻的安全是最不有效的方法之一。
我相信所有的有线电视机顶盒都会混淆 java 代码。这确实使事情更难破解,并且由于有线电视盒将在您的家中,因此理论上它们是可以破解的。
我不确定这有多重要,因为有线卡仍将控制信号加密并直接从视频源而不是 Java 代码指南或 Java 应用程序获得授权,但它们非常专注于这个概念。
顺便说一句,跟踪从混淆堆栈中抛出的异常并不容易!实际上,我曾经记得 aH 表示特定构建的“空指针异常”。
我记得创建了一个在 .NET 中构建的用于在线备份应用程序的 Windows 服务。我可以轻松地使用 Visual Studio 或 .NET Reflector 等工具来查看其中的类和源代码。
我创建了一个新的 Visual Studio 测试应用程序并向它添加了 Windows 服务引用。双击引用,我可以看到所有的类、命名空间(虽然不是源代码)。任何人都可以通过查看类名来了解模块的内部工作。在我的例子中,一个这样的类是 FTPHandler,它清楚地告诉了备份的去向。
.NET Reflector 通过显示实际代码超越了这一点。它甚至可以选择导出整个项目,这样你就可以得到一个 VS 项目,其中包含与开发人员所拥有的所有类和源代码相似的所有类和源代码。
我认为混淆是有道理的,如果不是不可能的话,至少让某人更难拆卸。此外,我认为这对于涉及大量客户群的产品是有意义的,因为您不希望竞争对手对您的产品了解太多。
如果我将 Java Swing 应用程序交付给客户端,我总是在分发之前混淆类文件。
你永远不会太小心 - 我曾经在我的类文件中指出了一个不错的 Java 反编译器(我使用了 JD Java 反编译器 - http://www.djjavadecompiler.com/),并获得了几乎完美地再现原始代码的奖励。那是相当令人不安的,所以从那以后我开始混淆我的生产代码。我自己使用 Klassmaster ( http://www.zelix.com/klassmaster/ )
查看我为磁盘驱动程序项目编写的一些代码让我质疑混淆的含义。
((int8_t (*)( int32_t, void * )) hdd->_ctrl)( DISK_CMD_REQUEST, (void *) dr );
或者这只是 C 中的系统编程?还是应该以不同的方式编写该行?问题...
是的,不是的,我还没有使用易于反编译的工具交付应用程序。
我确实为旧的 Basic 和 UCSD Pascal 解释器运行了类似混淆器的东西,但这是出于不同的原因,优化了运行时间。
我主要混淆了我的 Android 应用程序的代码。我使用 ProGuard 工具来混淆代码。当我从事 C# 项目时,我们的团队使用了 ArmDot。它是许可和混淆系统。现代混淆器不仅用于使黑客攻击过程变得困难。他们能够保护程序和游戏免受作弊,检查许可证/密钥,甚至优化代码。但我认为没有必要在每个项目中都使用混淆器。
当您需要在源代码中提供某些东西时(通常是由于它正在构建的环境,例如没有共享库的系统,特别是如果您作为卖方没有要构建的确切系统),最常见的是这样做),但是您不希望您提供给它的人能够显着(或根本)修改或扩展它。
这过去比今天普遍得多。它还导致了(已停止?)混淆 C 竞赛。
合法的(尽管可以说不是“合法的”)用途可能是为您以模糊方式与 GPL 代码链接的应用程序发布“源代码”。是源码,可以修改,就是很难。这将是一个更极端的版本,即不加注释地发布它,或者在所有空白修剪后发布,或者(这可能会推动法律依据)发布从 C 生成的汇编源代码(并且可能是手动调整的,所以你可以说它不是只是中间代码)。