2013-08-24 23 views
6

Bir jar dosyasını doğrudan belleğe atmadan belleğe yüklemeye çalışıyorum. ClassLoader kullanmayı denedim, ancak bir hata alıyorum. Yük baytını bir dosyaya belleğe yükleme

Bu

benim kodudur:

public class CLS_ClassLoader extends ClassLoader { 

    private byte[] bArrData; 

    public CLS_ClassLoader(ClassLoader parent, byte[] bArrData) { 
     super(parent); 

     this.bArrData = bArrData; 
    } 

    public Class<?> loadClass(String name) throws ClassNotFoundException { 
     return defineClass(name, bArrData, 0, 
       bArrData.length); 
    } 
} 

Ana

Özel ClassLoader

ClassLoader tParentClsLoader = CLS_ClassLoader.class.getClassLoader(); 
CLS_ClassLoader tClsLoader = new CLS_ClassLoader(tParentClsLoader, fileToByteArray("D:/App.jar")); 
Class<?> tClass = null; 

try { 
     tClass = tClsLoader.loadClass("pkg_main.CLS_Main"); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

Çıktı

Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1347093252 in class file pkg_main/CLS_Main 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at pkg_main.CLS_ClassLoader.loadClass(CLS_ClassLoader.java:20) 
    at pkg_main.CSL_Main.main(CSL_Main.java:27) 

Benim fikrim şifrelenmiş bir jar dosyası almak, çalışma zamanında şifresini çözmek ve doğrudan belleğe yüklemek.

Yazım hataları için üzgünüm, ingilizce iyi konuşmadım. Şimdiden teşekkürler!

+1

* "Ben HDD'ye bırakarak doğrudan belleğe bir kavanoz dosyası yüklemek çalışıyorum "* Bu baytlar ** dan nereden geliyor? Bir URL? Bellekte derlenmiş mi? Pixies? * "Fikrim şifrelenmiş bir jar dosyası almak, çalışma zamanında şifresini çözmek ve doğrudan belleğe yüklemek." * Bu kötü bir fikir. İnsanların kodları çalmasını/tersine mühendislik yapmasını engellemek isteniyorsa, bu sadece en amatör hackerları durduracaktır. Endişelenmeniz gereken orta derecede yeteneği olan bilgisayar korsanlarıdır. –

+0

Yapıştırdığım kaynak kodu okudun mu? "fileToByteArray (" D: /App.jar ")" mesajını göreceksiniz. Dedim ki, bayt dizisini doğrudan belleğe yüklemek istiyorum. Ve kodumun şifrelemeden korunmasının iyi bir fikir olacağını düşünüyorum. Java derlemesini bilmek hacker almaz. Teşekkürler. –

+1

@SamuelPedrosa Belki de bu cevap yardımcı olacaktır: http://stackoverflow.com/a/6797331/1531054. '.class' dosyasını .jar'dan çıkarmayı deneyin ve daha sonra bayt dizisini sınıf yükleyicisine besleyin. –

cevap

3

Ana hatayız, defineClass (...) sınıf baytlarını beklemeniz ve tüm jar dosyasıyla beslemenizdir. Sınıf baytları, 0xCAFEBABE, tipik Java sınıfı dosya üstbilgisi ile başlamıyorsa, gerçek istisna atılır. Yani, sınıfları jar dosyası dışında sıralamak için ek bir adım gerekir. bunu böyle deneyebilirsiniz örneğini izleyerek

class CCLoader extends ClassLoader { 
    private Map<String, byte[]> classes = new HashMap<String, byte[]>(); 

    public CCLoader(InputStream in) { 
     super(CCLoader.class.getClassLoader()); 
     try { 
      JarInputStream jis = new JarInputStream(in); 
      JarEntry je = null; 
      String entryName = null; 
      while ((je = jis.getNextJarEntry()) != null) { 
       entryName = je.getName(); 
       if (je.getName().endsWith(".class")) { 
        byte[] classBytes = readClass(jis); 
        String canonicalName = entryName.replaceAll("/", ".").replaceAll(".class", ""); 
        classes.put(canonicalName, classBytes); 
       } 
      } 
      jis.close(); 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private byte[] readClass(InputStream stream) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     while(true){ 
      int qwe = stream.read(); 
      if(qwe == -1) break; 
      baos.write(qwe); 
     } 
     return baos.toByteArray(); 
    } 

    public Class loadClass(String name) throws ClassNotFoundException { 
     try { 
      return this.getParent().loadClass(name); 
     } catch (ClassNotFoundException e) { 
      return findClass(name); 
     } 
    } 

    public Class findClass(String name) throws ClassNotFoundException { 
     byte[] classBytes = classes.get(name); 
     return defineClass(name, classBytes, 0, classBytes.length); 
    } 

} 

: Aşağıdaki uygulama fikri gösterir

ClassLoader tClsLoader = new CCLoader(new FileInputStream("C:/commons-io-2.0.1.jar")); 
Class<?> tClass = tClsLoader.loadClass("org.apache.commons.io.FileExistsException"); 
+0

Bunu deneyeceğim, teşekkürler :) –

+0

Bu hatayı alıyorum: java.lang.NegativeArraySizeException \t pkg_main.CCLoader adresinde. (CCLoader.java:26) \t pkg_main.CSL_Main.main (CSL_Main.java:23) –

+0

Bakın, sınıf dosya boyutunu alamıyor. –