2013-10-11 3 views
-4

Возможно ли создать собственный пользовательский загрузчик классов в java. Если да, то пожалуйста, направляйте меня. Вместо класс запутывания я хочу изменить в файле класс, так что не может быть отменен любым инструментомПользовательский загрузчик классов в Java

+2

Просьба провести исследование, прежде чем просить разрешения. –

+0

Если байт-код не может быть понят «каким-либо инструментом», JVM не сможет его прочитать, поэтому он не будет работать. – dkatzel

+3

. Все, что вам нужно сделать, - это прочитать байт-код, который ваш пользовательский загрузчик классов дает JVM , – SLaks

ответ

2

Вы можете использовать некоторые запутывании инструменты, как ProGuard.

Самонаписанный ClassLoader должен быть помещен в стандартный файл .class, который JVM может загрузить. И тогда вы можете защитить погрузчик от обратной инженерии.

Не делайте этого самостоятельно. Написание «безопасного» кода, не зная криптографических алгоритмов, приведет к ошибочному коду небезопасного кода.

+3

Это не проблема, потому что криптография никак не может помочь. (Невозможно сохранить секретный ключ) – SLaks

+1

Я просто хотел объяснить, что большинство разработчиков, которые считают, что они делают что-то более безопасное, добавляя обфускацию или «безопасность от неизвестности», делают программу более подверженной ошибкам и менее безопасной. –

+0

Вы, конечно, правы, но в этой ситуации неизвестность - единственный выбор. Если он достаточно мал, злоумышленники могут даже слишком лениться, чтобы выполнить работу, необходимую для обратной инженерии ручной системы. – SLaks

6
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)); 
    } 

} 
Смежные вопросы