有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

混淆你是否混淆了你的商业Java代码?

我想知道是否有人在自己的商业产品上使用商业/免费java模糊器。我只知道有一个项目在发布版的ant构建步骤中有一个模糊的步骤

你搞混了吗?如果是这样的话,你为什么要混淆呢

这真的是一种保护代码的方法,还是仅仅是让开发人员/管理人员感觉更好

编辑:好的,我想确切地说一下我的观点:你是否混淆了保护你的IP(你的算法,你在产品中所做的工作)?我不会因为安全原因而困惑,这感觉不对。所以我只是说保护你的应用程序代码免受竞争对手的攻击

@staffan有一个很好的观点:

The reason to stay away from chaining code flow is that some of those changes makes it impossible for the JVM to efficiently optimize the code. In effect it will actually degrade the performance of your application.


共 (6) 个答案

  1. # 1 楼答案

    我认为,在很大程度上,混淆是毫无意义的:即使有完整的源代码,也很难弄清楚它的意图是什么(假设没有注释,局部变量没有有意义的名称——从字节码重新生成源代码时就是这种情况)。模糊只是装饰蛋糕

    我认为开发人员,尤其是他们的经理,往往会过分夸大有人看到源代码的风险。虽然好的反编译器可以生成好看的源代码,但使用它并不是件小事,而且相关的成本(更不用说法律风险)很高,因此这种方法很少有用。我只对封闭源代码供应商的产品进行了反编译以调试问题(DB抽象层中的死锁,呃)。 字节码实际上是模糊的,我认为,但我们仍然发现了根本的问题——这是一个实际的设计问题

  2. # 2 楼答案

    我认为旧的(经典的)混淆方式正在逐渐失去其相关性。因为在大多数情况下,经典的模糊处理程序会破坏堆栈跟踪(这不利于支持客户机)

    现在主要的一点不是保护一些算法,而是保护敏感数据:API登录/密码/密钥、负责授权的代码(盗版仍然存在,尤其是西欧、俄罗斯、亚洲、IMHO)、广告账号ID等

    有趣的事实:我们所有这些敏感数据都是字符串。实际上,字符串大约占我们应用程序逻辑的50-80%。 在我看来,模糊处理的未来是“字符串加密工具”

    但现在“字符串加密”功能只在商业混淆器中可用,例如:AllatoriZelix KlassMasterSmokescreenStringer Java Obfuscation ToolkitDashO

    注意。 我是Licel LLC的首席执行官。Stringer Java模糊器的开发者

  3. # 3 楼答案

    我使用proguard进行JavaME开发。它不仅非常擅长使jar文件变小(对于移动设备来说是必不可少的),而且作为一种更好的方式,它非常有用,可以编写特定于设备的代码,而不必求助于IDE不友好的预处理工具,如天线

    例如

    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/库实现中的制造商错误,而无需扩展最终的可执行类文件

    我相信一些商业混淆器在某些情况下也可以将类文件合并在一起。这很有用,因为类越多,zip(jar)文件中的开销就越大

  4. # 4 楼答案

    如果您确实进行了模糊处理,请远离那些通过更改代码流和/或添加异常块等方式修改代码的模糊处理程序,以使其难以反汇编。为了使代码不可读,只需更改所有方法、字段和类的名称就足够了

    远离更改代码流的原因是,其中一些更改使JVM无法有效地优化代码。实际上,它会降低应用程序的性能

  5. # 5 楼答案

    我使用ProGuard并强烈推荐它。虽然模糊处理确实可以保护代码免受偶然攻击者的攻击,但它的主要好处是将删除未使用的类和方法的影响降至最低,并将所有标识符缩短到1或2个字符

  6. # 6 楼答案

    今年我花了一些时间尝试了各种Java模糊处理程序,发现其中一个比其他的要好几英里: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有goto's?嗯,JVM支持它们=)