diff --git a/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java b/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java index 317bd48a..a86ac483 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java +++ b/Launcher/src/main/java/pro/gravit/launcher/LauncherAgent.java @@ -6,6 +6,8 @@ import java.nio.file.Path; import java.util.jar.JarFile; +import pro.gravit.launcher.patches.FMLPatcher; +import pro.gravit.launcher.utils.NativeJVMHalt; import pro.gravit.utils.helper.LogHelper; @LauncherAPI @@ -31,10 +33,8 @@ public static void premain(String agentArgument, Instrumentation instrumentation System.out.println("Launcher Agent"); checkAgentStacktrace(); inst = instrumentation; - //SafeExitJVMLegacy.class.getName(); - //SafeExitJVM.class.getName(); - //NativeJVMHalt.class.getName(); - //NativeJVMHalt.initFunc(); + NativeJVMHalt.initFunc(); + FMLPatcher.apply(); isAgentStarted = true; } public static void checkAgentStacktrace() diff --git a/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java b/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java new file mode 100644 index 00000000..3b1a7b77 --- /dev/null +++ b/Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java @@ -0,0 +1,41 @@ +package pro.gravit.launcher.patches; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.security.ProtectionDomain; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.MethodNode; + +import pro.gravit.launcher.LauncherAgent; + +public class FMLPatcher implements ClassFileTransformer { + @Override + public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { + try { + if (className.startsWith("java") || className.startsWith("sun") || className.startsWith("com/sun") || className.startsWith("javafx")) return classfileBuffer; + ClassReader cr = new ClassReader(classfileBuffer); + if ("java/lang/SecurityManager".equals(cr.getSuperName()) && (className.contains("cpw") || className.contains("mods") || className.contains("forge"))) { + ClassNode cn = new ClassNode(); + cr.accept(cn, ClassReader.EXPAND_FRAMES); + for (MethodNode m : cn.methods) + if (m.name.equals("checkPermission") && m.desc.equals("(Ljava/lang/String;)V")) { + m.instructions.clear(); + m.instructions.insert(new InsnNode(Opcodes.RETURN)); + } + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + cn.accept(cw); + return cw.toByteArray(); + } + } catch (Throwable e) { } + return classfileBuffer; + } + public static void apply() { + LauncherAgent.inst.addTransformer(new FMLPatcher()); + } +} diff --git a/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java b/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java index 14fa7a04..e7048c1a 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java +++ b/Launcher/src/main/java/pro/gravit/launcher/utils/NativeJVMHalt.java @@ -2,6 +2,7 @@ import cpw.mods.fml.SafeExitJVMLegacy; import net.minecraftforge.fml.SafeExitJVM; +import pro.gravit.utils.helper.JVMHelper; public final class NativeJVMHalt { public NativeJVMHalt(int haltCode) { @@ -21,11 +22,7 @@ private boolean aaabBooleanC_D() { public static void haltA(int code) { NativeJVMHalt halt = new NativeJVMHalt(code); try { - SafeExitJVMLegacy.exit(code); - } catch (Throwable ignored) { - } - try { - SafeExitJVM.exit(code); + JVMHelper.RUNTIME.exit(code); } catch (Throwable ignored) { } halt.aaabbb38C_D(); diff --git a/LauncherAuthlib/src/main/java/cpw/mods/fml/SafeExitJVMLegacy.java b/LauncherAuthlib/src/main/java/cpw/mods/fml/SafeExitJVMLegacy.java deleted file mode 100644 index 76673b94..00000000 --- a/LauncherAuthlib/src/main/java/cpw/mods/fml/SafeExitJVMLegacy.java +++ /dev/null @@ -1,11 +0,0 @@ -package cpw.mods.fml; - -import pro.gravit.utils.helper.JVMHelper; - -// FMLSecurityManager запрещает делать System.exit из классов -// Не входящих в пакеты самого Forge -public class SafeExitJVMLegacy { - public static void exit(int code) { - JVMHelper.RUNTIME.halt(code); - } -} diff --git a/LauncherAuthlib/src/main/java/net/minecraftforge/fml/SafeExitJVM.java b/LauncherAuthlib/src/main/java/net/minecraftforge/fml/SafeExitJVM.java deleted file mode 100644 index 448ff164..00000000 --- a/LauncherAuthlib/src/main/java/net/minecraftforge/fml/SafeExitJVM.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.minecraftforge.fml; - -import pro.gravit.utils.helper.JVMHelper; - -// FMLSecurityManager запрещает делать System.exit из классов -// Не входящих в пакеты самого Forge -public class SafeExitJVM { - public static void exit(int code) { - JVMHelper.RUNTIME.halt(code); - } -}