对class文件时行加密,tomcat加载class文件时再进行解密.可以达到隐藏代码的目的.下面用commons-codec中的base64对class进行encode,再在tomcat加载时对class进行decode.
1.对要encode的class进行编码:
public static void main(String[] args) throws IOException {
FileInputStream file = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
file = new FileInputStream(
"./target/classes/kevin/ClassLoader.class");
bis = new BufferedInputStream(file);
byte[] b = new byte[bis.available()];
bis.read(b);
byte[] encodeB = Base64.encodeBase64(b);
fos = new FileOutputStream("ClassLoader.class");
bos = new BufferedOutputStream(fos);
bos.write(encodeB);
bos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
file.close();
bis.close();
fos.close();
bos.close();
}
}
2.将生成的class放入部署好的工程相应位置.
3.到tomcat.apache.org下载tomcat的源代码.
4.将eclipse.classpath, eclipse.project修改成.classpath, .project后,直接用eclipse导入工程apache-tomcat-6.0.32-src,再导入缺少的包.
5.在工程apache-tomcat-6.0.32-src中找到org.apache.catalina.loader.WebappClassLoader文件,再找到protected Class findClassInternal(String name) throws ClassNotFoundException 方法,将内容:
clazz = defineClass(name, entry.binaryContent, 0,
entry.binaryContent.length, new CodeSource(
entry.codeBase, entry.certificates));
修改为:
if (name.indexOf("ClassLoader") >= 0) {
byte[] base64Array = entry.binaryContent;
byte[] orginByteArray = Base64.decodeBase64(base64Array);
clazz = defineClass(name, orginByteArray, 0,
orginByteArray.length, new CodeSource(
entry.codeBase, entry.certificates));
} else {
clazz = defineClass(name, entry.binaryContent, 0,
entry.binaryContent.length, new CodeSource(
entry.codeBase, entry.certificates));
}
6.编译完成后,将WebappClassLoader.class及其子类文件替换运行时的tomcat/lib下的catalina.jar包中相同文件.
7.当tomcat运行需加载ClassLoader.class时,将会先对其进行decode,达到加密的目的.
分享到:
相关推荐
Tomcat's WebappClassLoader is currently not instrumentable, so Spring provides a custom ClassLoader that can be used by placing spring-instrument-tomcat.jar in $TOMCAT_HOME/lib and putting a loader ...
这个要从热部署开始说起,因为tomcat提供了不必重启容器而只需重启web应用以达到热部署的功能,其实现是通过定义一个WebappClassLoader类加载器,当热部署时就将原来的类加载器废弃并重新实例化一个WebappCl
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at ...
8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59 第9章 session管理 62 9.1 概述 62 9.2 Sessions 62 9.2.1 Session接口 62 9.2.2 StandardSession类 63 9.2.3 ...
at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1680) 严重: Servlet /LogMess threw load() exception java.lang.ClassNotFoundException: org.springframework.web....
NULL 博文链接:https://pingfang.iteye.com/blog/1178075
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) at org.apache.catalina...
8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59 第9章 session管理 62 9.1 概述 62 9.2 Sessions 62 9.2.1 Session接口 62 9.2.2 StandardSession类 63 9.2.3 ...
<listener-class>org.logicalcobwebs.proxool.configuration.ListenerConfigurator</listener-class> 与spring配合使用时,本加载需要放在spring前面 <listener-class>org.logicalcobwebs.proxool....
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) at org.apache.catalina....
在 onMessage 中,上下文类加载器将是 org.codehaus.plexus.classworlds.realm.ClassRealm 而不是 org.eclipse.jetty.webapp.WebAppClassLoader。 因此,从 Web 应用程序的 Jar 中查找类路径上的资源将失败。