Java 类在加载到内存之前会加密,在调试或反编译时无法解密

问题描述 投票:0回答:1

我有一个java类文件,我不想让别人看到源代码。 并且该类需要通过java代码中的类加载器来统治JVM,如下所示:

Class<?> classLoader = Class.forName("java.lang.ClassLoader");
        Method defineClass = classLoader.getDeclaredMethod("defineClass",String.class,byte[].class,int.class,int.class);
        defineClass.setAccessible(true);
        byte[] code = Base64.getDecoder().decode(base64);
        Method getSystemClassLoader = classLoader.getMethod("getSystemClassLoader");
        Object objClassLoader = getSystemClassLoader.invoke(null);
        Class<?> MyClass = (Class)defineClass.invoke(objClassLoader,"MyClass", code, 0, code.length);
        MyClass.newInstance();

显然我所要求的在这个例子中没有实现,因为你可以看到源代码购买调试或者只是将

byte[] code
写入类文件并反编译它。

我想知道是否有办法实现该类只在内存中消失

我尝试了对称加密算法和非对称加密算法。但这两种方法都需要在代码中写入解密密钥。所以我还是达不到这个目标。

java class encryption cryptography jvm
1个回答
1
投票

我想知道是否有办法实现该类只在内存中解密。

当然。您可以使用许多预先存在的算法和实现来解密内存中的加密字节码数组。

但是...

我尝试了对称加密算法和非对称加密算法。但这两种方法都需要在代码中写入解密密钥。

...是问题所在。这根本无法解决。您可以尝试将密钥隐藏在代码中,或从远程服务器请求它。但在某些时候,该密钥需要在 JVM 内存中以明确的方式可用才能解密字节码。

如果用户无法获得解密密钥,则根本无法解决用户平台上的解密问题。

即使有,你仍然还没有解决问题!因为无论您做什么,用户都可以下载 OpenJDK 源代码,对其进行调整以在 defineClass

 方法中拦截解密的字节码
。然后,他们构建经过调整的 JVM,用它来运行您的应用程序……并捕获您宝贵的字节码。

最实用的解决方案是

接受人们将能够获得字节码,但通过混淆字节码会让他们的生活变得更加困难。

或者只是在>您

的平台上运行您的应用程序 < control.


FWIW,没有万无一失的方法可以保护二进制代码免遭逆向工程。如果用户控制平台并且他们可以在他们的平台上运行您的应用程序,他们可以对其进行逆向工程......假设用户拥有必要的技能、工具、时间和动机。

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