jfinal 项目代码混淆

为了防止通过反编译获取源码,可以使用代码混淆来提高代码阅读的成本。

本文使用ProGuard进行混淆,Maven打包时混淆使用的插件:https://github.com/wvengen/proguard-maven-plugin

具体实现

1.在pom plugins中添加混淆插件

<!-- ProGuard混淆插件 -->
<plugin>
	<groupId>com.github.wvengen</groupId>
		<artifactId>proguard-maven-plugin</artifactId>
		<version>2.2.0</version>
		<executions>
			<execution>
				<!-- 混淆时刻,这里是打包的时候混淆 -->
				<phase>package</phase>
				<goals>
					<!-- 使用插件的什么功能,当然是混淆 -->
					<goal>proguard</goal>
				</goals>
			</execution>
		</executions>
		<configuration>
			<!-- 是否将生成的PG文件安装部署 -->
			<attach>true</attach>
                        <!-- 是否混淆 -->
			<obfuscate>true</obfuscate>
			<!-- 指定生成文件分类 -->
			<attachArtifactClassifier>pg</attachArtifactClassifier>
			<!-- 混淆配置文件 -->
			<proguardInclude>${basedir}/proguard.cfg</proguardInclude>
			<injarNotExistsSkip>true</injarNotExistsSkip>
			<!-- 要混淆的jar -->
			<injar>${project.build.finalName}.jar</injar>
			<!--混淆后输出的jar包,会默认生成为*-pg.jar -->
			<outjar>${project.build.finalName}.jar</outjar>
                        <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
			<libs>
				<lib>${java.home}/lib/rt.jar</lib>
			</libs>
                        <!-- 输出目录 -->
			<outputDirectory>${project.build.directory}/</outputDirectory>
		</configuration>
</plugin>


2.整理proguard.cfg配置文件

<!-- 下面代码是通过直接配置plugin configuration的options配置,本文中是通过配置文件加载这些配置,这里粘出来是为了让大家了解注释及规则-->
<options>
         <!-- JDK目标版本1.8-->
         <option>-target 1.8</option>
         <!-- 不做收缩(删除注释、未被引用代码)-->
         <option>-dontshrink</option>
         <!-- 不做优化(变更代码实现逻辑)-->
         <option>-dontoptimize</option>
         <!-- 不路过非公用类文件及成员-->
         <option>-dontskipnonpubliclibraryclasses</option>
         <option>-dontskipnonpubliclibraryclassmembers</option>
         <!--不用大小写混合类名机制-->
         <option>-dontusemixedcaseclassnames</option>

         <!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
         <option>-allowaccessmodification</option>
         <!-- 确定统一的混淆类的成员名称来增加混淆-->
         <option>-useuniqueclassmembernames</option>
         <!-- 不混淆所有包名-->
         <!--<option>-keeppackagenames</option>-->

         <!-- 需要保持的属性:异常,注解等-->
         <option>-keepattributes
Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
         <!-- 不混淆所有的set/get方法->
         <!--<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>-->

         <!-- 不混淆包下的所有类名,且类中的方法也不混淆-->
         <option>-keep class com.xxx.xxx.bboss.SystemConfig { <methods>; }</option>
         <option>-keep class com.xxx.xxx.framework.** { *; }</option>
         <option>-keep class com.xxx.xxx.xxx.controller.** { <methods>; }</option>
         <option>-keep class com.xxx.xxx.xxx.dao.** { <methods>; }</option>
         <option>-keep class com.xxx.xxx.xxx.exception { <methods>; }</option>
         <option>-keep class com.xxx.xxx.xxx.model.** { <methods>; }</option>

      </options>


作者:ming_Liu
链接:https://www.jianshu.com/p/f9132d3d1a47
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


proguard.cfg(配置文件放在和pom.xml同级即可)

image.png


-target 1.8
-dontshrink
-dontoptimize
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
-allowaccessmodification
-useuniqueclassmembernames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
-keepclassmembers public class * {void set*(***);*** get*();}
-keep class com.shouxun.contract.config.Start {*;}
-keepclassmembers class com.shouxun.contract.controller.* {
	<methods>;
}

-keep class com.jfinal.** { *; }

-dontwarn org.apache.**
-dontwarn  com.aliyun.**
-dontwarn  com.dingtalk.**
-dontwarn  com.taobao.**
-dontwarn  com.jfinal.**

配置中有几个地方需要注意

1.-keep class com.shouxun.contract.config.Start {*;} //不混淆入口启动项
2.-keepclassmembers public class * {void set*(***);*** get*();} //不混淆getter,setter方法
3.-keepclassmembers class com.shouxun.contract.controller.* {
	<methods>;
} //不混淆控制层所有的方法名,如果混淆后action会导致404
4.其他需要排除的jar包和不需要的jar自己按需更改


3.修改package.xml(把放到lib下面的原始jar排除,混淆后的jar包放入打包的lib目录)

//在package.xml中把maven依赖到的jar复制到lib下,并排除原始jar

image.png

//在package.xml中fileSets中添加把混淆后的jar复制到lib

image.png

然后进行maven打包,打包成功后在项目target目录下会有一个*-pg.jar的混淆后的jar包,用反编译工具打开此jar包

image.png



问题

  1. 混淆后日志报错无法直观定位问题位置

  2. jfinal java8 Action参数注入无法注入,主要此插件打包暂时还不知道怎么配置-parameters


评论区

zhangtianxiao

2020-07-22 14:27

很棒

JFinal

2020-07-22 15:50

用 ProGuard 没错的,我上学的时候就用这东东,百年老店,值得信任,谢谢分享,赞

chcode

2020-07-23 16:18

日志无法定位,这个问题很大啊

加洲旅馆2012

2020-07-24 11:17

@chcode 对,日志报错这个问题我还没实际看过。想象中应该会有这个问题

热门分享

扫码入社