The Transformer:
public class PNClassTransformer implements IClassTransformer {
@Override
public byte[] transform(String vanillaClassName, String customClassName, byte[] bytecodeChunk) {
if (vanillaClassName.equals("jw")) {
bytecodeChunk = new C00PacketLoginStartPatcher().patch(bytecodeChunk, true);
} else if (vanillaClassName.equals("net.minecraft.network.login.client.C00PacketLoginStart")) {
bytecodeChunk = new C00PacketLoginStartPatcher().patch(bytecodeChunk, false);
} else if (vanillaClassName.equals("oi")) {
bytecodeChunk = new ServerConfigurationManagerPatcher().patch(bytecodeChunk, true);
} else if (vanillaClassName.equals("net.minecraft.server.management.ServerConfigurationManager")) {
bytecodeChunk = new ServerConfigurationManagerPatcher().patch(bytecodeChunk, false);
}
return bytecodeChunk;
}
}
ServerConfigurationManagerPatcher:
public class ServerConfigurationManagerPatcher extends Patcher {
protected void patchNotObfuscated(ClassNode classNode) {
for (MethodNode method : classNode.methods) {
String methodName = method.name;
if (methodName.equals("allowUserToConnect")) {
method.instructions.clear();
method.localVariables.clear();
method.visitCode();
Label l0 = new Label();
method.visitLabel(l0);
method.visitLineNumber(324, l0);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "bannedPlayers", "Lnet/minecraft/server/management/UserListBans;");
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/UserListBans", "func_152702_a", "(Lcom/mojang/authlib/GameProfile;)Z", false);
Label l1 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l1);
Label l2 = new Label();
method.visitLabel(l2);
method.visitLineNumber(325, l2);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "bannedPlayers", "Lnet/minecraft/server/management/UserListBans;");
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/UserListBans", "func_152683_b", "(Ljava/lang/Object;)Lnet/minecraft/server/management/UserListEntry;", false);
method.visitTypeInsn(Opcodes.CHECKCAST, "net/minecraft/server/management/UserListBansEntry");
method.visitVarInsn(Opcodes.ASTORE, 4);
Label l3 = new Label();
method.visitLabel(l3);
method.visitLineNumber(326, l3);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitLdcInsn("You are banned from this server!\nReason: ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/UserListBansEntry", "getBanReason", "()Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
Label l4 = new Label();
method.visitLabel(l4);
method.visitLineNumber(328, l4);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/UserListBansEntry", "getBanEndDate", "()Ljava/util/Date;", false);
Label l5 = new Label();
method.visitJumpInsn(Opcodes.IFNULL, l5);
Label l6 = new Label();
method.visitLabel(l6);
method.visitLineNumber(329, l6);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitLdcInsn("\nYour ban will be removed on ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "net/minecraft/server/management/ServerConfigurationManager", "dateFormat", "Ljava/text/SimpleDateFormat;");
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/UserListBansEntry", "getBanEndDate", "()Ljava/util/Date;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/text/SimpleDateFormat", "format", "(Ljava/util/Date;)Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
method.visitLabel(l5);
method.visitLineNumber(332, l5);
method.visitFrame(Opcodes.F_APPEND, 2, new Object[]{"java/lang/String", "net/minecraft/server/management/UserListBansEntry"}, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l1);
method.visitLineNumber(333, l1);
method.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/ServerConfigurationManager", "func_152607_e", "(Lcom/mojang/authlib/GameProfile;)Z", false);
Label l7 = new Label();
method.visitJumpInsn(Opcodes.IFNE, l7);
Label l8 = new Label();
method.visitLabel(l8);
method.visitLineNumber(334, l8);
method.visitLdcInsn("You are not white-listed on this server!");
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l7);
method.visitLineNumber(335, l7);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "bannedIPs", "Lnet/minecraft/server/management/BanList;");
method.visitVarInsn(Opcodes.ALOAD, 1);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/BanList", "func_152708_a", "(Ljava/net/SocketAddress;)Z", false);
Label l9 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l9);
Label l10 = new Label();
method.visitLabel(l10);
method.visitLineNumber(336, l10);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "bannedIPs", "Lnet/minecraft/server/management/BanList;");
method.visitVarInsn(Opcodes.ALOAD, 1);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/BanList", "func_152709_b", "(Ljava/net/SocketAddress;)Lnet/minecraft/server/management/IPBanEntry;", false);
method.visitVarInsn(Opcodes.ASTORE, 4);
Label l11 = new Label();
method.visitLabel(l11);
method.visitLineNumber(337, l11);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitLdcInsn("Your IP address is banned from this server!\nReason: ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/IPBanEntry", "getBanReason", "()Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
Label l12 = new Label();
method.visitLabel(l12);
method.visitLineNumber(339, l12);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/IPBanEntry", "getBanEndDate", "()Ljava/util/Date;", false);
Label l13 = new Label();
method.visitJumpInsn(Opcodes.IFNULL, l13);
Label l14 = new Label();
method.visitLabel(l14);
method.visitLineNumber(340, l14);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitLdcInsn("\nYour ban will be removed on ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "net/minecraft/server/management/ServerConfigurationManager", "dateFormat", "Ljava/text/SimpleDateFormat;");
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/management/IPBanEntry", "getBanEndDate", "()Ljava/util/Date;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/text/SimpleDateFormat", "format", "(Ljava/util/Date;)Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
method.visitLabel(l13);
method.visitLineNumber(343, l13);
method.visitFrame(Opcodes.F_APPEND, 2, new Object[]{"java/lang/String", "net/minecraft/server/management/IPBanEntry"}, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l9);
method.visitLineNumber(344, l9);
method.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKESTATIC, "pnmod/test/skills/server/authentication/AuthManager", "requestLogin", "(Lcom/mojang/authlib/GameProfile;)Lpnmod/test/skills/server/authentication/AuthResponse;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "pnmod/test/skills/server/authentication/AuthResponse", "getStatus", "()Lpnmod/test/skills/server/authentication/AuthRequestStatus;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "pnmod/test/skills/server/authentication/AuthRequestStatus", "CORRECT", "Lpnmod/test/skills/server/authentication/AuthRequestStatus;");
Label l15 = new Label();
method.visitJumpInsn(Opcodes.IF_ACMPEQ, l15);
Label l16 = new Label();
method.visitLabel(l16);
method.visitLineNumber(345, l16);
method.visitLdcInsn("Login not allowed!");
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l15);
method.visitLineNumber(347, l15);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "playerEntityList", "Ljava/util/List;");
method.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", true);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/management/ServerConfigurationManager", "maxPlayers", "I");
Label l17 = new Label();
method.visitJumpInsn(Opcodes.IF_ICMPLT, l17);
method.visitLdcInsn("The server is full!");
Label l18 = new Label();
method.visitJumpInsn(Opcodes.GOTO, l18);
method.visitLabel(l17);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitInsn(Opcodes.ACONST_NULL);
method.visitLabel(l18);
method.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/String"});
method.visitInsn(Opcodes.ARETURN);
Label l19 = new Label();
method.visitLabel(l19);
method.visitLocalVariable("userlistbansentry", "Lnet/minecraft/server/management/UserListBansEntry;", null, l3, l1, 4);
method.visitLocalVariable("s", "Ljava/lang/String;", null, l4, l1, 3);
method.visitLocalVariable("ipbanentry", "Lnet/minecraft/server/management/IPBanEntry;", null, l11, l9, 4);
method.visitLocalVariable("s", "Ljava/lang/String;", null, l12, l9, 3);
method.visitLocalVariable("this", "Lnet/minecraft/server/management/ServerConfigurationManager;", null, l0, l19, 0);
method.visitLocalVariable("p_148542_1_", "Ljava/net/SocketAddress;", null, l0, l19, 1);
method.visitLocalVariable("p_148542_2_", "Lcom/mojang/authlib/GameProfile;", null, l0, l19, 2);
method.visitMaxs(3, 5);
method.visitEnd();
}
}
}
protected void patchObfuscated(ClassNode classNode) {
for (MethodNode method : classNode.methods) {
String methodName = method.name;
if (methodName.equals("a") && method.desc.equals("(Ljava/net/SocketAddress;Lcom/mojang/authlib/GameProfile;)Ljava/lang/String;")) {
method.instructions.clear();
method.localVariables.clear();
method.visitCode();
Label l0 = new Label();
method.visitLabel(l0);
method.visitLineNumber(24, l0);
method.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
method.visitLdcInsn("*********** METHOD CALLED **********");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
Label l1 = new Label();
method.visitLabel(l1);
method.visitLineNumber(26, l1);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "j", "Lop;");
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "op", "a", "(Lcom/mojang/authlib/GameProfile;)Z", false);
Label l2 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l2);
Label l3 = new Label();
method.visitLabel(l3);
method.visitLineNumber(27, l3);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "j", "Lop;");
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "op", "b", "(Ljava/lang/Object;)Lol;", false);
method.visitTypeInsn(Opcodes.CHECKCAST, "oq");
method.visitVarInsn(Opcodes.ASTORE, 4);
Label l4 = new Label();
method.visitLabel(l4);
method.visitLineNumber(28, l4);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitLdcInsn("You are banned from this server!\nReason: ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "oq", "d", "()Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
Label l5 = new Label();
method.visitLabel(l5);
method.visitLineNumber(29, l5);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "oq", "c", "()Ljava/util/Date;", false);
Label l6 = new Label();
method.visitJumpInsn(Opcodes.IFNULL, l6);
Label l7 = new Label();
method.visitLabel(l7);
method.visitLineNumber(30, l7);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitLdcInsn("\nYour ban will be removed on ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "oi", "h", "Ljava/text/SimpleDateFormat;");
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "oq", "c", "()Ljava/util/Date;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/text/SimpleDateFormat", "format", "(Ljava/util/Date;)Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
method.visitLabel(l6);
method.visitLineNumber(33, l6);
method.visitFrame(Opcodes.F_APPEND, 2, new Object[]{"java/lang/String", "oq"}, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l2);
method.visitLineNumber(34, l2);
method.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "oi", "e", "(Lcom/mojang/authlib/GameProfile;)Z", false);
Label l8 = new Label();
method.visitJumpInsn(Opcodes.IFNE, l8);
Label l9 = new Label();
method.visitLabel(l9);
method.visitLineNumber(35, l9);
method.visitLdcInsn("You are not white-listed on this server!");
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l8);
method.visitLineNumber(36, l8);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "k", "Lnx;");
method.visitVarInsn(Opcodes.ALOAD, 1);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "nx", "a", "(Ljava/net/SocketAddress;)Z", false);
Label l10 = new Label();
method.visitJumpInsn(Opcodes.IFEQ, l10);
Label l11 = new Label();
method.visitLabel(l11);
method.visitLineNumber(37, l11);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "k", "Lnx;");
method.visitVarInsn(Opcodes.ALOAD, 1);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "nx", "b", "(Ljava/net/SocketAddress;)Lny;", false);
method.visitVarInsn(Opcodes.ASTORE, 4);
Label l12 = new Label();
method.visitLabel(l12);
method.visitLineNumber(38, l12);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitLdcInsn("Your IP address is banned from this server!\nReason: ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "ny", "d", "()Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
Label l13 = new Label();
method.visitLabel(l13);
method.visitLineNumber(39, l13);
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "ny", "c", "()Ljava/util/Date;", false);
Label l14 = new Label();
method.visitJumpInsn(Opcodes.IFNULL, l14);
Label l15 = new Label();
method.visitLabel(l15);
method.visitLineNumber(40, l15);
method.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
method.visitInsn(Opcodes.DUP);
method.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitLdcInsn("\nYour ban will be removed on ");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "oi", "h", "Ljava/text/SimpleDateFormat;");
method.visitVarInsn(Opcodes.ALOAD, 4);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "ny", "c", "()Ljava/util/Date;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/text/SimpleDateFormat", "format", "(Ljava/util/Date;)Ljava/lang/String;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
method.visitVarInsn(Opcodes.ASTORE, 3);
method.visitLabel(l14);
method.visitLineNumber(43, l14);
method.visitFrame(Opcodes.F_APPEND, 2, new Object[]{"java/lang/String", "ny"}, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 3);
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l10);
method.visitLineNumber(44, l10);
method.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 2);
method.visitMethodInsn(Opcodes.INVOKESTATIC, "pnmod/test/skills/server/authentication/AuthManager", "requestLogin", "(Lcom/mojang/authlib/GameProfile;)Lpnmod/test/skills/server/authentication/AuthResponse;", false);
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "pnmod/test/skills/server/authentication/AuthResponse", "getStatus", "()Lpnmod/test/skills/server/authentication/AuthRequestStatus;", false);
method.visitFieldInsn(Opcodes.GETSTATIC, "pnmod/test/skills/server/authentication/AuthRequestStatus", "CORRECT", "Lpnmod/test/skills/server/authentication/AuthRequestStatus;");
Label l16 = new Label();
method.visitJumpInsn(Opcodes.IF_ACMPEQ, l16);
Label l17 = new Label();
method.visitLabel(l17);
method.visitLineNumber(45, l17);
method.visitLdcInsn("Login not allowed!");
method.visitInsn(Opcodes.ARETURN);
method.visitLabel(l16);
method.visitLineNumber(47, l16);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "e", "Ljava/util/List;");
method.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", true);
method.visitVarInsn(Opcodes.ALOAD, 0);
method.visitFieldInsn(Opcodes.GETFIELD, "oi", "f", "I");
Label l18 = new Label();
method.visitJumpInsn(Opcodes.IF_ICMPLT, l18);
method.visitLdcInsn("The server is full!");
Label l19 = new Label();
method.visitJumpInsn(Opcodes.GOTO, l19);
method.visitLabel(l18);
method.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
method.visitInsn(Opcodes.ACONST_NULL);
method.visitLabel(l19);
method.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/String"});
method.visitInsn(Opcodes.ARETURN);
Label l20 = new Label();
method.visitLabel(l20);
method.visitLocalVariable("var5", "Loq;", null, l4, l2, 4);
method.visitLocalVariable("var4", "Ljava/lang/String;", null, l5, l2, 3);
method.visitLocalVariable("var3", "Lny;", null, l12, l10, 4);
method.visitLocalVariable("var4", "Ljava/lang/String;", null, l13, l10, 3);
method.visitLocalVariable("this", "Loi;", null, l0, l20, 0);
method.visitLocalVariable("var1", "Ljava/net/SocketAddress;", null, l0, l20, 1);
method.visitLocalVariable("var2", "Lcom/mojang/authlib/GameProfile;", null, l0, l20, 2);
method.visitMaxs(3, 5);
method.visitEnd();
}
}
}
}
Patcher:
public abstract class Patcher {
public final byte[] patch(byte[] bytecodeChunk, boolean obfuscated) {
ClassNode classNode = new ClassNode();
ClassReader reader = new ClassReader(bytecodeChunk);
reader.accept(classNode, ClassReader.EXPAND_FRAMES);
if (obfuscated)
patchObfuscated(classNode);
else patchNotObfuscated(classNode);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
classNode.accept(cw);
return cw.toByteArray();
}
protected abstract void patchObfuscated(ClassNode classNode);
protected abstract void patchNotObfuscated(ClassNode classNode);
}