編譯
簡單就是把代碼跑一哈,然后我們的代碼 .JAVA文件 就被編譯成了 .class 文件
![]()
反編譯
就是針對編譯生成的 jar/war 包 里面的 .class 文件 逆向還原回來,可以看到你的代碼寫的啥。
比較常用的反編譯工具 JD-GUI ,直接把編譯好的jar丟進(jìn)去,大部分都能反編譯看到源碼:
![]()
那如果不想給別人反編譯看自己寫的代碼呢?
怎么做?
混淆
該篇玩的代碼混淆 ,是其中一種手段。
我給你看,但你反編譯看到的不是真正的代碼。
先看一張效果示例圖 :
![]()
開搞
正文
先看一下我們混淆一個項目代碼,要做啥?
![]()
第一步, 在項目路徑下,新增一份文件 proguard.cfg :
proguard.cfg
#指定Java的版本
-target 1.8
#proguard會對代碼進(jìn)行優(yōu)化壓縮,他會刪除從未使用的類或者類成員變量等
-dontshrink
#是否關(guān)閉字節(jié)碼級別的優(yōu)化,如果不開啟則設(shè)置如下配置
-dontoptimize
#混淆時不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
# 對于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆時不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
#混淆類名之后,對使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代
-adaptclassstrings
#對異常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此選項將保存接口中的所有原始名稱(不混淆)-->
-keepnames interface ** { *; }
# 此選項將保存所有軟件包中的所有原始接口文件(不進(jìn)行混淆)
#-keep interface * extends * { *; }
#保留參數(shù)名,因為控制器,或者M(jìn)yBatis等接口的參數(shù)如果混淆會導(dǎo)致無法接受參數(shù),xml文件找不到參數(shù)
-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
-keep public class com.example.myproguarddemo.MyproguarddemoApplication {
public static void main(java.lang.String[]);
}
注意點:
![]()
其余的看注釋,可以配置哪些類不參與混淆,哪些枚舉保留,哪些方法名不混淆等等。
第二步,在pom文件上 加入proguard 混淆插件 :
build標(biāo)簽里面改動加入一下配置。推薦面試寶典:https://www.yoodb.com,記著收藏,以備不時之需。
com.github.wvengengroupId>
proguard-maven-pluginartifactId>
2.6.0version>
packagephase>
proguardgoal>
goals>
execution>
executions>
${project.build.finalName}.jarinjar>
${project.build.finalName}.jaroutjar>
trueobfuscate>
${project.basedir}/proguard.cfgproguardInclude>
${java.home}/lib/rt.jarlib>
${java.home}/lib/jce.jarlib>
${java.home}/lib/jsse.jarlib>
libs>
!META-INF/**,!META-INF/versions/9/**.classinLibsFilter>
${project.basedir}/targetoutputDirectory>
注意點:
![]()
![]()
然后可以看到:
![]()
然后點擊package,正常執(zhí)行編譯打包流程就可以 :
![]()
然后可以看到j(luò)ar的生成:
![]()
看看效果:
![]()
好了,該篇就到這。
作者:小目標(biāo)青年 https://blog.csdn.NET/qq_35387940/article/details/127426354






