5

SpringBoot使用Proguard混淆代码

项目使用Gradle做构建,使用的框架是SpringBoot、Mybatis、Mybatis Plus,sql都写在mybatis的xml文件中。
网上有些博客是直接使用Maven的proguard插件,或者是Gradle的proguard插件。但是我这里没有用这些插件,因为对构建工具依赖比较大。建议还是直接把proguard下载回来,配置到自己电脑的path下来使用就好了,解耦

要点

  1. 建议逐个包定义混淆规则,这样思路更清晰
  2. dao层需要保存包名和类名,因为Mybatis的xml文件中引用了dao层的接口
  3. controller层注意在使用@PathVariable@RequestParam时需要显式声明参数名
  4. dao层用于映射数据库表的类和controller层映射前台参数的类,都需要保留类成员
  5. 修改spring的bean命名策略,改成按类的全限定名来命名

实操

1.修改bean命名策略:

@SpringBootApplication
public class ServerApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ServerApplication.class)
                .beanNameGenerator((def,reg)->def.getBeanClassName())
                .run(args);
    }
}

2.springboot打包:gradle clean,然后gradle build

3.编写混淆规则&调试混淆结果:

我的项目就叫server,打包好springboot的jar包后,自己手动解压出jar包文件,编写配置文件并执行proguard.bat @proguard.cnf调试。需要耐心反复校验混淆效果。以下是我的proguard.cnf文件:

# 基础目录,下面injars、outjars、libraryjars参数都基于此目录
-basedirectory build/libs/server-1.0/BOOT-INF/

# 需要做混淆的jar或目录
-injars classes

# 混淆后输出的jar或目录
-outjars classes-pro

# 混淆时需要引用的java库,这些库的类不会做混淆
-libraryjars <java.home>/lib/rt.jar
-libraryjars lib

# 不警告
-dontwarn

# 不理会警告,否则混淆失败
-ignorewarnings

# 不压缩
-dontshrink

# 不优化
-dontoptimize

# 一个类中的成员不使用重复的命名,如Student类混淆后不能出现a属性和a方法。
-useuniqueclassmembernames

# 不混淆注解
-keepattributes *Annotation*

# 不混淆泛型
-keepattributes Signature

# 保留程序入口
-keep @org.springframework.boot.autoconfigure.SpringBootApplication class * {*;}

# config 可以做混淆

# constants 可以做混淆

# controller 可以混淆

# dao 保留全部类及类成员,方法命名也不能变,因为与xml文件做了关联
-keep class com.abc.device.dao.** {*;}

# entity 保留全部类
-keep class com.abc.device.entity.** {*;}

# service 可以混淆
#-keep interface * extends com.baomidou.mybatisplus.service {*;}

# shiro 可以混淆

# util 可以混淆

# vo 用keepclasseswithmembers保留类名和类成员,keepclassmembers保留部分的类成员,剩下的都混淆

-keepclasseswithmembers class com.abc.device.vo.DeviceServicePropMsg {*;}
-keepclasseswithmembers class com.abc.device.vo.DeviceNewestMsgTime {*;}
-keepclassmembers class com.abc.device.vo.DeviceImportVo {*;}
-keepclassmembers class com.abc.device.vo.DeviceNewestMsgTime {*;}
-keepclassmembers class com.abc.device.vo.Option {*;}
-keepclassmembers class com.abc.device.vo.UpdateRolePermVo {*;}

4.重新打包:

混淆后,可以手工拷贝class文件到原来的jar包中替换classes目录,我为了方便,写了个proguard.bat来执行:

md build\libs\server-1.0 && ^
cd build\libs\server-1.0 && ^
jar xf ..\server-1.0.jar && ^
cd ..\..\..\ && ^
proguard.bat @proguard.cnf && ^
rd /S/Q build\libs\server-1.0\BOOT-INF\classes && ^
ren build\libs\server-1.0\BOOT-INF\classes-pro classes && ^
jar c0fM build\libs\server-1.0-pro.jar -C build\libs\server-1.0/ . && ^
rd /S/Q build\libs\server-1.0

其实逻辑都很简单:
创建build\libs\server-1.0
进入build\libs\server-1.0
解压springboot打出来的jar包:jar xf ..\server-1.0.jar
退回到server目录:cd ..\..\..\
按混淆配置文件执行混淆:proguard.bat @proguard.cnf
删除目录:rd /S/Q build\libs\server-1.0\BOOT-INF\classes
重命名目录:ren build\libs\server-1.0\BOOT-INF\classes-pro classes
重新打包jar:jar c0fM build\libs\server-1.0-pro.jar -C build\libs\server-1.0/ .
删除目录:rd /S/Q build\libs\server-1.0


煲煲菜
1.5k 声望155 粉丝

世上本没有bug,坑的人多了,也便成了bug