有做过java加壳的么,给点指点意见。看了jboss中的javassist。都说能够解决,但是我做出来不是我想要的效果,有谁做过这样的么?就是.class文件不能正常反编译。

解决方案 »

  1.   

    通常都是采用混淆器的方法。class文件如果不能正常反编译,那就说明class文件不是符合java规范的有效的文件。那运行的时候,就得提供自己的jre。
      

  2.   

    URLClassLoader。用URLClassLoader可以在java程序的运行期间,再将文件夹或者jar加入到classpath中,这个特性事实上就是动态加载。既然可以动态加载class的文件夹或者jar,为何不可以加载加密后的classes呢,将classes用自己的方式加密,在URLClassLoader调用时,使用自己的方式解密。不就是达到了加壳的目的了吗?不过解密的代码放在何处是个问题,就是说解壳器的代码暴露在外,还是很危险的。
    //URLClassLoaderUtil jar文件载入工具类
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
     
    publicclass URLClassLoaderUtil {
        URLClassLoader classLoader = null;// URLClassLoader类载入器
        private String jarFileName;
        privatebooleanisFile = true;
        List<String> jars = new ArrayList<String>(0);
     
        public URLClassLoaderUtil(String jarFileName) {
           this.setJarFileName(jarFileName);
           this.inti();
        }
     
        public URLClassLoaderUtil(String jarFileName, boolean isFile) {
           this.setJarFileName(jarFileName);
           this.setFile(isFile);
           this.inti();
        }
     
        /**
         *初始化,读取文件信息,并将jar文件路径加入到classpath
         */
        privatevoid inti() {
           // 添加jar文件路径到classpath
           if (this.isFile) {
               File f = new File(jarFileName);
               addPath(f.toURI().toString());
               jars.add(f.getAbsolutePath());
           } else {
               ReadJarFile df = new ReadJarFile(jarFileName, new String[] { "jar",
                      "zip" });
               this.jars = df.getFiles();
               List<String> jarURLs = df.getFilesURL();
               Object[] o = jarURLs.toArray();
               addPath(o);
           }
        }
     
        /**
         *回叫方法,class操作
         *
         *@paramcallBack
         */
        publicvoid callBack(ClassCallBack callBack) {
           for (String s : this.jars) {
               loadClass(s, callBack);
           }
        }
     
        /**
         *添加单个jar路径到classpath
         *
         *@paramjarURL
         */
        privatevoid addPath(String jarURL) {
           try {
               classLoader = new URLClassLoader(new URL[] { new URL(jarURL) });
           } catch (MalformedURLException e) {
               e.printStackTrace();
           }
        }
     
        /**
         *添加jar路径到classpath
         *
         *@paramjarURLs
         */
        privatevoid addPath(Object[] jarURLs) {
           URL[] urls = new URL[jarURLs.length];
           for (int i = 0; i < jarURLs.length; i++) {
               try {
                  urls[i] = new URL(jarURLs[i].toString());
               } catch (MalformedURLException e) {
                  e.printStackTrace();
               }
           }
           classLoader = new URLClassLoader(urls);
        }
     
        /**
         *动态载入class
         *
         *@paramjarFileName
         *@paramcallBack
         */
        privatevoid loadClass(String jarFileName, ClassCallBack callBack) {
           JarFile jarFile = null;
           try {
               jarFile = new JarFile(jarFileName);
           } catch (IOException e) {
               e.printStackTrace();
           }
           Enumeration<JarEntry> en = jarFile.entries();
           while (en.hasMoreElements()) {
               JarEntry je = en.nextElement();
               String name = je.getName();
               String s5 = name.replace('/', '.');
               if (s5.lastIndexOf(".class") > 0) {
                  String className = je.getName().substring(0,
                         je.getName().length() - ".class".length()).replace('/',
                         '.');
                  Class c = null;
                  try {
                      c = this.classLoader.loadClass(className);
                      System.out.println(className);
                  } catch (ClassNotFoundException e) {
                      System.out.println("NO CLASS: " + className);
                      // continue;
                  } catch (NoClassDefFoundError e) {
                      System.out.println("NO CLASS: " + className);
                      // continue;
                  }
                  callBack.operate(c);
               }
           }
        }
     
        public String getJarFileName() {
           returnjarFileName;
        }
     
        publicvoid setJarFileName(String jarFileName) {
           this.jarFileName = jarFileName;
        }
     
        publicboolean isFile() {
           returnisFile;
        }
     
        public URLClassLoader getClassLoader() {
           returnclassLoader;
        }
     
        publicvoid setClassLoader(URLClassLoader classLoader) {
           this.classLoader = classLoader;
        }
     
        publicvoid setFile(boolean isFile) {
           this.isFile = isFile;
        }
    }
     
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/myloon/archive/2007/11/17/1889297.aspx
      

  3.   

    好像jdk提供的java类都能进行java反编译 
    他反编译就是遵循的java语义规则 
    如果你要不能进行反编译 那么就必须不遵守它的语义规则
    那么就必须要你自己写的JDK
      

  4.   

    在问下 我用了jocky混淆器 混淆一个web工程做测试 但是每次都是报jvm内存溢出。当我只混淆部分代码时他又报class file has wrong version 50.0, should be 49.0 该如何处理呢?