提问人:NaN 提问时间:10/12/2013 最后编辑:NaN 更新时间:10/12/2013 访问量:9454
Java 中的自定义类加载器 [已关闭]
Custom Class Loader In Java [closed]
问:
是否可以在 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/...
上一个:定义和声明是否匹配?
评论