編譯
簡單就是把代碼跑一哈,然后我們的代碼 .java文件 就被編譯成了 .class 文件
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
反編譯
就是針對編譯生成的 jar/war 包 里面的 .class 文件 逆向還原回來,可以看到你的代碼寫的啥。
比較常用的反編譯工具 JD-GUI ,直接把編譯好的jar丟進去,大部分都能反編譯看到源碼:
那如果不想給別人反編譯看自己寫的代碼呢?
怎么做?
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
混淆
該篇玩的代碼混淆 ,是其中一種手段。
我給你看,但你反編譯看到的不是真正的代碼。
先看一張效果示例圖 :
開搞
正文
先看一下我們混淆一個項目代碼,要做啥?
一共就兩步
第一步, 在項目路徑下,新增一份文件 proguard.cfg :
proguard.cfg
#指定Java的版本
-target1.8
#proguard會對代碼進行優化壓縮,他會刪除從未使用的類或者類成員變量等
-dontshrink
#是否關閉字節碼級別的優化,如果不開啟則設置如下配置
-dontoptimize
#混淆時不生成大小寫混合的類名,默認是可以大小寫混合
-dontusemixedcaseclassnames
#對于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆時不生成大小寫混合的類名,默認是可以大小寫混合
-dontusemixedcaseclassnames
#混淆類名之后,對使用Class.forName('className')之類的地方進行相應替代
-adaptclassstrings
#對異常、注解信息予以保留
-keepattributesExceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
#此選項將保存接口中的所有原始名稱(不混淆)-->
-keepnamesinterface**{*;}
#此選項將保存所有軟件包中的所有原始接口文件(不進行混淆)
#-keepinterface*extends*{*;}
#保留參數名,因為控制器,或者Mybatis等接口的參數如果混淆會導致無法接受參數,xml文件找不到參數
-keepparameternames
#保留枚舉成員及方法
-keepclassmembersenum*{*;}
#不混淆所有類,保存原始定義的注釋-
-keepclassmembersclass*{
@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
-keeppublicclasscom.example.myproguarddemo.MyproguarddemoApplication{
publicstaticvoidmain(java.lang.String[]);
}
注意點:
其余的看注釋,可以配置哪些類不參與混淆,哪些枚舉保留,哪些方法名不混淆等等。
第二步,在pom文件上 加入proguard 混淆插件 :
build標簽里面改動加入一下配置
<build>
<plugins>
<plugin>
<groupId>com.github.wvengengroupId>
<artifactId>proguard-maven-pluginartifactId>
<version>2.6.0version>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>proguardgoal>
goals>
execution>
executions>
<configuration>
<injar>${project.build.finalName}.jarinjar>
<outjar>${project.build.finalName}.jaroutjar>
<obfuscate>trueobfuscate>
<proguardInclude>${project.basedir}/proguard.cfgproguardInclude>
<libs>
<lib>${java.home}/lib/rt.jarlib>
<lib>${java.home}/lib/jce.jarlib>
<lib>${java.home}/lib/jsse.jarlib>
libs>
<inLibsFilter>!META-INF/**,!META-INF/versions/9/**.classinLibsFilter>
<outputDirectory>${project.basedir}/targetoutputDirectory>
<options>
options>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
<configuration>
<mainClass>com.example.myproguarddemo.MyproguarddemoApplicationmainClass>
configuration>
execution>
executions>
plugin>
plugins>
build>
注意點:
然后可以看到:
然后點擊package,正常執行編譯打包流程就可以 :
然后可以看到jar的生成:
看看效果:
好了,該篇就到這。
審核編輯 :李倩
-
JAVA
+關注
關注
19文章
2967瀏覽量
104751 -
代碼
+關注
關注
30文章
4788瀏覽量
68612 -
spring
+關注
關注
0文章
340瀏覽量
14343 -
編譯
+關注
關注
0文章
657瀏覽量
32871 -
SpringBoot
+關注
關注
0文章
173瀏覽量
179
原文標題:SpringBoot 玩一玩代碼混淆,防止反編譯代碼泄露
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論