native_obfuscation
将原始的 Java Bytecode 转换为 使用 Java Native Interface 的对等 C++ 代码,并编译成本机动态库。
并且附带插入 Oreans Tech
虚拟机宏与保护宏的插件。
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
动态链接库加载器的包
示例:
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 虚拟机宏
你可以通过注解为指定方法插入代码虚拟化宏:
import tech.skidonion.obfuscator.annotations.NativeObfuscation;
@NativeObfuscation(virtualize = NativeObfuscation.VirtualMachine.TIGER_BLACK)
public static void main(String[] args) {
// 您的业务代码 ...
}
注意
代码虚拟化用在一个大方法会用很长的时间!!!
代码虚拟化不应该用在时间关键型方法上!!!
代码虚拟化应该只添加在非常重要的方法中!!!
manualTryCatch 参数
手动捕获异常
参数 | 描述 |
---|---|
是否手动捕获异常 (value) | 布尔类型 |
详情请见 内联接口
verificationLock 参数
运行时校验登录合法性。
参数 | 描述 |
---|---|
用户组名称 (value) | 字符串 |
填入该选项将会启用登录合法性检测,如果未登录或没有该用户组可能会导致包括但不限于崩溃,运行结果错误等。
示例:
@NativeObfuscation(verificationLock = "用户组AAA")
public static void main(String[] args) {
System.out.println("hello world"); // 如果不登陆就运行该方法,该方法的字符串会变成圣经节选。
}
@Inline
该注解可以加在静态字段/非静态字段/实例方法(可能不支持接口方法/构造器方法/私有方法)/静态方法中:
@NativeObfuscation.Inline
public static Object[] magicArray;
@NativeObfuscation.Inline
public String text;
@NativeObfuscation.Inline
public static void staticMethod() {
// ...
}
@NativeObfuscation.Inline
public void virtualMethod() {
// ...
}
此时所有的 GETSTATIC
、PUTSTATIC
、GETFIELD
、SETFIELD
、INVOKEVIRTUAL
和INVOKESTATIC
操作都应该被直接内联到动态链接库中,并且在 Java 字节码中删除该字段/方法。
推荐
我们十分推荐你使用该注解。
这个会显著增强强度。
TIP
关于内联非静态字段的垃圾回收问题
当含有内联非静态字段的类实现了 java/lang/AutoCloseable
和 java/io/Closeable
接口时,
幻影盾会自动注入字段垃圾回收的代码。
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
该注解只应该加在静态字段中。