Skip to content

内联接口

内联类 Inline类

检测类方法需要您开启 本机代码转换器 并且仅编译Microsoft Windows的Intel平台,您才可以使用。

如果您的软件具有跨平台需求,则您无法使用该功能。

_advanced_checkProtection

检测动态库是否被脱壳,如果一切正常则返回预期值,如果检测到异常则返回0或其他数值。

参数描述返回值描述
预期的数值整数型
注意:您只能填写常量
预期的数值整数型

示例:

java
public static void main(String[] args) {
    int expected = 0xFF_FF_FF_FF;
    if ((expected = Inline.advanced_checkProtection(0x12_34_56_78)) == 0xFF_FF_FF_FF) {
        // 巴拉巴拉 ...
    }
    // 其他运算 ...
}

注意

这仅仅只是示例,在您的项目中,您可以根据实际情况使用。

_advanced_checkCRCImage

检测动态库内存镜像是否被修改 (例如: 补丁),如果一切正常则返回预期值,如果检测到异常则返回0或其他数值。

参数描述返回值描述
预期的数值整数型
注意:您只能填写常量
预期的数值整数型

示例:

java
public static void main(String[] args) {
    int expected = 0xFF_FF_FF_FF;
    if ((expected = Inline.advanced_checkCRCImage(0x12_34_56_78)) == 0xFF_FF_FF_FF) {
        // 巴拉巴拉 ...
    }
    // 其他运算 ...
}

_advanced_checkIsVirtualPC

检测动态库是否在虚拟机运行,如果一切正常则返回预期值,如果检测到异常则返回0或其他数值。

参数描述返回值描述
预期的数值整数型
注意:您只能填写常量
预期的数值整数型

示例:

java
public static void main(String[] args) {
    int expected = 0xFF_FF_FF_FF;
    if ((expected = Inline.advanced_checkIsVirtualPC(0x12_34_56_78)) == 0xFF_FF_FF_FF) {
        // 巴拉巴拉 ...
    }
    // 其他运算 ...
}

_advanced_checkIsDebuggerPresent

检测动态库是否被调试器调试,如果一切正常则返回预期值,如果检测到异常则返回0或其他数值。

参数描述返回值描述
预期的数值整数型
注意:您只能填写常量
预期的数值整数型

示例:

java
public static void main(String[] args) {
    int expected = 0xFF_FF_FF_FF;
    if ((expected = Inline.advanced_checkIsDebuggerPresent(0x12_34_56_78)) == 0xFF_FF_FF_FF) {
        // 巴拉巴拉 ...
    }
    // 其他运算 ...
}

trycatch

当启用 @NativeObfuscation 注解参数 manualTryCatchtrue 时,

详情请见:manualTryCatch 参数

您可以使用本方法来进行手动捕获异常,而不会在所有执行点加入异常处理判断。

示例:

java
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

@NativeObfuscation(manualTryCatch = true)
public static void main(String[] args) {
    try (BufferedReader reader = Files.newBufferedReader(Paths.get("xxx_xxx.bin"))) {
        String line;
        while ((line = reader.readLine()) != null) {
            Inline.trycatch(); // here
            System.out.println(line);
        }
    } catch (IOException exception) {
        // do something...
    }
}

验证包装类 Wrapper类

在对接使用 幻影盾X 的验证包装类方法之前,我们十分推荐您学习并且熟练使用 java.util.Optional

_debug_addDefaultCloudConstant

在调试环境中,添加云常量环境。

参数描述
用户组字符串
常量值字符串

示例:

java
public static void main(String[] args) {
    Wrapper._debug_addDefaultCloudConstant("用户组A", "1234567");
}

通知

幻影盾X 20240404 起,我们可以使用以下参数添加云常量

console
# 在 JVM 启动参数中添加指定参数
# -Dphantom-shield-x.cloud-constant.${hash}.${index}=${constant}
# `hash` 对应 `getCloudConstant` 中的 `hash`
# `index` 对应 `getCloudConstant` 中的 `index`
# `constant` 对应 `getCloudConstant` 中的 返回值
java -Dphantom-shield-x.cloud-constant.123456.0=helloworld

getUserId

获取用户的唯一识别码。

成功则返回包装后的用户ID

失败则返回 Optional.EMPTY

本方法应该在登录之后使用

返回值描述
用户的UIDOptional<Long>

示例:

java
public static void main(String[] args) {
    if (!Wrapper.getUserId().isEmpty()) {
        System.out.println(Wrapper.getUserId().get());
    } else {
        System.err.println("获取失败");
    }
}

