4 Star 10 Fork 5

code2roc/XHood

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

1️⃣项目概述

xhood是一款maven混淆插件,能够对项目源代码提供防护,避免遭受知识产权的侵害

🍊 【功能完善】 支持包名/类名/类成员名/方法名/方法参数名/局部变量名/临时变量名/常量混淆操作

🍒 【配置灵活】 不同信息的混淆均可独立使用互不影响,可指定混淆部分/忽略部分

🍓 【适配全面】 基于asm对class文件进行修改,普通项目/springboot项目/jar包/war包均可使用

🍅 【使用便捷】 直接配置maven插件,混淆无感知,对开发部署无额外侵入

2️⃣快速开始

🧀 混淆插件测试示例请见demo文件夹项目

🌮 springboot项目的混淆测试使用了自己写的一个后台管理系统,已配置完成

⏸配置位置

混淆插件需要配置在原有编译插件(如果有)之前

<plugin>
   <groupId>com.code2roc</groupId>
   <artifactId>xhood</artifactId>
   <version>1.0.0</version>
   <executions>
       <execution>
          <goals>
             <goal>obscure</goal>
          </goals>
          <phase>compile</phase>
        </execution>
    </executions>
    <configuration>
        <packageName>com.code2roc.obscure.demo</packageName>
        <obscureIgnoreClasss>com.code2roc.obscure.demo.Application</obscureIgnoreClasss>
    </configuration>
</plugin>

<plugin>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

⏸引用配置

<plugin>
   <groupId>com.code2roc</groupId>
   <artifactId>xhood</artifactId>
   <version>1.0.0</version>
   <executions>
       <execution>
          <goals>
             <goal>obscure</goal>
          </goals>
          <phase>compile</phase>
        </execution>
    </executions>
</plugin>

⏸参数配置

<configuration>
    <!--global-->
    <packageName>xxxxx</packageName>
    <obscurePackages></obscurePackages>
    <obscureIgnorePackages></obscureIgnorePackages>
    <obscureIgnoreClasss></obscureIgnoreClasss>
    <!--package -->
    <obscurePackage>true</obscurePackage>
    <obscurePackageIgnorePackages></obscurePackageIgnorePackages>
    <!--class -->
    <obscureClass>true</obscureClass>
    <obscureClassPackages></obscureClassPackages>
    <obscureClassIgnorePackages></obscureClassIgnorePackages>
    <obscureClassIgnoreClasss></obscureClassIgnoreClasss>
    <!--method -->
    <obscureMethod>true</obscureMethod>
    <obscureMethodPackages></obscureMethodPackages>
    <obscureMethodIgnorePackages></obscureMethodIgnorePackages>
    <obscureMethodIgnoreClasss></obscureMethodIgnoreClasss>
    <!--field -->
    <obscureField>true</obscureField>
    <obscureFieldPackages></obscureFieldPackages>
    <obscureFieldIgnorePackages></obscureFieldIgnorePackages>
    <obscureFieldIgnoreClasss></obscureFieldIgnoreClasss>
    <!--local -->
    <obscureLocal>true</obscureLocal>
    <obscureLocalPackages></obscureLocalPackages>
    <obscureLocalIgnorePackages></obscureLocalIgnorePackages>
    <obscureLocalIgnoreClasss></obscureLocalIgnoreClasss>
    <!--paramter -->
    <obscureParamter>true</obscureParamter>
    <obscureParamterPackages></obscureParamterPackages>
    <obscureParamterIgnorePackages></obscureParamterIgnorePackages>
    <obscureParamterIgnoreClasss></obscureParamterIgnoreClasss>
    <!--constant -->
    <obscureConstant>true</obscureConstant>
    <obscureConstantPackages></obscureConstantPackages>
    <obscureConstantIgnorePackages></obscureConstantIgnorePackages>
    <obscureConstantIgnoreClasss></obscureConstantIgnoreClasss>
    </configuration>

3️⃣配置说明

⏸配置列表

