代码混淆就是对反编译后的代码的类名,参数名进行混淆,使得代码不容易被看懂。
这里我采用了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> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051在与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$* {*;}
123456789101112131415161718192021222324252627282930313233(注:被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> 1234567这时打包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>