Java 中的自定义类加载器 [已关闭]

Custom Class Loader In Java [closed]

提问人:NaN 提问时间:10/12/2013 最后编辑:NaN 更新时间:10/12/2013 访问量:9454

问:


要求代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试的解决方案、它们不起作用的原因以及预期的结果。Смотритетакже: Stack Overflow 问题清单

10年前关闭。

是否可以在 java 中制作我自己的自定义类加载器。如果是,请指导我。 我想在类文件中进行更改,而不是类混淆,以便任何工具都无法将其反转

Java JVM 类装入器 字节码

评论

2赞 Sotirios Delimanolis 10/12/2013
在寻求解决方案之前,请进行研究。
0赞 dkatzel 10/12/2013
如果字节码不能被“任何工具”理解,那么JVM也无法读取它,因此它不会运行
3赞 SLaks 10/12/2013
攻击者需要做的就是读取自定义类加载器提供给 JVM 的字节码。
0赞 NaN 10/14/2013
好的,我知道我的观点不清楚,但我在问这个问题之前做了研究,我只是想知道如何保护我的 java 应用程序不被逆转。因为互联网上没有关于如何加密类/Jar 的答案,而且我不想混淆类文件。所以答案基本上是没有办法保护Java应用程序,如果我错了,请纠正我。

答:

6赞 Scientist 10/12/2013 #1
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * Simple custom class loader implementation
 * 
 */
public class CustomClassLoader extends ClassLoader {

    /**
     * The HashMap where the classes will be cached
     */
    private Map<String, Class<?>> classes = new HashMap<String, Class<?>>();

    @Override
    public String toString() {
        return CustomClassLoader.class.getName();
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {

        if (classes.containsKey(name)) {
            return classes.get(name);
        }

        byte[] classData;

        try {
            classData = loadClassData(name);
        } catch (IOException e) {
            throw new ClassNotFoundException("Class [" + name
                    + "] could not be found", e);
        }

        Class<?> c = defineClass(name, classData, 0, classData.length);
        resolveClass(c);
        classes.put(name, c);

        return c;
    }

    /**
     * Load the class file into byte array
     * 
     * @param name
     *            The name of the class e.g. com.codeslices.test.TestClass}
     * @return The class file as byte array
     * @throws IOException
     */
    private byte[] loadClassData(String name) throws IOException {
        BufferedInputStream in = new BufferedInputStream(
                ClassLoader.getSystemResourceAsStream(name.replace(".", "/")
                        + ".class"));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int i;

        while ((i = in.read()) != -1) {
            out.write(i);
        }

        in.close();
        byte[] classData = out.toByteArray();
        out.close();

        return classData;
    }

    /**
     * Simple usage of the CustomClassLoader implementation
     * 
     * @param args
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws SecurityException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalArgumentException
     */
    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            NoSuchMethodException, SecurityException, IllegalArgumentException,
            InvocationTargetException
    {
        CustomClassLoader loader = new CustomClassLoader();
        // This class should be in your application class path
        Class<?> c = loader.findClass("net.codeslices.test.TestClass");
        Object o = c.newInstance();
        Method m = c.getMethod("toString");
        System.out.println(m.invoke(o));
    }

}
2赞 Christian Kuetbach 10/12/2013 #2

您可以使用一些混淆工具,例如 ProGuard。

自写的类加载器必须放在标准的 .class 文件中,JVM 可以加载它。然后,您可以对安全加载器进行逆向工程。

不要自己动手。在不了解加密算法的情况下编写“安全”代码将导致不安全的代码容易出错

评论

3赞 SLaks 10/12/2013
这不是问题,因为密码学无论如何都无济于事。(没有办法保留密钥)
1赞 Christian Kuetbach 10/12/2013
我只是想解释一下,大多数开发人员认为他们通过添加混淆或“模糊性安全”来使某些东西更安全,使程序更容易出错且安全性降低。
0赞 SLaks 10/12/2013
你当然是对的,但在这种情况下,默默无闻是唯一的选择。如果他是一个足够小的目标,攻击者甚至可能懒得投入对手工构建的系统进行逆向工程所需的工作。
0赞 Christian Kuetbach 10/12/2013
我想我会使用如下加密和解密方法来加密 jar 文件:examples.javacodegeeks.com/core-java/crypto/...但问题在于未加密的加密类加载器,其中包含机密。
0赞 Valsaraj Viswanathan 9/17/2021
请检查:stackoverflow.com/questions/68380968/...