Skip to content

Commit

Permalink
fix: 修复JavaAgent模式下不修改StringUtil的Bug; 修复插件模式下ClassVisitor错误的情况
Browse files Browse the repository at this point in the history
  • Loading branch information
0XPYEX0 committed Oct 30, 2024
1 parent aba365c commit b04252e
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 13 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group = 'me.xpyex'
version = '1.0.13'
version = '1.0.14'
def pluginPackage = 'me.xpyex.plugin.CnUsername'.toLowerCase()
def modulePackage = 'me.xpyex.module.CnUsername'.toLowerCase()

Expand Down
7 changes: 2 additions & 5 deletions src/main/java/me/xpyex/module/cnusername/CnUsername.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public class CnUsername {
}

public static void premain(final String agentArgs, final Instrumentation inst) {
System.out.println(agentArgs);
Logging.debug(agentArgs);
Logging.info("开始载入模块 §eCnUsername");
Logging.info("如遇Bug,或需提出建议: §aQQ群546338486 §r| §eQQ1723275529");
Logging.info("开源地址§6§o(GitHub)§r: https://github.com/0XPYEX0/CnUsername");
Expand Down Expand Up @@ -87,6 +87,7 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
case ClassVisitorLoginListener.CLASS_PATH_YARN:
case ClassVisitorStringReader.CLASS_PATH:
case ClassVisitorStringUtil.CLASS_PATH:
Logging.debug(className);
Logging.info("开始修改类 " + className);
try {
ClassReader reader = new ClassReader(classFileBuffer);
Expand All @@ -98,10 +99,6 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
visitor = new ClassVisitorAllowedCharacters(className, writer, agentArgs);
break;
case ClassVisitorCraftPlayerProfile.CLASS_PATH:
try {
Class.forName(ClassVisitorStringUtil.CLASS_PATH.replace("/", "."), true, loader);
} catch (ClassNotFoundException ignored) {
}
if (Version.parse("1.20.4").compareToIgnoreOptional(MC_VERSION) >= 0) {
Logging.info("服务端处于§e1.20.5以下§r版本,无需修改CraftPlayerProfile类");
return null;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/me/xpyex/module/cnusername/Logging.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@ public static void warning(String s) {
getLogger().warning(ColoredConsole.toANSI(PREFIX + s + "§r"));
}

public static void debug(String s) {
if (CnUsername.DEBUG) {
if (LOGGER.get() == null) {
System.out.println(ColoredConsole.toANSI("[" + FORMAT.format(new Date()) + " §9DEBUG§r]: " + PREFIX + s + "§r"));
return;
}
getLogger().info(ColoredConsole.toANSI(PREFIX + s + "§r"));
}
}

public static Logger getLogger() {
return LOGGER.get();
//
Expand Down
20 changes: 13 additions & 7 deletions src/main/java/me/xpyex/plugin/cnusername/bukkit/CnUsernameBK.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import me.xpyex.module.cnusername.CnUsername;
import me.xpyex.module.cnusername.Logging;
import me.xpyex.module.cnusername.UpdateChecker;
import me.xpyex.module.cnusername.impl.PatternVisitor;
import me.xpyex.module.cnusername.minecraft.ClassVisitorLoginListener;
import me.xpyex.module.cnusername.mojang.ClassVisitorStringUtil;
import me.xpyex.module.cnusername.paper.ClassVisitorCraftPlayerProfile;
Expand Down Expand Up @@ -44,7 +45,7 @@ public CnUsernameBK() {
// net.minecraft.util.StringUtil
ClassReader reader = new ClassReader(Bukkit.class.getClassLoader().getResourceAsStream(ClassVisitorStringUtil.CLASS_PATH + ".class"));
String className = reader.getClassName().replace("/", ".");
byte[] data = modifyClass(reader);
byte[] data = modifyClass(reader, ClassVisitorStringUtil.class);
loadClass(className, data);
Logging.info("修改完成并保存");
if (CnUsername.DEBUG) {
Expand All @@ -64,7 +65,7 @@ public CnUsernameBK() {
// com.destroystokyo.paper.profile.CraftPlayerProfile
ClassReader reader = new ClassReader(Bukkit.class.getClassLoader().getResourceAsStream(ClassVisitorCraftPlayerProfile.CLASS_PATH + ".class"));
String className = reader.getClassName().replace("/", ".");
byte[] data = modifyClass(reader);
byte[] data = modifyClass(reader, ClassVisitorCraftPlayerProfile.class);
loadClass(className, data);
Logging.info("修改完成并保存");
if (CnUsername.DEBUG) {
Expand Down Expand Up @@ -118,7 +119,7 @@ public void onLoad() {
throw new IllegalStateException("无法读取对应Class: Class可能不存在,或Class先于插件加载.");
}
String className = classReader.getClassName().replace("/", ".");
byte[] data = modifyClass(classReader);
byte[] data = modifyClass(classReader, ClassVisitorLoginListener.class);
loadClass(className, data);
Logging.info("修改完成并保存");
if (CnUsername.DEBUG) {
Expand Down Expand Up @@ -168,12 +169,17 @@ public void onPreLogin(AsyncPlayerPreLoginEvent event) {
}, this);
}

private byte[] modifyClass(ClassReader reader) {
private byte[] modifyClass(ClassReader reader, Class<? extends PatternVisitor> type) {
String className = reader.getClassName().replace("/", ".");
Logging.info("开始修改类 " + className);
ClassWriter classWriter = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);
ClassVisitor classVisitor = new ClassVisitorLoginListener(className, classWriter, readPluginPattern());
reader.accept(classVisitor, 0);
return classWriter.toByteArray();
try {
type.getConstructor(String.class, ClassVisitor.class, String.class).newInstance(className, classWriter, readPluginPattern());
ClassVisitor classVisitor = new ClassVisitorLoginListener(className, classWriter, readPluginPattern());
reader.accept(classVisitor, 0);
return classWriter.toByteArray();
} catch (ReflectiveOperationException e) {
return new byte[0];
}
}
}

0 comments on commit b04252e

Please sign in to comment.