因为最新版本 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 位参与者