Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密

Java 代码编译后生成的 .class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候。所以一个按照正常方式编译的 Java .class 文件可以非常轻易地被反编译。通常情况下,反编译可以利用现有的工具jd-gui.exe或者jad.exe。

(这两个反编译工具在我的资源里有下载:

jd-gui.exe: http://download.csdn.net/detail/dianacody/7760019;

jad.exe: http://download.csdn.net/detail/dianacody/7760093)

       有些情况下,为了保护java源码不被别人看到,通常会使用加密手段对java源码进行加密,加密的方式可以利用加密工具(比如java代码混淆工具)、使用加密算法(如DES算法)修改classloader对编译好的.class文件进行加密。

(注:这里推荐一款java代码混淆器,可以混淆函数变量、类、方法名以实现代码加密:proGuard:http://download.csdn.net/detail/dianacody/7760089)

 

一、用java混淆器工具proGuard实现加密

这里使用proGuard对jar包进行加密。

1. 解压下载的proguard,解压后进入lib文件把proguard.jar拷贝到自己新建的文件夹里如图:


2. 把需要混淆的jar和jar所依赖的包也放到新建的文件夹,都放在一起,如下图。


3. 写一个配置文件,名称自己定,例如”a”文件,举个简单配置文件例子(那个proguard.map是过后自己生成的),内容如下,其中-injars:是你需要混淆的jar,-outjars:是你混淆后输出的jar,-libraryjars:是你混淆的jar需要所依赖的jar包,后面的不在一一说明,可以参考proguard文档,配置文件可以参考文档来对自己混淆的需求来写配置文件。

-injars       TheFirstDesktopApplication1.jar

-outjars      TheFirstDesktopApplication1_out.jar

-libraryjars  /lib/rt.jar

-libraryjars appframework-1.0.3.jar

-libraryjarsswing-worker-1.1.jar

-printmappingproguard.map

-overloadaggressively

-defaultpackage ''

-allowaccessmodification

-dontoptimize

 

-keep public class*

{

 public protected *;

}

 

-keep public classorg.**

 

-keep public classit.**

 

4.   把配置文件保存到你建的文件夹下,如下图。


5.点击开始,运行,输入cmd,进入你建的文件夹下,如下图。


6.   然后输入命令语句:java   -jarproguard.Jar  @a 然后回车,如下图。



7.   混淆成功,在产生TheFirstDesktopApplication1_out.jar如下图。


8.      混淆器后,利用反编译器jad对没TheFirstDesktopApplication1_out.jar反编译,多了好多a,b,c之类的类文件,对反编译的java文件是很难编译的,即说明混淆成功。

 

        用上面方法试了一下,发现其实混淆效果并不好,使用jd-gui反编译工具就可以轻易看到源码。总结一下,网上找了几个代码混淆工具效果都不好,其实现成工具看来也并不是那么好用。

        然后想想,就换了一种方式,直接使用加密算法对java代码进行解密。在下篇文章里再写。



ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.

ProGuard的作用: 

1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用. 
2.创建的程序和程序库很难使用反向工程. 
3.所以它能删除来自源文件中的没有调用的代码 
4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件. 

参数: 

[plain]  view plain  copy
  1. -include {filename}    从给定的文件中读取配置参数   
  2. -basedirectory {directoryname}    指定基础目录为以后相对的档案名称   
  3. -injars {class_path}    指定要处理的应用程序jar,war,ear和目录   
  4. -outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称   
  5. -libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件   
  6. -dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。   
  7. -dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。   




保留选项 

[plain]  view plain  copy
  1. -keep {Modifier} {class_specification}    保护指定的类文件和类的成员   
  2. -keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好   
  3. -keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。   
  4. -keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)   
  5. -keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)   
  6. -keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)   
  7. -printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件   



 
压缩 

[plain]  view plain  copy
  1. -dontshrink    不压缩输入的类文件   
  2. -printusage {filename}   
  3. -whyareyoukeeping {class_specification}       




优化 

[plain]  view plain  copy
  1. -dontoptimize    不优化输入的类文件   
  2. -assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用   
  3. -allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员   




混淆 

[plain]  view plain  copy
  1. -dontobfuscate    不混淆输入的类文件   
  2. -printmapping {filename}   
  3. -applymapping {filename}    重用映射增加混淆   
  4. -obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称   
  5. -overloadaggressively    混淆时应用侵入式重载   
  6. -useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆   
  7. -flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中   
  8. -repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中   
  9. -dontusemixedcaseclassnames    混淆时不会产生形形色色的类名   
  10. -keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.  
  11. -renamesourcefileattribute {string}    设置源文件中给定的字符串常量  





Ant Example:

[html]  view plain  copy
  1. < !-- This Ant build file illustrates how to process applications,  
  2.       by including ProGuard-style configuration options.  
  3.       Usage: ant -f applications2.xml -->  
  4.    
  5. <project name="Applications" default="obfuscate" basedir="../..">  
  6.    
  7. < target name="obfuscate">  
  8.    <taskdef resource="proguard/ant/task.properties"  
  9.             classpath="lib/proguard.jar" />  
  10.    
  11.   <proguard>  
  12.    
  13.       
  14.    
  15.     -injars  in.jar  
  16.      -outjars out.jar  
  17.    
  18.     -libraryjars ${java.home}/lib/rt.jar  
  19.        
  20.        
  21.        
  22.        
  23.    
  24.       
  25.    
  26.     -printmapping out.map  
  27.      -renamesourcefileattribute SourceFile  
  28.      -keepattributes SourceFile,LineNumberTable  
  29.    
  30.       
  31.    
  32.     -keepattributes *Annotation*  
  33.    
  34.       
  35.    
  36.     -keepclasseswithmembers public class * {  
  37.          public static void main(java.lang.String[]);  
  38.      }  
  39.    
  40.       
  41.    
  42.     -keepclasseswithmembernames class * {  
  43.          native <methods>;  
  44.      }  
  45.    
  46.       
  47.    
  48.     -keepclassmembers class * extends java.lang.Enum {  
  49.          public static **[] values();  
  50.          public static ** valueOf(java.lang.String);  
  51.      }  
  52.    
  53.     

你可能感兴趣的:(Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密)