Java反编译的研究
2008-01-05 20:22:34 来源:WEB开发网java诞生于1995年,是一门较年轻的语言。它以平台无关性,安全性,面向对象,分布式,键壮性等特点赢得了众多程序员的青睐。非凡是它简洁的面向对象的语言风格,更让许多人对它爱不释手。 但人们在使用java的过程中,会发现它有几个致命的弱点:运行速度慢,用户使用不便,源代码保护机制不够安全。非凡是在保护源代码方面,java是基于解释一种叫java字节码的中间代码来运行其程序的,而且jvm比计算机的微处理器要简单的多,文档也很齐全,结果造成其目标程序很轻易被反编译,而且所得代码和其原始代码十分相似,甚至可以一模一样,可读性相当好。这就给java的代码保护带来了不利。但要实现java程序的保护,也不是不可能的,经研究和总结,至少有三种实现方式:1.混淆器;2.网络加载重要类;3加密重要类。
一、 混淆器
目前,开发人员使用的比较多的保护代码的方法是用混淆器。混淆器是采用一些方法将类,变量,方法,包的名字改为无意义的字符串;使用非法的字符代替符号;贴加一些代码使反编译软件崩溃;贴加一些无关的指令或永远执行不到的指令等使反编译无法成功或所得的代码可读性很差。这样就实现了反反编译的目的。我们来做个演示。原始代码如下:
import java.io.*;
import java.security.*;
public class sKey_kb{
public static void main(String args[]) throws Exception{
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject();
byte[] kb=k.getEncoded();
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
for(int i=0;i
System.out.PRint(kb[i]+",");
} } }
使用混淆器后,再用jad反编译得代码如下:
import java.io.*;
import java.security.Key;
public class sKey_kb{
public skey() {}
public static void main(String args[]) {
FileInputStream fileinputstream=new FileInputStream(ma);
ObjectInputStream objectinputstream=new ObjectInputStream(fileinputstream);
Key key=(Key)b.readObject();
byte abyte0[]=key.getEncoded();
FileOutputStream fileoutputstream=new FileOutputStream(na);
fileoutputstream.write(abyte0);
for(int i=0;i
System.out.print(abyte0[i]+oa);
}
private static String a(String s){
int i=s.length();
char ac[]=new char[i];
for(int j=0;j
return new String(ac);
}
private static String ma="u5AA1u5AAFu5AF3u5AFBu5AE4u5AAEu5AABu5ABE";
private static String na="u5AA1u5AAFu5AB3u5AA1u5AA8u5AFBu5AE4u5AAEu5AABu5ABE";
private static String oa="u5AE6";
public static{
ma=a(ma);
na=a(ma)
oa=a(oa);
} }
混淆后,再反编译所仍然能得到源代码,但显然,所得代码与原始代码比,变得难以读懂,代码中多了其他的方法,文件名等信息也被打乱了。并且,把以上代码写进sKey_kb.java中,无法通过编译。
但是,假如在编写软件时,在软件中写入某些注册信息,或一些简单的算法,通过反编译,还是有可能得到这些信息的,从而未能达到保护软件的目的。反编译器与混淆器之间的斗争是永无止尽的。所以从其他角度去保护java的源代码是很有必要。
更多精彩
赞助商链接