# 指南
# 概述
BlindJava
是一个java源代码混淆工具,它可以针对java项目的源代码文本进行代码混淆,最后生成混淆后的java源代码文件
# 特性
- 支持完整maven项目的源代码混淆,非
.java
文件保留,例如.yml
.properties
.xml
.sh
.bat
都可以维持原样保留 ,.java
文件会进行代码混淆 - 支持maven多模块项目混淆,比如SpringCloud项目,如果多模块之间存在依赖关系,也可以混淆,比如A依赖B, B依赖C, D依赖C,可以同时对ABCD四个模块进行代码混淆。
- 支持指定代码不混淆,比如Springboot项目,对mybatis相关的mapper接口、java entity实体类不混淆
# 效果展示
# 快速开始
- 安装
JDK8+
- 下载安装包并解压
- 修改
conf/config.xml
文件 - windows双击
bin/blindJava.bat
启动,linux使用sh bin/blindJava.sh
启动 - 混淆成功后,会在结果目录生成4个文件夹
step1
step2
step3
step4
,其中step1是只混淆了所有变量名称的源代码文件,step2是在step1基础上混淆了所有方法名的源代码,step3是在step2基础上混淆了类名称的源代码,step4是在step3基础上删除了所有注释的源代码。用户使用step3或step4文件夹下的源代码即可。
# 使用条件
BlindJava
并不能对所有JAVA项目代码都可以混淆,必须先遵循以下代码规范:
- 一个
.java
文件内只允许写一个class类,不允许有内部类写法 - java文件中的import不允许出现
import xxx.*
的模式,每个类必须单独import
# 配置
<config>
<!--指定源代码所在的目录-->
<!--注意结尾必须加上文件分隔符,关于分隔符,linux操作系统用/,windows操作系统用\-->
<sourceDir>D:\git\super-api\</sourceDir>
<!--指定最后生成的代码存放的目录-->
<!--注意结尾必须加上文件分隔符,关于分隔符,linux操作系统用/,windows操作系统用\-->
<targetDir>E:\superApiEncrypted\</targetDir>
<!--指定排除哪些目录下的文件,一般是排除非源代码的目录,比如.idea、 target目录、前端安装目录node_modules-->
<!--注意必须是相对路径,不能填写绝对路径,相对于上面sourceDir的目录-->
<!--注意结尾必须加上文件分隔符,关于分隔符,linux操作系统用/,windows操作系统用\-->
<!--意思就是这些目录下的文件全部不要-->
<excludeDir>
<directory>dbapi-ui\node_modules\</directory>
<directory>logs\</directory>
<directory>dist\</directory>
<directory>target\</directory>
<directory>.git\</directory>
<directory>.idea\</directory>
</excludeDir>
<!-- 指定哪些java文件保持不变,不混淆。比如mybatis映射数据库的实体类、interface类-->
<!--可以按 package class 来指定-->
<excludeJavaFile>
<!-- 此package下的所有类和子包的类都全部代码不混淆-->
<package>com.gitee.freakchicken.dbapi.basic.domain</package>
<package>com.gitee.freakchicken.dbapi.basic.dto</package>
<!-- 此class的全部代码不混淆-->
<class>com.gitee.freakchicken.dbapi.basic.util.Constants</class>
</excludeJavaFile>
<!--指定哪些方法参数名称保持不变-->
<!--比如Controller中的方法的参数名称不能变,因为这些是接口参数,又或者mybatis的Mapper类中的方法参数名称不能变,因为这些参数名称要在sql中使用-->
<!--可以按 package class methodHasAnnotation 来指定-->
<keepMethodParameter>
<!-- 此package下的所有类的所有方法的参数名称不混淆-->
<package>com.gitee.freakchicken.dbapi.basic.controller</package>
<!-- 此class的所有方法的参数名称不混淆-->
<!-- <class>xxx</class>-->
<!-- 如果方法含有以下注解的任意一个,该方法的参数名不混淆-->
<methodHasAnnotation>Cacheable</methodHasAnnotation>
<methodHasAnnotation>CacheEvict</methodHasAnnotation>
</keepMethodParameter>
<!--指定哪些方法名称保持不变-->
<!--比如interface的方法名不能变,又比如实现类的实现方法的名称不能变-->
<!--可以按 package class methodHasAnnotation 来指定-->
<keepMethodName>
<!-- 此package下的所有类的所有方法的名称不混淆-->
<!-- <package>xxx</package>-->
<!-- 此class的所有方法的名称不混淆-->
<class>com.gitee.freakchicken.dbapi.basic.log.AccessLogWriter</class>
<!-- 如果方法含有以下注解的任意一个,该方法名不混淆-->
<methodHasAnnotation>Override</methodHasAnnotation>
</keepMethodName>
<!--指定哪些类名称保持不变-->
<!--比如main Class的名称不能变,因为可能在shell启动脚本中用到了这个类的名称-->
<!--可以按class classHasAnnotation 来指定-->
<keepClassName>
<!-- 此class的类的名称不混淆-->
<!-- <class>com.gitee.freakchicken.dbapi.apiserver.DBApiApiServer</class>-->
<!-- 如果类含有以下注解的任意一个,该类名不混淆-->
<classHasAnnotation>SpringBootApplication</classHasAnnotation>
</keepClassName>
<!--非.java文本文件,需要替换内容中的class类名的文件的后缀名-->
<!--比如.sh脚本中的内容有 java -cp lib/*: xxx.xxx.xx.C ,就需要替换xxx.xxx.xx.C-->
<textFile>
<!-- <file>sh</file>-->
<!-- <file>bat</file>-->
</textFile>
</config>