题
我不知道,如果任何人使用商业/自由java obfuscators在他自己的商业产品。我只知道有关一个项目,实际上有一个模糊的步骤在蚂蚁建立一步的版本。
你混淆?如果是这样,为什么你混淆?
它是一个真正的方式保护的代码或是它只是一个更好的感觉开发人员/管理人员?
编辑: 好吧,我是准确的关于我的观点:你混淆,以保护您的IP(你的算法,工作你已经把你的产品)?我不会模糊的用于安全原因,这感觉不对。因此我只谈保护应用程序代码的竞争者。
@斯塔凡* 有一个很好的观点:
原因远离码链接流动是其中一些变化使得它不可能为JVM有效地优化的代码。在效果它实际上会降低性能的应用程序。
解决方案
如果你这样做混淆,远离obfuscators修改码通过改变码流动和/或增加的异常块和这种使它硬拆开它。使代码无法读取它通常是不够的,只是改变名称的方式、领域和课程。
原因远离改变码流是,这些变化使得它不可能为JVM有效地优化的代码。在效果它实际上会降低性能的应用程序。
其他提示
我认为,旧(古典)的方式的模糊处理正在逐渐失去其相关性。因为在大多数情况下,一个经典的obfuscators打破一个堆栈(它是不是好支持您的客户)
如今的主要观点不保护的一些算法,但是保护敏感的数据:API登录名/密码/钥匙、编码,它负责授权(海盗行为仍然在这里,尤其是西欧、俄罗斯、亚,恕我直言)、广告账户身份证,等等。
有趣的事实:我们拥有所有这些敏感数据在弦。实际上串大约50%至80%的逻辑我们的应用。对我来说似乎未来的模糊处理的是"String加密工具"。
但是现在"串密"的特点是只提供在商业obfuscators,例如: Allatori, Zelix KlassMaster, 烟幕, 纵梁Java模糊处理的工具包, DashO.
N.B。我是首席执行官Licel有限责任公司。开发梁Java混淆。
我用proguard为JavaME发展。它不只是非常非常好在罐子文件较小(必要用于移动),但它是有用的,作为一个更好的方式做设备特定的代码,而不诉诸IDE不友好的预处理工具,例如天线。
E.g。
public void doSomething()
{
/* Generated config class containing static finals: */
if (Configuration.ISMOTOROLA)
{
System.out.println("This is a motorola phone");
}
else
{
System.out.println("This is not a motorola phone");
}
}
这得到编制、模糊,以及这类文件结束了,好像你曾写道:
public void doSomething()
{
System.out.println("This is a motorola phone");
}
所以你可以有变体的代码的工作周围制造商中的错误JVM/图书馆实现,而不膨胀出最终的可执行类文件。
我认为,一些商业obfuscators也可以合并类文件一起在某些情况下。这是有用的,因为更多的课程有较大的尺寸大小的开销你的拉链(罐子)的文件。
我花了一些时间,今年尝试了各种Java obfuscators,我找到一个可以英里之前剩下的: JBCO.这是不幸的是,有一点麻烦设立的,没有任何GUI,但在级别的混淆它产生,它是无与伦比的。你尝试喂养它的一个简单的循环,如果你的反编译器不会崩溃努力装载它,你会看到这样的事情:
if(i < ll1) goto _L6; else goto _L5
_L5:
char ac[] = run(stop(lI1l));
l7 = (long)ac.length << 32 & 0xffffffff00000000L ^ l7 & 0xffffffffL;
if((int)((l7 & 0xffffffff00000000L) >> 32) != $5$)
{
l = (long)III << 50 & 0x4000000000000L ^ l & 0xfffbffffffffffffL;
} else
{
for(l3 = (long)III & 0xffffffffL ^ l3 & 0xffffffff00000000L; (int)(l3 & 0xffffffffL) < ll1; l3 = (long)(S$$ + (int)(l3 & 0xffffffffL)) ^ l3 & 0xffffffff00000000L)
{
for(int j = III; j < ll1; j++)
{
l2 = (long)actionevent[j][(int)(l3 & 0xffffffffL)] & 65535L ^ l2 & 0xffffffffffff0000L;
l6 = (long)(j << -351) & 0xffffffffL ^ l6 & 0xffffffff00000000L;
l1 = (long)((int)(l6 & 0xffffffffL) + j) & 0xffffffffL ^ l1 & 0xffffffff00000000L;
l = (long)((int)(l1 & 0xffffffffL) + (int)(l3 & 0xffffffffL)) << 16 & 0xffffffff0000L ^ l & 0xffff00000000ffffL;
l = (long)ac[(int)((l & 0xffffffff0000L) >> 16)] & 65535L ^ l & 0xffffffffffff0000L;
if((char)(int)(l2 & 65535L) != (char)(int)(l & 65535L))
{
l = (long)III << 50 & 0x4000000000000L ^ l & 0xfffbffffffffffffL;
}
}
}
}
你不知道Java已转到的?好吧,JVM支持他们=)
我用 ProGuard 和高度推荐。同时混淆不保护你的代码随意攻击,它的主要好处是尽量减少效应删除未使用的类和方法,缩短了所有的标识符为1或2个字符。
我认为,对于大部分模糊处理,是毫无意义:即使有完整的源代码是一般的硬盘足够找出到底什么意图(假设没有评论意见,并没有有意义的名称用于地方的变量--这种情况下,当重新生成来源在从字节的代码)。混淆只是装点蛋糕。
我认为,开发和尤其是他们的管理人员往往大大超夸大的风险,有人看到源代码。虽然良好的防止反编译可以产生很好看源代码,这是不平凡的与它的工作,以及相关的费用(更不用说法律风险)也高到足以使这种做法偶尔是有用的。我只有反编译到调试问题闭源供应商的产品(僵局DB抽象层,呃).码实际上是混淆,我想,但我们仍然发现潜在的问题--这是一个实际的设计问题。
我想这真下来 什么样的 Java代码是的,它是如何分布和谁是你的客户。我们不要混淆什么,因为我们从来没找到那个特别好的和往往是更多的麻烦比它的价值。如果有人已接到我们的罐子文件和已有的知识能嗅到周围在他们里面,然后还有更令人担忧的事情,他们可以做比撕掉我们的源码。