Skip to content

Commit

Permalink
fix: 重写GameProfile处理,选择覆写而不删除
Browse files Browse the repository at this point in the history
  • Loading branch information
0XPYEX0 committed Aug 10, 2024
1 parent 889aaea commit adec2e9
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 22 deletions.
12 changes: 8 additions & 4 deletions src/main/java/me/xpyex/module/cnusername/CnUsername.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ public class CnUsername {
debugResult = false;
e.printStackTrace();
}
DEBUG = debugResult;
if (DEBUG) {
if (DEBUG = debugResult) {
Logging.info("当前Debug已启用,修改类时将会保存样本");
}
}
Expand Down Expand Up @@ -122,17 +121,22 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
e.printStackTrace();
Logging.warning("修改失败: " + e);
}
break;
case "org/bukkit/plugin/EventExecutor$1":
case "org/bukkit/Bukkit":
case "org/bukkit/craftbukkit/CraftServer$2":
case "org/bukkit/command/ConsoleCommandSender":
Logging.setLogger(Bukkit.getLogger());
case "me.xpyex.plugin.xplib.bukkit.bstats.Metrics":
Logging.info("CraftServer loaded");
break;
case "me/xpyex/plugin/xplib/bukkit/bstats/Metrics":
try {
classBeingRedefined.getConstructor(JavaPlugin.class, int.class).newInstance(Bukkit.getPluginManager().getPlugin("XPLib"), 19275);
} catch (ReflectiveOperationException e) {
Logging.warning("无法调用XPLib的BStats库: " + e);
e.printStackTrace();
Logging.info("不用担心,这并不会影响你的使用 :)");
}
break;
}
return null;
}
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/me/xpyex/module/cnusername/Logging.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ public static void info(String s) {
return;
}
getLogger().info(PREFIX + s);
//
}

public static void warning(String s) {
Expand All @@ -24,7 +23,6 @@ public static void warning(String s) {
return;
}
getLogger().warning(PREFIX + s);
//
}

public static Logger getLogger() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ public ClassVisitorStringUtil(String className, ClassVisitor classVisitor, Strin
super(className, classVisitor, pattern);
}


@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import me.xpyex.module.cnusername.Logging;
import me.xpyex.module.cnusername.impl.PatternVisitor;
import me.xpyex.module.cnusername.mojang.ClassVisitorStringUtil;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

Expand All @@ -22,23 +24,73 @@ public ClassVisitorCraftPlayerProfile(String className, ClassVisitor classVisito
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
//在1.20.5+,该方法添加了一个参数验证; 而1.20.4时无参数验证,直接return
//所以从原来的“删除首行”方案改为覆写
//固定加入参数验证String.isValidPlayerName(),无论版本
if ("createAuthLibProfile".equals(name) && (access & Opcodes.ACC_STATIC) > 0 && "(Ljava/util/UUID;Ljava/lang/String;)Lcom/mojang/authlib/GameProfile;".equals(descriptor)) {
Logging.info("正在修改 " + getClassName() + " 类中的 " + name + "(UUID, String) 方法");
return new MethodVisitor(Opcodes.ASM9, visitor) { //删除该方法内第一行代码 string.length() 的检查
private boolean gotCheckArgument = false;

@Override
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
if (Opcodes.INVOKESTATIC == opcode && "checkArgument".equals(name)) { //走到checkArgument时
if (!gotCheckArgument) { //如果之前还没走到过checkArgument的话
gotCheckArgument = true; //这就是第一个了
mv = null; //删除这行
}
}
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
mv = visitor; //恢复
}
};
visitor.visitCode();
Label label0 = new Label();
visitor.visitLabel(label0);
visitor.visitVarInsn(Opcodes.ALOAD, 1);
Label label1 = new Label();
visitor.visitJumpInsn(Opcodes.IFNULL, label1);
visitor.visitVarInsn(Opcodes.ALOAD, 1);
visitor.visitMethodInsn(Opcodes.INVOKESTATIC, ClassVisitorStringUtil.CLASS_PATH, "isValidPlayerName", "(Ljava/lang/String;)Z", false);
Label label2 = new Label();
visitor.visitJumpInsn(Opcodes.IFEQ, label2);
visitor.visitLabel(label1);
visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
visitor.visitInsn(Opcodes.ICONST_1);
Label label3 = new Label();
visitor.visitJumpInsn(Opcodes.GOTO, label3);
visitor.visitLabel(label2);
visitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
visitor.visitInsn(Opcodes.ICONST_0);
visitor.visitLabel(label3);
visitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{Opcodes.INTEGER});
visitor.visitLdcInsn("The name of the profile contains invalid characters: %s");
visitor.visitVarInsn(Opcodes.ALOAD, 1);
visitor.visitMethodInsn(Opcodes.INVOKESTATIC, "com/google/common/base/Preconditions", "checkArgument", "(ZLjava/lang/String;Ljava/lang/Object;)V", false);
Label label4 = new Label();
visitor.visitLabel(label4);
visitor.visitTypeInsn(Opcodes.NEW, "com/mojang/authlib/GameProfile");
visitor.visitInsn(Opcodes.DUP);
visitor.visitVarInsn(Opcodes.ALOAD, 0);
Label label5 = new Label();
visitor.visitJumpInsn(Opcodes.IFNULL, label5);
visitor.visitVarInsn(Opcodes.ALOAD, 0);
Label label6 = new Label();
visitor.visitJumpInsn(Opcodes.GOTO, label6);
visitor.visitLabel(label5);
visitor.visitFrame(Opcodes.F_FULL, 2, new Object[]{"java/util/UUID", "java/lang/String"}, 2, new Object[]{label4, label4});
visitor.visitTypeInsn(Opcodes.NEW, "java/util/UUID");
visitor.visitInsn(Opcodes.DUP);
visitor.visitInsn(Opcodes.LCONST_0);
visitor.visitInsn(Opcodes.LCONST_0);
visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/UUID", "<init>", "(JJ)V", false);
visitor.visitLabel(label6);
visitor.visitFrame(Opcodes.F_FULL, 2, new Object[]{"java/util/UUID", "java/lang/String"}, 3, new Object[]{label4, label4, "java/util/UUID"});
visitor.visitVarInsn(Opcodes.ALOAD, 1);
Label label7 = new Label();
visitor.visitJumpInsn(Opcodes.IFNULL, label7);
visitor.visitVarInsn(Opcodes.ALOAD, 1);
Label label8 = new Label();
visitor.visitJumpInsn(Opcodes.GOTO, label8);
visitor.visitLabel(label7);
visitor.visitFrame(Opcodes.F_FULL, 2, new Object[]{"java/util/UUID", "java/lang/String"}, 3, new Object[]{label4, label4, "java/util/UUID"});
visitor.visitLdcInsn("");
visitor.visitLabel(label8);
visitor.visitFrame(Opcodes.F_FULL, 2, new Object[]{"java/util/UUID", "java/lang/String"}, 4, new Object[]{label4, label4, "java/util/UUID", "java/lang/String"});
visitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "com/mojang/authlib/GameProfile", "<init>", "(Ljava/util/UUID;Ljava/lang/String;)V", false);
visitor.visitInsn(Opcodes.ARETURN);
Label label9 = new Label();
visitor.visitLabel(label9);
visitor.visitLocalVariable("uniqueId", "Ljava/util/UUID;", null, label0, label9, 0);
visitor.visitLocalVariable("name", "Ljava/lang/String;", null, label0, label9, 1);
visitor.visitMaxs(8, 2);
visitor.visitEnd();
return null;
}
return visitor;
}
Expand Down

0 comments on commit adec2e9

Please sign in to comment.