Java中的自定义类装入器
是否可以用java制作自己的自定义类加载器。如果是,请指导我。Java中的自定义类装入器,java,jvm,classloader,bytecode,Java,Jvm,Classloader,Bytecode,是否可以用java制作自己的自定义类加载器。如果是,请指导我。 我想在类文件中更改类模糊处理,以使其不能被任何工具逆转,而不是类模糊处理。您可以使用一些模糊处理工具,如ProGuard import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; imp
我想在类文件中更改类模糊处理,以使其不能被任何工具逆转,而不是类模糊处理。您可以使用一些模糊处理工具,如ProGuard
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));
}
}
自编类加载器必须放在标准的.class文件中,JVM可以加载它。然后,您可以对安全加载程序进行反向工程
不要一个人做。在不了解加密算法的情况下编写安全代码将导致容易出错不安全的代码请在寻求解决方案之前进行研究。如果任何工具都无法理解字节码,则JVM也无法读取它,因此它将无法运行。攻击者只需读取自定义类加载器的字节码即可我知道我的观点不清楚,但在问这个问题之前我做了研究,我只是想知道如何保护我的java应用程序不被反转。因为在互联网上并没有关于如何加密class/Jar的答案,我不想混淆类文件。所以答案是基本上没有办法保护Java应用程序。如果我错了,请纠正我。这不是一个问题,因为密码学无论如何也帮不上忙。没有办法保留一个密钥我只是想解释一下,大多数开发人员认为他们通过添加模糊处理或模糊性来提高安全性会使程序更容易出错,也更不安全。你当然是对的,但在这种情况下,模糊性是唯一的选择。如果他是一个足够小的目标,攻击者甚至可能懒得投入反向工程手工构建系统所需的工作。我想我会使用如下加密和解密方法来加密jar文件:但问题是未加密的加密类加载器中有秘密。