Skip to content

排除规则

了解一下

我们使用 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路径

console
org/example/ClassA

引用风格的Class路径

console
org.example.ClassA

也就是说,以下示例是等效的

console
+org/example/ClassA 
+org.example.ClassA

但是我们推荐都使用引用风格的路径

过滤器

使用表达式排除

幻影盾X 中任何的变压器 (Transformer) 都有过滤器 (Filter)

全局过滤器作为单独的键出现,而局部过滤器则在变压器的子键中出现,以下是一个示例:

yaml
# 全局过滤器示例
filters:
  - +org.example.*

# 局部过滤器示例
renamer:
  filters:
    - -org.example.*

如果全局过滤器存在,那么只有全局过滤器与局部过滤器的表达式同时匹配过滤项,变压器才会处理您指定的字段、方法或类。

过滤类的表达式:

console
[@注解] 类 [extends 基类] [implements 接口]

示例:

yaml
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.**

过滤方法的表达式:

console
[@注解] 类 [extends 基类] [implements 接口] 方法返回值 [@注解] 方法名(方法描述符)

示例:

yaml
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;

过滤字段的表达式:

console
[@注解] 类 [extends 基类] [implements 接口] 字段返回值 [@注解] 字段名

示例:(与过滤方法大同小异不再过多赘述)

yaml
filters:
  # 排除所有序列化 UID 字段
  - -** long serialVersionUID

TIP

符号

符号描述
[ ][ ] 内的为 不必要选项 (optional)
@@ 符号为 注解

注意

您应该使用关键字来表示基本数据类型的描述符,而不是 JVM 定义中的描述符。

例如:您应该使用 int 而不是 I 来表示整数类型。

基本类型描述符基本类型描述符
booleanZintI
byteBlongJ
shortSfloatF
charCdoubleD
voidV

警告

java.lang.Stringjava.lang.Object 不是基本类型。

我们使用 +- 区分包含与排除。

当过滤器的第一条表达式为 + 时,那么该过滤器将自动排除所有的字段、方法和类,反之则当过滤器的第一条表达式为 - 时,那么该过滤器将自动包含所有的字段、方法和类。

有多条表达式时,过滤是在上一条表达式基础上进行的。

使用注解排除

首先您需要将 phantomshield-annotations.jar 导入到您的项目

当你要包含/排除时,直接将注解定义在您需要包含的字段、方法或类上:

java
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 会优先识别注解。