getUsername

获取用户的用户名。

成功则返回包装后的用户用户名

失败则返回 Optional.EMPTY

本方法应该在登录之后使用

返回值描述
用户的用户名Optional<String>

示例:

java
public static void main(String[] args) {
    if (!Wrapper.getUsername().isEmpty()) {
        System.out.println(Wrapper.getUsername().get());
    } else {
        System.err.println("获取失败");
    }
}

getNickname

获取用户的昵称。

成功则返回包装后的用户昵称

失败则返回 Optional.EMPTY

本方法应该在登录之后使用

返回值描述
用户的昵称Optional<String>

示例:

java
public static void main(String[] args) {
    if (!Wrapper.getNickname().isEmpty()) {
        System.out.println(Wrapper.getNickname().get());
    } else {
        System.err.println("获取失败");
    }
}

login

用户登录接口

参数描述返回值描述
用户名字符串返回码整数型
密码字符串

示例:

java
public static void main(String[] args) {
    switch (Wrapper.login("用户名", "密码")) {
        case 0:
            System.out.println("登录成功");
            break;
        default:
            System.out.println("登录失败");
            break;
    }
}

以下是错误码详解:

错误码描述错误码描述
4用户名不存在或者密码错误99时间戳校验失败
5你的账户被管理员封禁101这个软件已停止服务,请联系软件管理员
6这个软件已停止服务,请联系软件管理员102用户名不存在
7软件管理员暂时封禁了你的账号,请联系软件管理员103机器码不匹配,请换绑
8你没有购买该软件的任何订阅104版本过低请更新软件
9软件维护中-1请检查因特网连接是否正常
97签名验证失败-2签名校验失败
98机器码不匹配-3内部错误

getVerifyToken

获取登录后地验证 Token 。

成功则返回 Token 。

失败则返回 null

本方法应该在登录之后使用

返回值描述
用户验证后的Token字符串

示例:

java
public static void main(String[] args) {
    System.err.println(Wrapper.getVerifyToken());
}

setAsSuspected

将用户设置为嫌疑人。

你可以在用户无法正常触发的地方添加这个方法。

使用该方法之后程序会自动关闭。

本方法应该在登录之后使用

参数描述
原因字符串

示例:

java
public static void main(String[] args) {
    if (checkIsCracked()) {
        Wrapper.setAsSuspected("Deobf?");
    }
}

getCloudConstant

获取云常量

获取在后台设置的常量

成功则返回包装后的常量

失败则返回 Optional.EMPTY

本方法应该在登录之后使用

参数描述返回值描述
用户组名称的哈希值整数型
该数值应该通过 "用户组".hashcode() 获取,并且应该是常量
常量Optional<String>
云常量索引整数型

示例:

java
public static void main(String[] args) {
    System.out.println(Wrapper.getCloudConstant(123456, 0));
}

getExpiredDate

获取指定用户组到期时间

成功则返回包装后的到期时间

失败则返回 Optional.EMPTY

本方法应该在登录之后使用

参数描述返回值描述
用户组名称字符串到期时间Optional<LocalDateTime>

示例:

java
public static void main(String[] args) {
    System.out.println(Wrapper.getExpiredDate("用户组").get());
}

getExpiredDates

获取该用户所有用户组到期时间

成功则返回到期时间映射表

失败则返回空映射

本方法应该在登录之后使用

返回值描述
到期时间映射表Map<String, LocalDateTime>

示例:

java
public static void main(String[] args) {
    System.out.println(Wrapper.getExpiredDates());
}

hasRole

判断是否拥有某用户组

成功则返回 true

失败则返回 false

本方法应该在登录之后使用

参数描述返回值描述
用户组名称字符串是否存在布尔值

示例:

java
public static void main(String[] args) {
    System.out.println(Wrapper.hasRole("用户组"));
}

@LoadAfterLogin 注解

在登录之后加载指定类

本注解只能注解在 Class 中

参数描述
用户组名称 (value)字符串
优先级 (priority)整数

优先级数字越小越先加载。

警告

在动态加载 Class 时,会自动初始化该 Class。

您很可能需要延后初始化/手动初始化/按照正常 Class 初始化顺序初始化该类的静态字段和静态代码块中的代码。

否则可能会出现不必要的错误。

示例:

java

@LoadAfterLogin(value = "用户组A", priority = 0)
public class ClassA {

}