利用Maven+ProGuard进行代码混淆,个人心得

何为代码混淆

代码混淆就是对反编译后的代码的类名,参数名进行混淆,使得代码不容易被看懂。

Maven+ProGuard

这里我采用了Maven+ProGuard的方法进行代码混淆,可以直接修改pom文件,也可以修改pom文件同时加上ProGuard的配置文件。
将以下代码在模块的pom文件中放到build标签里面(options注释掉是因为我添加了ProGuard的配置文件,options里面的内容都加到了ProGuard的配置文件中)



      
        com.github.wvengen
        proguard-maven-plugin
        2.0.14
        
          
            package
            
              proguard
            
          
        
        
          
        true
		pg
         
            
             
            
             
            
            
            
			
            
            
            
           -->
          
            ${java.home}/lib/rt.jar
            ${java.home}/lib/jce.jar
          
           
           ${project.build.finalName}-pg
        
      

在与pom同等目录下添加ProGuard配置文件proGuard.conf

#关闭压缩
-dontshrink 
#混淆时不生成大小写混合的类名
-dontusemixedcaseclassnames
#不忽略指定jars中的非public calsses
-dontskipnonpubliclibraryclasses 
#不忽略指定类库的public类成员
-dontskipnonpubliclibraryclassmembers 
-optimizations !field/propagation/value 
-keepdirectories 
#保留继承了注释的类
-keep class * extends java.lang.annotation.Annotation {*;} 
-keepattributes InnerClasses,Signature,LineNumberTable,*Annotation*,Exceptions 
              -keepclassmembers class * implements java.io.Serializable {
              static final long serialVersionUID;
              private static final java.io.ObjectStreamField[] serialPersistentFields;
              private void
              writeObject(java.io.ObjectOutputStream);
              private void readObject(java.io.ObjectInputStream);
              java.lang.Object writeReplace();
              java.lang.Object readResolve();
              }
             
-keep class xxx.xxx.**  
-keep class xxx.xxx.repository.**  {*;}
-keepclassmembers class xxx.xxx.service.impl.** {
    public ;
    private ;
}
#下面是保留枚举的
-keep class xxx.xxx.a {*;} 
-keep class xxx.xxx.a$* {*;} 

(注:被xml和jsp引用的类,采用了反射的类都应该保留下来)
完成以上步骤后,执行maven打包,就会自动将混淆后的xx-pg.jar包部署到maven的仓库中。

代码混淆—模块依赖

加入模块中存在依赖,又该如何办?这里给出一个方案。
假设a需要被混淆,b不需要被混淆,此时b依赖a
那么在b模块的pom文件应该加上classifrier标签,并加上pg:

    
      xx.xx
      a
      
      pg
      ${project.version}
    

这时打包b模块的时候项目就会去模块仓库寻找a的pg包,如果没有classifier这句,则寻找没有混淆的a的jar包。
(注:因为b依赖a,所以b引用到的a的类和方法都应该保留下来)

最后,想知道项目有没有被混淆?就需要用到反编译去查看。

反编译工具

反编译工具比较推荐jd-gui-windows-1.4.0,下载下来解压即可使用。
反编译方法,利用上述例子,从b的war包到\WEB-INF\lib目录,找出a的pg包(a-pg.jar),将其拉出来,然后用jd-gui对其进行反编译。
利用Maven+ProGuard进行代码混淆,个人心得_第1张图片
反编译后像图片那样就是成功了。

最后还有几个地方需要提醒:
假如混淆的是个war包,就要将pg.jar包解压后的文件覆盖掉war包中\WEB-INF\classes的文件。

此外还有一些配置,可以参考下面的网址:https://www.jianshu.com/p/b471db6a01af

以上就是代码混淆的全部内容,第一次写博客,写的不好的地方请多多包涵!!

你可能感兴趣的:(利用Maven+ProGuard进行代码混淆,个人心得)