Skip to content

native_obfuscation

将原始的 Java Bytecode 转换为 使用 Java Native Interface 的对等 C++ 代码,并编译成本机动态库。

并且附带插入 Oreans Tech 虚拟机宏与保护宏的插件。

yaml
native_obfuscation:
  loader_package: skidonion/?????
  hidden_stack_trace: true
  null_safety: true
  verification:
    verification_enable: false
    use_internal_user_interface: true
    verification_software_id: '-1'
    verification_user_id: '-1'
    verification_token: ''
    verification_keep_alive: false

警告

本机代码转换器 中您应该先包含需要混淆的类,然后再包含需要混淆的方法。

loader_package

动态链接库加载器的包

示例:

yaml
native_obfuscation:
  # 可以使用 '?' 來替代随机字符
  loader_package: skidonion/?????

hidden_stack_trace

隐藏堆栈跟踪

该功能在一些阉割版的 JVM 虚拟机中可能不起作用。

null_safety

空指针安全

开启本选项,在转换到本机代码时以抛出空指针异常代替JVM Crash

verification

如何获取 Token软件ID幻影盾X验证后端接口 中详细阐述。

verification_enable

验证开关

如果您没有购买 授权验证 用户组,您将无法使用该功能。

use_internal_user_interface

使用内置的图像用户登录界面

verification_software_id

您的软件ID

verification_user_id

您的用户UID

verification_token

您的TOKEN

verification_keep_alive

验证之后是否需要对服务器保持心跳

如果保持心跳链接则:

  • 握手失败则崩溃
  • 异地登录则崩溃

关于 @NativeObfuscation 注解

插入 Oreans 虚拟机宏

你可以通过注解为指定方法插入代码虚拟化宏:

java
import tech.skidonion.obfuscator.annotations.NativeObfuscation;

@NativeObfuscation(virtualize = NativeObfuscation.VirtualMachine.TIGER_BLACK)
public static void main(String[] args) {
    // 您的业务代码 ...
}

注意

代码虚拟化用在一个大方法会用很长的时间!!!

代码虚拟化不应该用在时间关键型方法上!!!

代码虚拟化应该添加在非常重要的方法中!!!

manualTryCatch 参数

手动捕获异常

参数描述
是否手动捕获异常 (value)布尔类型

详情请见 内联接口

verificationLock 参数

运行时校验登录合法性。

参数描述
用户组名称 (value)字符串

填入该选项将会启用登录合法性检测,如果未登录或没有该用户组可能会导致包括但不限于崩溃,运行结果错误等。

示例:

java

@NativeObfuscation(verificationLock = "用户组AAA")
public static void main(String[] args) {
    System.out.println("hello world"); // 如果不登陆就运行该方法,该方法的字符串会变成圣经节选。
}

@Inline

该注解可以加在静态字段/非静态字段/实例方法(可能不支持接口方法/构造器方法/私有方法)/静态方法中:

java

@NativeObfuscation.Inline
public static Object[] magicArray;

@NativeObfuscation.Inline
public String text;

@NativeObfuscation.Inline
public static void staticMethod() {
    // ...
}

@NativeObfuscation.Inline
public void virtualMethod() {
    // ...
}

此时所有的 GETSTATICPUTSTATICGETFIELDSETFIELDINVOKEVIRTUALINVOKESTATIC 操作都应该被直接内联到动态链接库中,并且在 Java 字节码中删除该字段/方法。

推荐

我们十分推荐你使用该注解。

这个会显著增强强度。

TIP

关于内联非静态字段的垃圾回收问题

当含有内联非静态字段的类实现了 java/lang/AutoCloseablejava/io/Closeable 接口时,

幻影盾会自动注入字段垃圾回收的代码。

java
public class TestClass implements AutoCloseable {
    @NativeObfuscation.Inline
    public String text;

    @Override
    public void close() throws Exception {
    }
}

public class Main {
    public static void main(String[] args) {
        TestClass clz = new TestClass();
        clz.text = "123";

        // 正常输出 123
        System.out.println(clz.text);
        clz.close();
        // 输出null或者其他野数据
        System.out.println(clz.text);

        // 自动回收
        try (TestClass testClass = new TestClass()) {
            testClass.text = "123";
            System.out.println(testClass.text);
        }
    }
}

已弃用 @InlineStaticFieldAccess

该注解只应该加在静态字段中。