摘要 探讨了使用模糊技术和定制类装载器来保护Java源代码的方法,并给出了具体的实例加以说明。
关键词 反编译,模糊技术,类装载器,Java虚拟机
一、反编译
反编译是一个将目标代码转换成源代码的过程。目标代码是一种用机器语言表示的代码,这种语言能通过实机或虚拟机直接执行。当C编译器编译生成一个对象的目标代码时,该目标代码是为某一特定硬件平台运行而产生的,在编译过程中,编译程序通过查表将所有符号的引用转换为特定的内存偏移量。目标代码只能在特定的CPU 上运行。而Java编译器为了保证目标代码的可移植性,并不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由Java虚拟机在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。由于其相对简单的Java 虚拟机(与真实的微处理器相比)和规范的字节码格式,由Java字节码(Bytecode)反编译成源代码的过程相对于C语言来说要简单许多,因此,当前反编译Java程序颇为盛行。
在介绍Java反编译器之前,要提及JDK自带的一个工具javap,它是一个Java代码反汇编器。反汇编器和反编译器是不同的,使用javap反汇编的Java类文件可得到数据区定义、方法和类的引用等信息。例如,下面是对HelloWorld.class反汇编后的部分信息:
C:\JExamples>javap -c HelloWorld
Compiled from "helloworld.java"
public class HelloWorld extends java.lang.Object{
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
…
由此可见在Java字节码中蕴藏了大量的信息。Java反编译器就是利用类文件中的潜在信息和语言规范等猜测出源代码的。没有一个反编译器能够保证准确无误地翻译出源代码,而且每个反编译器自身也存在各种不同的漏洞。但是我们不可轻视反编译器的威力,它还是能比较准确地翻译出部分甚至全部的源代码。 下面是一个具体的例子(图1所示),利用Java反编译器Jode(Jode的下载位置:http://jode.sourceforge.net/download.html)成功的反编译了HelloWorld.class:
|