java源代码加壳问题(100分) 有做过java加壳的么,给点指点意见。看了jboss中的javassist。都说能够解决,但是我做出来不是我想要的效果,有谁做过这样的么?就是.class文件不能正常反编译。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 通常都是采用混淆器的方法。class文件如果不能正常反编译,那就说明class文件不是符合java规范的有效的文件。那运行的时候,就得提供自己的jre。 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 好像jdk提供的java类都能进行java反编译 他反编译就是遵循的java语义规则 如果你要不能进行反编译 那么就必须不遵守它的语义规则那么就必须要你自己写的JDK 在问下 我用了jocky混淆器 混淆一个web工程做测试 但是每次都是报jvm内存溢出。当我只混淆部分代码时他又报class file has wrong version 50.0, should be 49.0 该如何处理呢? 窗口程序代码问题 java 奇怪问题 关于RTF编码的问题!!! java中的 从数字1加到100的程序,高手指教··· 请教高手:我的这个验证密码的算法为什么只认4位及4位以下的密码?????? 生成的*.class文件用java命令运行却出错,为什么啊。 有人读过刘润东的《UML对象设计与编程》吗? 如果我已经把图像做成二进制了,怎么在程序中将这些二进制流转化为图像 求救:关于表格中单元格合并拆分的问题! 请教如何得到一个字符的ASCII并用十六进制表示出来。。。 小问题 socket的问题
//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
他反编译就是遵循的java语义规则
如果你要不能进行反编译 那么就必须不遵守它的语义规则
那么就必须要你自己写的JDK