我看见一款软件叫我心飞扬尾山农场java class类加密 那么请问如何调用软件里的classloader

JAVA文件中调用 已编译的.CLASS的类_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
JAVA文件中调用 已编译的.CLASS的类
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢我心飞扬java class加密保护(完全免费) - 下载频道
- CSDN.NET
&&&&我心飞扬java class加密保护(完全免费)
我心飞扬java class加密保护(完全免费)
简要介绍:
本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。
继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全性大大提升!
众所周知,java编译后的class文件是一种中间字节字文件,
很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式,
但这样会带来很多麻烦,而且也不能真正保护class文件,
本工具是对class文件进行加密,采用jni的方式解密运行,
加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。
运行方式:
运行时,要能正确的加载加密后的class文件,
必须使用我们提供的动态链接库classloader.dll(windows操作系统)或者libclassloader.so(Linux、Unix操作系统)。
执行java时带上参数-agentlib:&动态文件所在路径&\classloader
注意此处不要后缀名.dll(或者.so)。
我把classloader.dll放在C:\目录下;
运行加密后的class文件命令如下:
windows下执行java:
java -agentlib:C:\classloader Sample
Linux、Unix等系列操作系统下执行java:
java -agentlib:/home/classloader Sample
或者把libclassloader.so拷贝到如“/home/yzj/jdk1.6.0_23/jre/lib/i386/”这jdk的运行目录下,
然后执行java如:java -agentlib:classloader Sample
当然如果class文件没加密,这样运行也不会出错!
应用场合:
独立的应用程序,运行java时,带上参数-agentlib:&动态库文件所在路径&\classloader
Tomcat、Jboss等Java application server修改启动脚本,
把执行java的命令行后面加上参数-agentlib:&动态链接库文件所在路径&\classloader
适应环境:
操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时,
使用的动态链接库文件不一样而已,其它配置完全一样。
jdk必须1.5以上。
/javaenc/jenc2.0.rar
/admin/upload/2317195.rar
软件截图地址:
/javaenc/v2.gif
/javaenc/logo.jpg
备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢..
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
安全技术下载排行我心飞扬类加密工具java class加密工具 2.1 绿色版
下载帮助本站软件均来自互联网, 如有侵犯您的版权, 请与我们联系。
* 为了达到最快的下载速度,推荐使用下载本站软件。
* 请一定升级到最新版才能正常解压本站提供的软件!
* 相关网站事务请留言:
或通知我们!
Copyright &
. All Rights Reserved当前访客身份:游客 [
当前位置:
发布于 日 17时,
一般的java的动态编译是需要先生成java文件,然后编译成class,最后用classloader加载进来生成最终的实例的。
本例程则不需要生成任何文件,一切在内存中进行。
代码片段(6)
1.&[代码][Java]代码&&&&
package org.jui.core.
public class DynaCompTest {
public static void main(String[] args) throws Exception {
String fullName = "DynaClass";
StringBuilder src = new StringBuilder();
src.append("public class DynaClass {\n");
src.append("
public String toString() {\n");
src.append("
return \"Hello, I am \" + ");
src.append("this.getClass().getSimpleName();\n");
src.append("
src.append("}\n");
System.out.println(src);
DynamicEngine de = DynamicEngine.getInstance();
Object instance =
de.javaCodeToObject(fullName,src.toString());
System.out.println(instance);
2.&[代码][Java]代码&&&&
package org.jui.core.
import javax.tools.*;
import java.util.ArrayL
import java.util.L
import java.util.A
import java.net.URL;
import java.net.URLClassL
import java.io.F
public class DynamicEngine {
private static DynamicEngine ourInstance = new DynamicEngine();
public static DynamicEngine getInstance() {
return ourI
private URLClassLoader parentClassL
private DynamicEngine() {
this.parentClassLoader = (URLClassLoader) this.getClass().getClassLoader();
this.buildClassPath();
private void buildClassPath() {
this.classpath =
StringBuilder sb = new StringBuilder();
for (URL url : this.parentClassLoader.getURLs()) {
String p = url.getFile();
sb.append(p).append(File.pathSeparator);
this.classpath = sb.toString();
public Object javaCodeToObject(String fullClassName, String javaCode) throws IllegalAccessException, InstantiationException {
long start = System.currentTimeMillis();
Object instance =
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector&JavaFileObject& diagnostics = new DiagnosticCollector&JavaFileObject&();
ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));
List&JavaFileObject& jfiles = new ArrayList&JavaFileObject&();
jfiles.add(new CharSequenceJavaFileObject(fullClassName, javaCode));
List&String& options = new ArrayList&String&();
options.add("-encoding");
options.add("UTF-8");
options.add("-classpath");
options.add(this.classpath);
pilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, jfiles);
boolean success = task.call();
if (success) {
JavaClassObject jco = fileManager.getJavaClassObject();
DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(this.parentClassLoader);
Class clazz = dynamicClassLoader.loadClass(fullClassName,jco);
instance = clazz.newInstance();
String error = "";
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
error = error + compilePrint(diagnostic);
long end = System.currentTimeMillis();
System.out.println("javaCodeToObject use:"+(end-start)+"ms");
private String compilePrint(Diagnostic diagnostic) {
System.out.println("Code:" + diagnostic.getCode());
System.out.println("Kind:" + diagnostic.getKind());
System.out.println("Position:" + diagnostic.getPosition());
System.out.println("Start Position:" + diagnostic.getStartPosition());
System.out.println("End Position:" + diagnostic.getEndPosition());
System.out.println("Source:" + diagnostic.getSource());
System.out.println("Message:" + diagnostic.getMessage(null));
System.out.println("LineNumber:" + diagnostic.getLineNumber());
System.out.println("ColumnNumber:" + diagnostic.getColumnNumber());
StringBuffer res = new StringBuffer();
res.append("Code:[" + diagnostic.getCode() + "]\n");
res.append("Kind:[" + diagnostic.getKind() + "]\n");
res.append("Position:[" + diagnostic.getPosition() + "]\n");
res.append("Start Position:[" + diagnostic.getStartPosition() + "]\n");
res.append("End Position:[" + diagnostic.getEndPosition() + "]\n");
res.append("Source:[" + diagnostic.getSource() + "]\n");
res.append("Message:[" + diagnostic.getMessage(null) + "]\n");
res.append("LineNumber:[" + diagnostic.getLineNumber() + "]\n");
res.append("ColumnNumber:[" + diagnostic.getColumnNumber() + "]\n");
return res.toString();
3.&[代码][Java]代码&&&&
package org.jui.core.
import javax.tools.JavaFileO
import javax.tools.SimpleJavaFileO
import java.net.URI;
public class CharSequenceJavaFileObject extends SimpleJavaFileObject {
private CharS
public CharSequenceJavaFileObject(String className,
CharSequence content) {
super(URI.create("string:///" + className.replace('.', '/')
+ JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE);
this.content =
public CharSequence getCharContent(
boolean ignoreEncodingErrors) {
4.&[代码][Java]代码&&&&
package org.jui.core.
import javax.tools.*;
import java.io.IOE
import java.security.SecureClassL
public class ClassFileManager extends
ForwardingJavaFileManager {
public JavaClassObject getJavaClassObject() {
return jclassO
private JavaClassObject jclassO
public ClassFileManager(StandardJavaFileManager
standardManager) {
super(standardManager);
public JavaFileObject getJavaFileForOutput(Location location,
String className, JavaFileObject.Kind kind, FileObject sibling)
throws IOException {
jclassObject = new JavaClassObject(className, kind);
return jclassO
5.&[代码][Java]代码&&&&
package org.jui.core.
import javax.tools.JavaFileO
import javax.tools.SimpleJavaFileO
import java.io.IOE
import java.io.OutputS
import java.io.ByteArrayOutputS
import java.net.URI;
public class JavaClassObject extends SimpleJavaFileObject {
protected final ByteArrayOutputStream bos =
new ByteArrayOutputStream();
public JavaClassObject(String name, JavaFileObject.Kind kind) {
super(URI.create("string:///" + name.replace('.', '/')
+ kind.extension), kind);
public byte[] getBytes() {
return bos.toByteArray();
public OutputStream openOutputStream() throws IOException {
6.&[代码][Java]代码&&&&
package org.jui.core.
import java.net.URLClassL
import java.net.URL;
public class DynamicClassLoader extends URLClassLoader {
public DynamicClassLoader(ClassLoader parent) {
super(new URL[0], parent);
public Class findClassByClassName(String className) throws ClassNotFoundException {
return this.findClass(className);
public Class loadClass(String fullName, JavaClassObject jco) {
byte[] classData = jco.getBytes();
return this.defineClass(fullName, classData, 0, classData.length);
开源中国-程序员在线工具:
简单化的asm框架?
2楼:fhp0917 发表于
不是 这个和asm有本质的不同
3楼:xiaohangHu 发表于
Nice! 思路清晰,代码整洁,搬走了!
4楼:yanchao90 发表于
5楼:飞天小色猫 发表于
6楼:微风又见微风 发表于
有个疑问请教下 &DynamicEngine中获取对象实例Class.forName 为什么不行?
7楼:风雪90 发表于
如果那个类里面的方法,我名字自己定义,然后应该怎么调用。请求指点
8楼:耿军 发表于
执行到ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));出现空指针错误。
9楼:耿军 发表于
要把jdk\lib\tools.jar拷到jre\lib下,否则ToolProvider.getSystemJavaCompiler()返回null。
10楼:鸿尚法师 发表于
亲测,代码有内存泄漏!未找到原因!代码运行10天,内存升到2G多,内存中只看到com.sun.tools.javac.util.List 占用79%其他无任何有价值信息
开源从代码分享开始
fhp0917的其他代码5874人阅读
class由于可以进行反编译,这样对某个核心的模块来说,会造成关键技术的泄漏。如何对class类进行加密,是某些公司会考虑的问题。
以下公布一个实际的类。实现了一个ClassLoader,可以直接操作加密后的class文件。
其中的加密方式是采用DES加密。当然类需要先进行加密。ClassLoader做的是一个加载类前的解密工作。
public class Start extends ClassLoader{& // 这些对象在构造函数中设置,& // 以后loadClass()方法将利用它们解密类& private SecretK& private C& & private static Start instance =& & protected Start() {& &super() ;& }
& // 构造函数:设置解密所需要的对象& private Start( SecretKey key ) throws GeneralSecurityException,&&&&& IOException {&&& this.key =
&&& String algorithm = "DES";&&& SecureRandom sr = new SecureRandom();//&&& System.err.println( "[Start: creating cipher]" );&&& cipher = Cipher.getInstance( algorithm );&&& cipher.init( Cipher.DECRYPT_MODE, key, sr );& }
& // main过程:我们要在这里读入密匙,创建Start的& // 实例,它就是我们的定制ClassLoader。& // 设置好ClassLoader以后,我们用它装入应用实例,& // 最后,我们通过Java Reflection API调用应用实例的main方法& static public void main( String args[] ) throws Exception {&&& String keyFilename = args[0];&&& String appName = args[1];
&&&& // 这些是传递给应用本身的参数&&& String realArgs[] = new String[args.length-2];&&& System.arraycopy( args, 2, realArgs, 0, args.length-2 );
&&& // 读取密匙//&&& System.err.println( "[Start: reading key]" );&&& byte rawKey[] = getCodeByte(keyFilename);&&& DESKeySpec dks = new DESKeySpec( rawKey );&&& SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );&&& SecretKey key = keyFactory.generateSecret( dks );
&&& // 创建解密的ClassLoader&&& instance = new Start( key );
&&& // 创建应用主类的一个实例&&& // 通过ClassLoader装入它//&&& System.err.println( "[Start: loading "+appName+"]" );&&& Class clasz = instance.loadClass( appName );
&&& // 最后,通过Reflection API调用应用实例&&& // 的main()方法
&&& // 获取一个对main()的引用&&& String proto[] = new String[1];&&& Class mainArgs[] = { (new String[1]).getClass() };&&& Method main = clasz.getMethod( "main", mainArgs );
&&& // 创建一个包含main()方法参数的数组&&& Object argsArray[] = { realArgs };//&&& System.err.println( "[Start: running "+appName+".main()]" );
&&& // 调用main()&&& main.invoke( null, argsArray );& }
& public static Start getInstance() {& & & }& public Class loadClass( String name, boolean resolve )&&&&& throws ClassNotFoundException {&&& try {&&&&& // 我们要创建的Class对象&&&&& Class clasz =
&&&&& // 必需的步骤1:如果类已经在系统缓冲之中&&&&& // 我们不必再次装入它&&&&& clasz = findLoadedClass( name );
&&&&& if (clasz != null)&&&&&&&
&&&&&& // 下面是定制部分&&&&&& try {&&&byte classData[];//&&&try {//&&&&// 读取经过加密的类文件//&&&&classData = readClassFile(name);//&&&} catch (Exception e) {//&&&&try {//&&&&&classData = readZipFile(name) ;//&&&&} catch (Exception e) {//&&&&&classData = readClassFile(name);//&&&&}//&&&}&&&classData = readFromURL(name) ;&&&&&&&&& if (classData != null) {&&&&&&&&&& // 解密...&&&&&&&&&& byte decryptedClassData[] = cipher.doFinal( classData );&&&&&&&&&&& // ... 再把它转换成一个类&&&&&&&&&& clasz = defineClass( name, decryptedClassData,&&&&&&&&&&&& 0, decryptedClassData.length );//&&&&&&&&&& System.err.println( "[Start: decrypting class "+name+"]" );&&&&&&&& }&&&& } catch( Exception fnfe ) {//&&&& &System.out.println("decrypting error: "+name) ;//&&&& &fnfe.printStackTrace();&&&& }
//&& if ( clasz == null )//&& &clasz = ClassLoader.getSystemClassLoader().loadClass(name);&&&&& // 必需的步骤2:如果上面没有成功&&&&& // 我们尝试用默认的ClassLoader装入它&&&&& if (clasz == null)&&&&&&& clasz = super.loadClass( name,resolve );
&&&&& // 必需的步骤3:如有必要,则装入相关的类&&&&& if (resolve && clasz != null)&&&&&&& resolveClass( clasz );
&&&&& // 把类返回给调用者&&&&&&&& } catch( Exception ie ) {&&&&& throw new ClassNotFoundException( ie.toString());&&& } & }&& static private byte[] readFromURL(String className) throws IOException {&String fileName = className.replace('.','/')+".class" ;&&& URL classURL = ClassLoader.getSystemClassLoader().getResource(fileName);&if (classURL == null) {&&throw new RuntimeException("Cannot find resource /"" +className + "/"");&}&InputStream in = classURL.openStream() ;&int size=JspUtil.getUrlLength(classURL) ;&byte[] b=new byte[(int)size];&int rb=0;&int chunk=0;&while (((int)size - rb) & 0) {&& chunk=in.read(b,rb,(int)size - rb);&&& if (chunk==-1) {&&&&& }&& rb+=&}&if (rb != size)&& throw new IOException( "Only read "+rb+" of "+size+" for "+className );&in.close();&&& }
& private static byte[] getCodeByte(String codeStr){& &byte[] bytes = new byte[codeStr.length()/2] ;& &for ( int i = 0,j=0 ; i & codeStr.length() ; ) {& &&bytes[j++] = new Integer(getByte(codeStr.charAt(i++)) * 16& | getByte(codeStr.charAt(i++))).byteValue() ;& &}& && }& & private static byte getByte(char c) {&switch(c)&{&&case '0': &&&return 0;&&&case '1': &&&return 1;&&&case '2': &&&return 2;&&&case '3': &&&return 3;&&&case '4':&&&return 4;&&&case '5': &&&return 5;&&case '6': &&&return 6;&&&case '7': &&&return 7;&&&case '8': &&&return 8;&&&case '9': &&&return 9;&&&case 'A':&&&return 10;&&&case 'B': &&&return 11;&&&&&case 'C': &&&return 12;&&&&&case 'D': &&&return 13;&&&&&case 'E': &&&return 14;&&&&&case 'F': &&&return 15;&}&return 0 ;& }}
以下是加密类的实现:
public class EncryptClasses{& static public void main( String args[] ) throws Exception {&&& String keyFilename = args[0];&&& String algorithm = "DES";
&&& // 生成密匙&&& SecureRandom sr = new SecureRandom();&&& byte rawKey[] = Util.readFile( keyFilename );&&& DESKeySpec dks = new DESKeySpec( rawKey );&&& SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( algorithm );&&& SecretKey key = keyFactory.generateSecret( dks );
&&& // 创建用于实际加密操作的Cipher对象&&& Cipher ecipher = Cipher.getInstance( algorithm );&&& ecipher.init( Cipher.ENCRYPT_MODE, key, sr );
&&& // 加密命令行中指定的每一个类&&& for (int i=1; i&args. ++i) {&&&&& String filename = args[i];&& && File pathFile = new File(filename) ;&& && if ( pathFile.isDirectory() ) {&&encryptPathFile(ecipher,pathFile) ;&& } else if ( pathFile.isFile() ) {&&encryptClassFile(ecipher,pathFile);&& } else&& System.out.println("error when parse "+pathFile.getPath()) ;&&&&& // 读入类文件&&& }& }& & private static void encryptClassFile(Cipher ecipher,File classFile) {&try {&&if ( classFile.getPath().lastIndexOf(".class") & 0 )&&// 读入类文件&&byte classData[] = Util.readFile( classFile.getPath() );&&&&// 加密&&byte encryptedClassData[] = ecipher.doFinal( classData );&&&&// 保存加密后的内容&&Util.writeFile( classFile.getPath(), encryptedClassData );&&&&System.out.println( "Encrypted "+classFile.getPath() );&} catch (Exception e) {&&&&e.printStackTrace();&} & }& & private static void encryptPathFile(Cipher ecipher,File pathFile) {& &File[] classFiles = pathFile.listFiles() ;& &for ( int i& = 0 ; i & classFiles. i++ ) {& &&File classFile = classFiles[i] ;& &&if ( classFile.isDirectory() ) encryptPathFile(ecipher,classFile);& &&else if ( classFile.isFile() ) encryptClassFile(ecipher,classFile);& &&else System.out.println("error when parse "+classFile.getPath()) ;& &}& }& }
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

我要回帖

更多关于 心飞扬 的文章

 

随机推荐