配置项 配置参数 参数类型 备注
全局配置 packageName string 项目根包名,例如com.code2roc.obscure
obscurePackages list 执行混淆操作的包名列表,默认根包名
obscureIgnorePackages list 忽略执行混淆操作的包名列表,默认空
obscureIgnoreClasss list 忽略执行混淆操作的类列表,默认空
包名混淆 obscurePackage bool 是否混淆包名,默认true
obscurePackageIgnorePackages list 忽略混淆包名列表,默认根包名
类名混淆 obscureClass bool 是否混淆类名,默认true
obscureClassPackages list 混淆类名包列表,默认空
obscureClassIgnorePackages list 忽略混淆类名包列表,默认空
obscureClassIgnoreClasss list 忽略混淆类名类列表,默认空
方法名混淆 obscureMethod bool 是否混淆方法名,默认true
obscureMethodPackages list 混淆方法名包列表,默认空
obscureMethodIgnorePackages list 忽略混淆方法名包列表,默认空
obscureMethodIgnoreClasss list 忽略混淆方法名类列表,默认空
成员变量名混淆 obscureField bool 是否混淆成员变量名,默认true
obscureFieldPackages list 混淆成员名包列表,默认空
obscureFieldIgnorePackages list 忽略混淆成员变量名包列表,默认空
obscureFieldIgnoreClasss list 忽略混淆成员变量名类列表,默认空
局部变量名混淆 obscureLocal bool 是否混淆局部变量名,默认true
obscureLocalPackages list 混淆局部变量名包列表,默认空
obscureLocalIgnorePackages list 忽略混淆局部变量名包列表,默认空
obscureLocalIgnoreClasss list 忽略混淆局部变量名类列表,默认空
方法参数名混淆 obscureParamter bool 是否混淆方法参数名,默认true
obscureParamterPackages list 混淆方法参数名包列表,默认空
obscureParamterIgnorePackages list 忽略混淆方法参数名包列表,默认空
obscureParamterIgnoreClasss list 忽略混淆方法参数名类列表,默认空
常量混淆 obscureConstant bool 是否混淆常量,默认true
obscureConstantPackages list 混淆常量包列表,默认空
obscureConstantIgnorePackages list 忽略混淆常量包列表,默认空
obscureConstantIgnoreClasss list 忽略混淆常量类列表,默认空

⏸配置详解

⏹必填项

🐯根包名packageName必填,其余可以为空,obscurePackages默认为packageName

🐮如果执行类名混淆,obscureIgnoreClasss必填,需要排除启动类,否则无法运行

⏹List配置项

🐵list类型配置示例如下,将父级配置标签名(obscureClassIgnoreClasss)末尾s去掉,就是列表中item的配置项标签名称(obscureClassIgnoreClass)

<obscureClassIgnoreClasss>
 	<obscureClassIgnoreClass>com.code2roc.demo.xxx</obscureClassIgnoreClass>
</obscureClassIgnoreClasss>

⏹优先级

🐷如果子项的混淆包名列表配置了,以子项为准,否则使用全局配置,示例如下

📒全局混淆包配置为

 <obscurePackages>com.code2roc.obscure</obscurePackages>

📒方法名混淆包配置为

 <obscurePackages>com.code2roc.obscure.demo</obscurePackages>

📒则最后执行方法名混淆时,只会混淆com.code2roc.obscure.demo包下的方法

🐹子项的忽略包名列表/忽略类名列表配置 = 全局配置和子项配置的交集,示例如下

📙全局混淆忽略class配置为

<obscureIgnoreClasss>
	<obscureIgnoreClass>com.code2roc.demo.test1<<obscureIgnoreClass>/>
	<obscureIgnoreClass>com.code2roc.demo.test2<<obscureIgnoreClass>/>
</obscureIgnoreClasss>

📙方法名混淆忽略class配置为

<obscureParamterIgnoreClasss>
	<obscureParamterIgnoreClass>com.code2roc.demo.test1<<obscureParamterIgnoreClass>/>
</obscureParamterIgnoreClasss>

📙则最后执行方法名混淆时,只会忽略com.code2roc.demo.test1这个类

⏹通配符

🐪忽略配置支持通配符操作(包括全局配置和子项配置),示例如下

📘忽略所有名为model的包下类的混淆操作

<obscureIgnorePackages>
	<obscureIgnorePackage>*/model</obscureIgnorePackage>
</obscureIgnorePackages>

📘忽略所有以Util结尾的类的混淆操作

<obscureIgnoreClasss>
	<obscureIgnoreClass>*Util</obscureIgnoreClass>
</obscureIgnoreClasss>

4️⃣注意事项

🌵 在springboot项目中,我们需要进行一些配置避免导致项目无法运行或运行错误

  • 🍁所有需要通过接口返回的实体类需要忽略,例如数据库实体DO

  • 🍂通过ConfigurationProperties映射的yml文件配置项类需要忽略

  • 🍄通过类名/字段名反射调用的类需要忽略

  • 🌴针对@Aspect注解切面进行了兼容,参照如下写法则混淆无影响

    PointCut注解/类需要指定全名,Around注解指定方法名

    @Aspect
    @Component
    public class RepeatSubmitAspect {
        /**
         * 切面点 指定注解
         */
        @Pointcut("@annotation(com.code2roc.fastboot.framework.submitlock.SubmitLock) " +
                "|| @within(com.code2roc.fastboot.framework.submitlock.SubmitLock)")
        public void repeatSubmitAspect() {
    
        }
    
        /**
         * 拦截方法指定为 repeatSubmitAspect
         */
        @Around("repeatSubmitAspect()")
        public Object around(ProceedingJoinPoint point) throws Throwable {
            return point.proceed();
        }
    }
    

5️⃣使用效果

  • 👳‍♂️ 源代码

  • 👲 混淆代码

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/code2roc/xhood.git
git@gitee.com:code2roc/xhood.git
code2roc
xhood
XHood
master

搜索帮助