排除规则
了解一下
我们使用 AntPathMatcher
来处理包含与排除
我们在初次学习的时候,必然是会遇到棘手的时刻,但是方法总比困难多,相信我,一旦掌握了窍门,就会变得非常容易。
首先,最重要的是了解基本的匹配规则。
符号 | 作用 | 示例 |
---|---|---|
? | 匹配一个字符。不能匹配目录。 | org.example.Class? 匹配:org.example.ClassA、org.example.ClassB 不匹配:org.example.ClassAAA、org.example.Cl4$$A、today.bypass.ClassA |
* | 匹配0到多个字符。 | org.example.* 匹配:org.example.ClassA、org.example.ABCD、org.example.FakeCrackMe 不匹配:org.example.subpackage.SubClass1337 |
** | 匹配多级目录。 | org.example.** 匹配:org.example.ABC、org.example.subpackage.Person |
注意
我们允许混用
内部路径风格的Class路径
org/example/ClassA
引用风格的Class路径
org.example.ClassA
也就是说,以下示例是等效的
+org/example/ClassA
+org.example.ClassA
但是我们推荐都使用引用风格的路径
过滤器
使用表达式排除
在 幻影盾X
中任何的变压器 (Transformer) 都有过滤器 (Filter)
全局过滤器作为单独的键出现,而局部过滤器则在变压器的子键中出现,以下是一个示例:
# 全局过滤器示例
filters:
- +org.example.*
# 局部过滤器示例
renamer:
filters:
- -org.example.*
如果全局过滤器存在,那么只有全局过滤器与局部过滤器的表达式同时匹配过滤项,变压器才会处理您指定的字段、方法或类。
过滤类的表达式:
[@注解] 类 [extends 基类] [implements 接口]
示例:
filters:
# 排除 ClassA
- -org.example.ClassA
# 排除以 Config 为开头的类
- -org.example.Config*
# 排除以 Class 结尾的类
- -org.example.*Class
# 排除所有在 org.example 软件包以及其子包下继承 me.imfl0wow.AbstractModule 的类
- -org.example.** extends me.imfl0wow.AbstractModule
# 排除所有在 org.example 软件包以及其子包下实现 me.eventbus.Event 接口的类
- -org.example.** implements me.eventbus.Event
# 基类只能有一个,而接口可以排除多个
- -org.example.** implements me.reallife.Person implements me.reallife.Woman
# 排除所有在 org.example 软件包以及其子包下加了 me.eventbus.Target 注解的类
- -@me.eventbus.Target org.example.**
过滤方法的表达式:
[@注解] 类 [extends 基类] [implements 接口] 方法返回值 [@注解] 方法名(方法描述符)
示例:
filters:
# 排除所有主方法
- -** void main(java.lang.String[])
# 排除所有返回值为 java.util.Optional 的方法
- -** java.util.Optional *(*)
# 排除所有 getter
- -** * get*()
# 排除所有 setter
- -** void set*(*)
# 排除所有加密方法
- -** byte[] encrypt(byte[],byte[])
IMPORTANT
数组的识别应该在类型后面添加一对方括号
例如:
int[]
表示 [I
short[][]
表示 [[S
java.lang.Object[]
表示 [Ljava/lang/Object;
过滤字段的表达式:
[@注解] 类 [extends 基类] [implements 接口] 字段返回值 [@注解] 字段名
示例:(与过滤方法大同小异不再过多赘述)
filters:
# 排除所有序列化 UID 字段
- -** long serialVersionUID
TIP
符号
符号 | 描述 |
---|---|
[ ] | [ ] 内的为 不必要选项 (optional) |
@ | @ 符号为 注解 |
注意
您应该使用关键字来表示基本数据类型的描述符,而不是 JVM 定义中的描述符。
例如:您应该使用 int
而不是 I
来表示整数类型。
基本类型 | 描述符 | 基本类型 | 描述符 |
---|---|---|---|
boolean | Z | int | I |
byte | B | long | J |
short | S | float | F |
char | C | double | D |
void | V |
警告
java.lang.String
和 java.lang.Object
不是基本类型。
我们使用 +
和 -
区分包含与排除。
当过滤器的第一条表达式为 +
时,那么该过滤器将自动排除所有的字段、方法和类,反之则当过滤器的第一条表达式为 -
时,那么该过滤器将自动包含所有的字段、方法和类。
有多条表达式时,过滤是在上一条表达式基础上进行的。
使用注解排除
首先您需要将 phantomshield-annotations.jar
导入到您的项目
当你要包含/排除时,直接将注解定义在您需要包含的字段、方法或类上:
import tech.skidonion.obfuscator.annotations.Renamer;
// 重命名器将包含 AnnotationTest 类
@Renamer
public class AnnotationTest() {
@Renamer
public String fieldA = "123";
// 如果将 obfuscated 的数值改为 false 则为排除
@Renamer(obfuscated = false)
public void methodA() {
System.out.println(fieldA);
}
}
过滤优先级
如果你的字段定义、方法定义或者类定义中添加了排除/包含注解,那么 幻影盾X
会优先识别注解。