为什么要混淆代码?

问题描述 投票:12回答:13

您以前曾经混淆过您的代码吗?这样做有合理的理由吗?

obfuscation
13个回答
20
投票

我混淆了我的JavaScript。它使它变小,从而减少了下载时间。此外,由于代码交给客户,我的公司不希望他们能够阅读它。


0
投票

是和否,我还没有使用易于分解的工具交付应用程序。

我确实为旧的Basic和UCSD Pascal解释器运行了类似混淆器的东西,但这是出于不同的原因,优化了运行时间。


0
投票

如果我向客户端提供Java Swing应用程序,我总是在分发之前对类文件进行模糊处理。

你永远不会太小心 - 我曾经在我的班级文件中指出了一个不错的Java反编译器(我使用了JD Java Decompiler - http://www.djjavadecompiler.com/),并且获得了原始代码几乎完美的再现。那是相当令人不安的,所以从那时起我开始混淆我的生产代码。我自己使用Klassmaster(http://www.zelix.com/klassmaster/


0
投票

我主要模糊了我的Android应用程序的代码。我使用ProGuard工具来混淆代码。当我参与C#项目时,我们的团队使用了ArmDot。它是许可和混淆系统。现代混淆器不仅用于使黑客攻击过程变得困难。他们能够保护程序和游戏免受作弊,检查许可证/密钥甚至优化代码。但我不认为有必要在每个项目中使用混淆器。


-1
投票

当你需要在源代码中提供某些内容时(通常是由于它内置的环境,例如没有共享库的系统,特别是如果你作为卖方没有构建完整的系统),这是最常见的,但是你不希望你提供给它的人能够显着地(或根本)修改或扩展它。

这曾经比今天更常见。它还导致(已解散?)混淆C大赛。

合法(虽然可以说不是“合法”)使用可能是为了以混淆方式与GPL代码链接的应用程序发布“源代码”。它的来源,它可以修改,它只是非常难。这将是一个更极端的版本,没有评论释放它,或释放所有空白修剪,或(这将推动法律理由可能)释放从C生成的汇编源(也许手动调整,所以你可以说它不是只是中间代码)。


14
投票

是的,使逆向工程变得更难。


8
投票

当然,为了确保终身工作(开玩笑)。

这非常有趣和教育:How to Write Unmaintanable Code


8
投票

它被称为“工作安全”。这也是使用Perl的原因 - 不需要将混淆作为单独的任务,因此可以提高工作效率,而不会损失工作安全性。

如果愿意,可以称之为“通过混淆可见性”。


7
投票

我不相信使逆向工程更难是一个正当理由。

混淆代码的一个很好的理由是减少编译的占用空间。例如,J2ME应用程序需要尽可能小。如果您通过混淆器(和优化器)运行app,那么您可以将jar从几Mb减少到几百Kb。

上面的另一点是,大多数混淆器也是可以提高应用程序性能的优化器。


2
投票

这不是通过默默无闻的安全措施吗?当您的源代码公开可用(javascript等)时,您可能希望至少有点难以理解客户端实际发生的事情。

安全总是充满妥协。但我认为默默无闻的安全是最不有效的方法之一。


1
投票

我相信所有电视有线电视盒都会有java代码混淆。这确实使得攻击更难,而且由于有线电视盒将在你的家中,它们理论上是可以破解的。

我不确定它有多重要,因为有线卡仍将控制信号加密并直接从视频源而不是java代码指南或java应用程序获得授权,但他们非常专注于这个概念。

顺便说一句,跟踪从混淆堆栈中抛出的异常并不容易!我实际上记得aH意味着特定构建的“空指针异常”。


0
投票

我记得在.NET中创建了一个用于在线备份的Windows服务应用程序。我可以轻松地使用Visual Studio或.NET Reflector之类的工具来查看其中的类和源代码。

我创建了一个新的Visual Studio Test应用程序并添加了Windows服务引用。双击引用,我可以看到所有类,命名空间的一切(虽然不是源代码)。任何人都可以通过查看类名来弄清楚模块的内部工作。在我的例子中,一个这样的类是FTPHandler,它清楚地告诉备份的去向。

.NET Reflector通过显示实际代码来超越它。它甚至可以选择导出整个项目,这样你就可以获得一个VS项目,其中包含与开发人员类似的所有类和源代码。

我认为混淆是有意义的,如果不是不可能让某人拆解,那就更难了。此外,我认为对于涉及大客户群的产品而言,您不希望竞争对手了解您的产品。


0
投票

看一下我为我的磁盘驱动程序项目编写的一些代码让我质疑被混淆的含义。

    ((int8_t (*)( int32_t, void * )) hdd->_ctrl)( DISK_CMD_REQUEST, (void *) dr );

或者那只是C中的系统编程?或者该行应该以不同的方式写出来?问题...

© www.soinside.com 2019 - 2024. All rights reserved.