本文档提供 JarGuard Pro 混淆工具的使用说明,包括全局配置、注解使用以及混淆策略。
JarGuard Pro 提供强大的 Java 字节码混淆功能,包括:
在开启混淆任务时,您可以设置全局配置并定义哪些类将被混淆:
# 混淆特定类
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) {
// ...
}
}
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 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 | 是否开启方法调用隐藏(将一部分方法调用隐藏在反射中,但是大幅度降低执行效率) |
-XDstringConcat=inline。
JarGuard Pro 的混淆处理流程如下:
以下是完整的 ObfuscationConfig 注解类定义:
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;
}