JarGuard Pro 使用文档

本文档提供 JarGuard Pro 混淆工具的使用说明,包括全局配置、注解使用以及混淆策略。

主要功能

JarGuard Pro 提供强大的 Java 字节码混淆功能,包括:

  • 控制流扁平化 - 打乱代码执行流程
  • 虚假指令插入 - 增加反编译难度
  • 字符串加密 - 保护敏感字符串
  • 指令替换 - 将简单指令替换为复杂等价指令
  • 引用其他类 - 增加跨类调用复杂度
  • 基本块分裂 - 拆分代码块增加分析难度
  • Switch 转 IF - 改变控制流结构
  • Switch 膨胀 - 增加虚假分支
  • 方法调用隐藏 - 将方法调用抽出隐藏在反射中

全局配置

在开启混淆任务时,您可以设置全局配置并定义哪些类将被混淆:

# 混淆特定类 com.somepackage.SomeClass # 混淆某个包下的所有类(不包括子包) com.somepackage.* # 混淆某个包下的所有类(包括子包) com.somepackage.** # 黑名单模式(不混淆特定类) !com.somepackage.SomeClass # 不混淆特定类的某个方法 !com.somepackage.SomeClass.SomeMethod()
注意: 黑名单模式中,只要黑名单声明了的类或方法,一律不会被混淆。

注解配置

可以在代码中使用 @ObfuscationConfig 注解覆盖全局配置:

package com.test; import com.obfuscator.ObfuscationConfig; // 类级别注解 @ObfuscationConfig(isEnabled=true, isEnableFlattening=true, isEnableSplit=true) public class Main { public static void main(String[] args) { // ... } // 方法级别注解 - 禁用混淆 @ObfuscationConfig(isEnabled=false) public static void main2(String[] args) { // ... } // 方法级别注解 - 自定义混淆设置 @ObfuscationConfig(isEnableFlattening=true, isEnableReference=true, isEnableSplit=true) public static void main3(String[] args) { // ... } }
提示: 类级别注解会影响整个类,方法级别注解会覆盖类级别注解的配置。

注解配置覆盖关系

全局配置

  • 默认混淆设置
  • 类/包过滤规则
  • 黑名单设置

类级别注解

  • 覆盖全局配置
  • 启用/禁用类混淆
  • 类级别混淆设置

方法级别注解

  • 覆盖类配置
  • 启用/禁用方法混淆
  • 方法级别混淆设置

ObfuscationConfig 注解参数

*
参数 类型 默认值 说明
isEnabled boolean true 是否启用混淆(类级别禁用则整个类都不会被混淆)
isEnableFlattening boolean false 是否开启控制流扁平化
isEnableBogusControlFlow boolean false 是否开启虚假控制流(插入虚假判断指令)
isEnableStringObfusecat boolean false 是否开启字符串混淆
isEnableSubstitution boolean false 是否开启指令替换(将简单指令替换为复杂等价指令)
isEnableSwitch2If boolean false 是否将Switch语句转换为IF语句
bogusProbability int 30 虚假指令插入概率(1-100)
bogusLoop int 1 虚假指令循环次数
maxStringLength int 100 字符串混淆的最大长度
isEnableExpanseControlFlow boolean false 是否开启Switch Case膨胀
expansePercentage int 100 Switch Case膨胀百分比(100表示1倍膨胀)
isEnableReference boolean false 是否开启其他类引用(增加跨类调用)
isEnableSplit boolean false 是否分裂基础块(增强混淆效果)
isEnableNoMerge boolean false 是否防止语句合并(增加代码体积但增强混淆)
isEnableReflection boolean false 是否开启方法调用隐藏(将一部分方法调用隐藏在反射中,但是大幅度降低执行效率)
重要提示: 字符串混淆功能对于Java 9+中引入的字符串拼接方法可能无效。如需混淆这些字符串,请在javac编译参数中加入 -XDstringConcat=inline

混淆流程

JarGuard Pro 的混淆处理流程如下:

  1. 解析全局配置和黑名单
  2. 扫描类文件,识别注解配置
  3. 根据配置规则确定需要混淆的类和方法
  4. 应用选择的混淆策略(控制流扁平化、字符串加密等)
  5. 生成混淆后的字节码
  6. 重新打包为JAR文件

ObfuscationConfig 注解类定义

以下是完整的 ObfuscationConfig 注解类定义:

ObfuscationConfig.java

package com.obfuscator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 可以作用于Class也可作用于Method // 无论是Class中注解还是Method中注解都会覆盖全局配置,Method的配置会覆盖Class的配置 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ObfuscationConfig { // 如果设置为否,则不会混淆 // 如果Class中的配置设置为否,整个Class都不会被混淆,所有Method都不会被混淆,Method中的配置也不会再被读取 boolean isEnabled() default true; // 是否开启控制流扁平化 boolean isEnableFlattening() default false; // 是否开启虚假控制流 // 插入一些虚假的判断指令 boolean isEnableBogusControlFlow() default false; // 是否开启字符串混淆 // 注意:某些字符串无法被混淆,特别是Java9中引入的字符串拼接方法,如果需要将这部分字符串混淆,请在你的javac参数中加入"-XDstringConcat=inline" boolean isEnableStringObfusecat() default false; // 是否开启指令替换 // 将加减法以及xor替换成稍微复杂一点的指令 boolean isEnableSubstitution() default false; // 把Switch转换成IF boolean isEnableSwitch2If() default false; // 虚假指令插入的概率,1-100,100表示每个基本块百分之百会插入 int bogusProbability() default 30; // 虚假指令循环次数 int bogusLoop() default 1; // 字符串混淆的最大长度 int maxStringLength() default 100; // 是否开启Switch Case膨胀 // 在switch中加入虚假的Case boolean isEnableExpanseControlFlow() default false; // Switch Case膨胀的百分比 // 100意味着1倍,也就是10个分支将会插入10个虚假分支 int expansePercentage() default 100; // 是否开启其他类引用 // 字符串和控制流扁平化的key将会引用随即生成的别的类的方法返回 // 开启将会产生大量的随机名称的类 boolean isEnableReference() default false; // 是否分裂基础块 // 将原有的基础块分裂,在控制流扁平化和虚假指令中效果显著 boolean isEnableSplit() default false; // 是否开启防止语句合并 // 在混淆过程中不启用语句合并来达到最大混淆效果,能让分裂基础块效果更好,同时也会增加代码体积 boolean isEnableNoMerge() default false; // 是否开启方法调用隐藏 // 将一部分方法调用隐藏在反射中,但是会大幅度降低执行效率 boolean isEnableReflection() default false; }
使用说明: 开发者需要在项目中引入此注解类,然后在需要自定义混淆配置的类或方法上添加此注解。