SpringBoot代码混淆

作为一个有经验的程序员,我们都知道 jar/war里面的.class文件都可以逆向还回来,可以通过 JD-GUI 或者IDEA,那么我们该怎么样预防源码暴露呢?

可以混淆代码,扰乱敌人视线。接下来就一起来看看怎么去实现

代码混淆

  1. 首先得弄个springBoot项目吧

  2. 在项目根路径新建proguard.cfg文件,然后键入以下内容

    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
    #指定Java的版本
    -target 1.8
    #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
    -dontshrink
    #是否关闭字节码级别的优化,如果不开启则设置如下配置
    -dontoptimize
    #混淆时不生成大小写混合的类名,默认是可以大小写混合
    -dontusemixedcaseclassnames
    # 对于类成员的命名的混淆采取唯一策略
    -useuniqueclassmembernames
    #混淆时不生成大小写混合的类名,默认是可以大小写混合
    -dontusemixedcaseclassnames
    #混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
    -adaptclassstrings

    #对异常、注解信息予以保留
    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
    # 此选项将保存接口中的所有原始名称(不混淆)-->
    -keepnames interface ** { *; }
    # 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
    #-keep interface * extends * { *; }
    #保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
    -keepparameternames
    # 保留枚举成员及方法
    -keepclassmembers enum * { *; }
    # 不混淆所有类,保存原始定义的注释-
    -keepclassmembers class * {
    @org.springframework.context.annotation.Bean *;
    @org.springframework.beans.factory.annotation.Autowired *;
    @org.springframework.beans.factory.annotation.Value *;
    @org.springframework.stereotype.Service *;
    @org.springframework.stereotype.Component *;
    }

    #忽略warn消息
    -ignorewarnings
    #忽略note消息
    -dontnote
    #打印配置信息
    -printconfiguration

    #这里要看清,不要混淆springboot的启动类
    -keep public class com.yugb.Application {
    public static void main(java.lang.String[]);
    }
  3. 添加proguard混淆插件

    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
    52
    53
    54
    55
    56
    57
    <build>
    <plugins>
    <plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.6.0</version>
    <executions>
    <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
    <execution>
    <phase>package</phase>
    <goals>
    <goal>proguard</goal>
    </goals>
    </execution>
    </executions>
    <configuration>
    <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
    <injar>${project.build.finalName}.jar</injar>
    <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
    <outjar>${project.build.finalName}.jar</outjar>
    <!-- 是否混淆 默认是true -->
    <obfuscate>true</obfuscate>
    <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
    <!-- 额外的jar包,通常是项目编译所需要的jar -->
    <libs>
    <lib>${java.home}/lib/rt.jar</lib>
    <lib>${java.home}/lib/jce.jar</lib>
    <lib>${java.home}/lib/jsse.jar</lib>
    </libs>
    <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
    <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
    <outputDirectory>${project.basedir}/target</outputDirectory>
    <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
    <options>
    <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
    </options>
    </configuration>
    </plugin>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal>
    </goals>
    <configuration>
    <!-- 这个是启动类路径 -->
    <mainClass>com.yugb.Application</mainClass>
    </configuration>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    然后就可以看到:

  4. 正常执行编译打包流程


    打包编译+混淆

  5. 打开jar包,反编译class

    这打开一看,这啥东西啊,谁看谁不迷糊啊。接下来反编译走一波。