From 7fda7ebecd9e7cce84c9e3760f35b6714533caac Mon Sep 17 00:00:00 2001 From: Zaxar163 Date: Fri, 11 Oct 2019 07:23:15 +0200 Subject: [PATCH] =?UTF-8?q?[FEATURE]=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=B0=D0=B3=D0=B5=D0=BD=D1=82...=20=D0=9F=D0=B0=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BC=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=B6=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20SM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/gravit/launcher/LauncherAgent.java | 8 ++-- .../gravit/launcher/patches/FMLPatcher.java | 41 +++++++++++++++++++ .../gravit/launcher/utils/NativeJVMHalt.java | 7 +--- .../java/cpw/mods/fml/SafeExitJVMLegacy.java | 11 ----- .../net/minecraftforge/fml/SafeExitJVM.java | 11 ----- 5 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 Launcher/src/main/java/pro/gravit/launcher/patches/FMLPatcher.java delete mode 100644 LauncherAuthlib/src/main/java/cpw/mods/fml/SafeExitJVMLegacy.java delete mode 100644 LauncherAuthlib/src/main/java/net/minecraftforge/fml/SafeExitJVM.java 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); - } -}