正在阅读:Java反编译的研究Java反编译的研究

2005-07-14 09:59 出处: 作者:佚名 责任编辑:moningfeng

  混淆后,再反编译所仍然能得到源代码,但显然,所得代码与原始代码比,变得难以读懂,代码中多了其他的方法,文件名等信息也被打乱了。并且,把以上代码写进sKey_kb.java中,无法通过编译。

  但是,如果在编写软件时,在软件中写入某些注册信息,或一些简单的算法,通过反编译,还是有可能得到这些信息的,从而未能达到保护软件的目的。反编译器与混淆器之间的斗争是永无止尽的。所以从其他角度去保护java的源代码是很有必要。 


二、 网络加载重要类

  在java中提供了一个ClassLoader类,这个类可以让我们使用类加载器将所需要的java字节码文件加载到jvm中。我们通过重写这个类,可以实现从网络通过url加载java字节码文件。这样,我们就可以把一些重要的,隐秘的class放在网络服务器上,通过口令去检验是否有权限下载该类。从而实现java代码保护的目的。其次在java中正好提供了URLClassLoader这个类,通过此类,正好可以实现我们的目的。URLClassLoader类的基本使用方法是通过一个URL类型的数组告诉URLClassLoader类的对象是从什么地方加载类,然后使用loadclass()方法,从给定的URL中加载字节码文件,获得它的方法,然后再执行。

  具体步骤如下:

  1.创建URL

URL url[]={

new URL("file:///c:/classloader/web"),

new URL("http://www.asp.zjc.zjut.edu.cn/javaclass/")

};



  2.创建URLClassLoader对象

URLClassLoader cl=new URLClassLoader(url);



  3.使用URLClassLoader对象加载字节码文件

Class class=cl.loadClass("class1");



  4.执行静态方法

Class getarg[]={

(new String [1]).getClass() };

Method m=class.getMethod("main",getarg);

String[] myl={"arg1 passed","arg2 passed");

Object myarg[]={myl};

m.invole(null,myarg);




三、 加密重要类

  使用网络加载重要类的方法固然有一定的用处,但是,在遇到无网络的情况时,还是无法解决我们的问题。对于这种情况,我们只能把所有文件放在本地计算机上。那么,对此我们该怎么做才能保护好java代码呢?

  其实,要实现这一点,并不难,只需要对一些重要的类实行加密就可以了。当然,在装载时,加密的类是需要解密才能被ClassLoader识别的。所以,我们必须自己创建ClassLoader类。在标准java api中ClassLoader有几个重要的方法。创建定制ClassLoader时,我们只需覆盖其中的一个,即loadClass,添加获取原始类文件数据的代码。这个方法有两个参数:类的名字,以及一个表示JVM是否要求解析类名字的标记(即是否同时装入有依赖关系的类)。如果这个标记为true,我们只需在返回JVM之前调用resolveClass。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品