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

      版权声明:本文为博主原创文章,未经博主允许不得转载。          https://blog.csdn.net/qq_39483330/article/details/87624333        </div>
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
                          <div id="content_views" class="markdown_views prism-atom-one-light">
        <!-- flowchart 箭头图标 勿删 -->
        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
          <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
        </svg>
        <h2><a name="t0"></a><a id="_0" target="_blank"></a>何为代码混淆</h2>

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

Maven+ProGuard

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

<plugins>
<!-- ProGuard混淆插件 -->
      <plugin>
        <groupId>com.github.wvengen</groupId>
        <artifactId>proguard-maven-plugin</artifactId>
        <version>2.0.14</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>proguard</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <!-- 将混淆后的pg包自动部署到maven上-->
        <attach>true</attach>
		<attachArtifactClassifier>pg</attachArtifactClassifier>
         <!--  <options>
            <!-- 关闭压缩-->
            <option>-dontshrink</option>
             <!-- 不忽略指定jars中的非public calsses-->
            <option>-dontskipnonpubliclibraryclasses</option>
             <!-- 不忽略指定类库的public类成员-->
            <option>-dontskipnonpubliclibraryclassmembers</option>
            <option>-optimizations !field/propagation/value</option>
            <option>-keepdirectories</option>
			<!-- 保留继承了注释的类-->
            <option>-keep class * extends java.lang.annotation.Annotation {*;}</option>
            <option>-keepattributes InnerClasses,Signature,LineNumberTable,*Annotation*,Exceptions</option>
            <option>
              -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();
              }
            </option></option>
          </options> -->
          <libs>
            <lib>${java.home}/lib/rt.jar</lib>
            <lib>${java.home}/lib/jce.jar</lib>
          </libs>
           <!-- 输出目录-->
           <outjar>${project.build.finalName}-pg</outjar>
        </configuration>
      </plugin>
</plugins>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

在与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 <fields>;
private <fields>;
}
#下面是保留枚举的
-keep class xxx.xxx.a {
;}
-keep class xxx.xxx.a$* {*;}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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

代码混淆—模块依赖

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

    <dependency>
      <groupId>xx.xx</groupId>
      <artifactId>a</artifactId>
      <!--寻找pg包,没有这句则寻找没混淆的jar包-->
      <classifier>pg</classifier>
      <version>${project.version}</version>
    </dependency>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这时打包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对其进行反编译。

反编译后像图片那样就是成功了。

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

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

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

      </div>
      <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
              </div>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值