分享一下给MinecraftJava服务器写的类Mixin/AOP的系统

因为最新版本 mojang 取消了对源码的混淆,服务端结束了大 remap 乱斗时代。 那么既然结束了 remap 时代面向同一个源码,就大有文章可做。 一句话定性 我先稳稳的接住你(bushi ,这个功能写到了 TabooLib 中 链接如下: taboolib/module/incision/R...
分享一下给MinecraftJava服务器写的类Mixin/AOP的系统
分享一下给MinecraftJava服务器写的类Mixin/AOP的系统

因为最新版本 mojang 取消了对源码的混淆,服务端结束了大 remap 乱斗时代。
那么既然结束了 remap 时代面向同一个源码,就大有文章可做。

一句话定性

我先稳稳的接住你(bushi ,这个功能写到了 TabooLib 中 链接如下: taboolib/module/incision/README.md at dev/6.3.0 · TabooLib/taboolib · GitHub

正文

这是个什么东西?为什么需要这个?
首先 TabooLib 的模块开发准则,就是减少用户与开发者的负担,快速上手为主旨。
所以天生比较抗拒启动时增加启动参数或使用 JavaAgent 就要另寻他法来实现对字节码的 retransform (再转换),如果有这两个途径其实写起来更简单。
并且在 Java21+ 就开始收紧 self-attch 的功能,不允许使用这个共。

那么如何在不加启动参数,不使用 JavaAgent 不用 其他进程 attch 的情况下绕过 JVM 的审查实现再转换需求呢?
我选择了使用 JVMTI 。System.load() 作为一个 JNI 的标准能力基本上所有的 JVM 平台都可以使用。用 Zig + C 的方式来解决这个需求。

static jboolean JNICALL nRetransform(JNIEnv *jni, jclass self, jclass target) {
    if (g_jvmti == NULL) return JNI_FALSE;
    jvmtiError err = (*g_jvmti)->RetransformClasses(g_jvmti, 1, &target);
    if (err != JVMTI_ERROR_NONE) {
        /* 输出 JVMTI 错误码,便于诊断静默失败 */
        fprintf(stderr, "[Incision][JVMTI] RetransformClasses 失败: error=%d\n", (int)err);
        fflush(stderr);
    }
    return err == JVMTI_ERROR_NONE ? JNI_TRUE : JNI_FALSE;
}

这里就是举例展示一下,详细的内容可以看仓库,c 部分也是开源的。

是的,使用了 Native 就可以绕过了。

这就是这个框架的创新点,剩余的内容就是常规的 DSL / 类设计,参考了 AOP 和 Mixin 的设计。

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文