目前Q开发h员用的比较多的保护代码的方法是用淆器。淆器是采用一些方法将c,变量Q方法,包的名字改ؓ无意义的字符Ԍ使用非法的字W代替符P贴加一些代码反编译Y件崩溃;贴加一些无关的指o或永q执行不到的指o{反编译无法成功或所得的代码可读性很差。这样就实现了反反编译的目的。我们来做个演示。原始代码如下:
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]+",");
} } }
使用h器后Q再用jad反编译得代码如下Q?
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);
} }
h后,再反~译所仍然能得到源代码Q但昄Q所得代码与原始代码比,变得难以LQ代码中多了其他的方法,文g名等信息也被打ؕ了。ƈ且,把以上代码写qsKey_kb.java中,无法通过~译?
但是Q如果在~写软gӞ在Y件中写入某些注册信息Q或一些简单的法Q通过反编译,q是有可能得到这些信息的Q从而未能达C护Y件的目的。反~译器与h器之间的斗争是永无止的。所以从其他角度M护java的源代码是很有必要?
二?|络加蝲重要c?/P>
在java中提供了一个ClassLoaderc,q个cd以让我们使用cd载器所需要的java字节码文件加载到jvm中。我们通过重写q个c,可以实现从网l通过url加蝲java字节码文件。这P我们可以把一些重要的Q隐U的class攑֜|络服务器上Q通过口oL验是否有权限下蝲该类。从而实现java代码保护的目的。其ơ在java中正好提供了URLClassLoaderq个c,通过此类Q正好可以实现我们的目的。URLClassLoadercȝ基本使用Ҏ是通过一个URLcd的数l告诉URLClassLoadercȝ对象是从什么地方加载类Q然后用loadclass()Ҏ,从给定的URL中加载字节码文gQ获得它的方法,然后再执行?
具体步骤如下Q?
1.创徏URL
URL url[]={
new URL("file:///c:/classloader/web"),