# 指南

# 概述

  • 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>