Change how I load asm
This commit is contained in:
		| @@ -1,42 +1,17 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection.asm; | ||||
|  | ||||
| import lombok.Getter; | ||||
| import org.objectweb.asm.*; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Modifier; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 17/02/2020. | ||||
|  */ | ||||
| public class Asm13 implements IAsm { | ||||
|     @Getter | ||||
|     private final LibsJarFile libsJarFile; | ||||
|  | ||||
|     public Asm13() throws Throwable { | ||||
|         ClassLoader pluginClassLoader = getClass().getClassLoader(); | ||||
|         Class c = Class.forName("org.bukkit.plugin.java.PluginClassLoader"); | ||||
|         Field file = c.getDeclaredField("file"); | ||||
|         file.setAccessible(true); | ||||
|  | ||||
|         libsJarFile = new LibsJarFile((File) file.get(pluginClassLoader)); | ||||
|  | ||||
|         Field field = c.getDeclaredField("jar"); | ||||
|         field.setAccessible(true); | ||||
|  | ||||
|         Field modifiersField = Field.class.getDeclaredField("modifiers"); | ||||
|         modifiersField.setAccessible(true); | ||||
|         modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); | ||||
|  | ||||
|         field.set(pluginClassLoader, libsJarFile); | ||||
|     } | ||||
|  | ||||
|     public void createClassWithoutMethods(String className, ArrayList<Map.Entry<String, String>> illegalMethods) | ||||
| public class Asm13 { | ||||
|     public byte[] createClassWithoutMethods(String className, ArrayList<Map.Entry<String, String>> illegalMethods) | ||||
|             throws IOException, InvocationTargetException, IllegalAccessException, NoSuchFieldException { | ||||
|         className = className.replace(".", "/") + ".class"; | ||||
|  | ||||
| @@ -57,6 +32,6 @@ public class Asm13 implements IAsm { | ||||
|             } | ||||
|         }, 0); | ||||
|  | ||||
|         libsJarFile.addClass(className, writer.toByteArray()); | ||||
|         return writer.toByteArray(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,77 +0,0 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection.asm; | ||||
|  | ||||
| import lombok.AccessLevel; | ||||
| import lombok.Getter; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| import java.io.BufferedInputStream; | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Method; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 20/02/2020. | ||||
|  */ | ||||
| @Getter(value = AccessLevel.PRIVATE) | ||||
| public class AsmDownloader { | ||||
|     //   private String urlToGrab = "https://repository.ow2.org/nexus/content/repositories/releases/org/ow2/asm/asm/7 | ||||
|     //   .3" + | ||||
|     //          ".1/asm-7.3.1.jar"; | ||||
|     /** | ||||
|      * Using maven | ||||
|      */ | ||||
|     private String urlToGrab = "https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm/9.1/asm-9.1.jar"; | ||||
|     private File filePath = new File(LibsDisguises.getInstance().getDataFolder(), "libs/org-ow2-asm-9.1.jar"); | ||||
|  | ||||
|     public AsmDownloader() { | ||||
|         try { | ||||
|             Class.forName("org.objectweb.asm.ClassReader"); | ||||
|             return; | ||||
|         } | ||||
|         catch (NoClassDefFoundError | ClassNotFoundException ex) { | ||||
|             // It doesn't exist, good! Lets load it! | ||||
|         } | ||||
|  | ||||
|         if (!hasASM()) { | ||||
|             LibsDisguises.getInstance().getLogger().info("Downloading required library for asm!"); | ||||
|  | ||||
|             downloadASM(); | ||||
|  | ||||
|             LibsDisguises.getInstance().getLogger().info("Downloaded!"); | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); | ||||
|             method.setAccessible(true); | ||||
|             method.invoke(getClass().getClassLoader(), filePath.toURI().toURL()); | ||||
|         } | ||||
|         catch (Throwable t) { | ||||
|             t.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private boolean hasASM() { | ||||
|         return filePath.exists(); | ||||
|     } | ||||
|  | ||||
|     private void downloadASM() { | ||||
|         filePath.getParentFile().mkdirs(); | ||||
|  | ||||
|         try (BufferedInputStream in = new BufferedInputStream( | ||||
|                 new URL(getUrlToGrab()).openStream()); FileOutputStream fileOutputStream = new FileOutputStream( | ||||
|                 getFilePath())) { | ||||
|             byte[] dataBuffer = new byte[1024]; | ||||
|             int bytesRead; | ||||
|             while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { | ||||
|                 fileOutputStream.write(dataBuffer, 0, bytesRead); | ||||
|             } | ||||
|         } | ||||
|         catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,108 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection.asm; | ||||
|  | ||||
| import lombok.Getter; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
|  | ||||
| import java.io.BufferedInputStream; | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.Modifier; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 20/02/2020. | ||||
|  */ | ||||
| @Getter | ||||
| public class AsmLoader { | ||||
|     //   private String urlToGrab = "https://repository.ow2.org/nexus/content/repositories/releases/org/ow2/asm/asm/7 | ||||
|     //   .3" + | ||||
|     //          ".1/asm-7.3.1.jar"; | ||||
|     /** | ||||
|      * Using maven | ||||
|      */ | ||||
|     private final String urlToGrab = "https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm/9.1/asm-9.1.jar"; | ||||
|     private final File filePath = new File(LibsDisguises.getInstance().getDataFolder(), "libs/org-ow2-asm-9.1.jar"); | ||||
|     private boolean asmExists; | ||||
|     private URLClassLoader classLoader; | ||||
|     private LibsJarFile libsJarFile; | ||||
|  | ||||
|     public AsmLoader() { | ||||
|         try { | ||||
|             Class.forName("org.objectweb.asm.ClassReader"); | ||||
|             asmExists = true; | ||||
|         } catch (NoClassDefFoundError | ClassNotFoundException ex) { | ||||
|             // It doesn't exist, good! Lets load it! | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void loadClassloader() { | ||||
|         try { | ||||
|             classLoader = URLClassLoader.newInstance(new URL[]{filePath.toURI().toURL(), LibsDisguises.getInstance().getFile().toURI().toURL()}); | ||||
|         } catch (MalformedURLException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void load() { | ||||
|         try { | ||||
|             ClassLoader pluginClassLoader = getClass().getClassLoader(); | ||||
|             Class c = Class.forName("org.bukkit.plugin.java.PluginClassLoader"); | ||||
|             Field file = c.getDeclaredField("file"); | ||||
|             file.setAccessible(true); | ||||
|  | ||||
|             libsJarFile = new LibsJarFile((File) file.get(pluginClassLoader)); | ||||
|  | ||||
|             Field field = c.getDeclaredField("jar"); | ||||
|             field.setAccessible(true); | ||||
|  | ||||
|             Field modifiersField = Field.class.getDeclaredField("modifiers"); | ||||
|             modifiersField.setAccessible(true); | ||||
|             modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); | ||||
|  | ||||
|             field.set(pluginClassLoader, libsJarFile); | ||||
|         } catch (Throwable e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void unload() { | ||||
|         try { | ||||
|             classLoader.close(); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void doDownloadIfRequired() { | ||||
|         if (!hasASM()) { | ||||
|             LibsDisguises.getInstance().getLogger().info("Downloading required library for asm!"); | ||||
|  | ||||
|             downloadASM(); | ||||
|  | ||||
|             LibsDisguises.getInstance().getLogger().info("Downloaded!"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private boolean hasASM() { | ||||
|         return filePath.exists(); | ||||
|     } | ||||
|  | ||||
|     private void downloadASM() { | ||||
|         filePath.getParentFile().mkdirs(); | ||||
|  | ||||
|         try (BufferedInputStream in = new BufferedInputStream(new URL(getUrlToGrab()).openStream()); | ||||
|              FileOutputStream fileOutputStream = new FileOutputStream(getFilePath())) { | ||||
|             byte[] dataBuffer = new byte[1024]; | ||||
|             int bytesRead; | ||||
|             while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { | ||||
|                 fileOutputStream.write(dataBuffer, 0, bytesRead); | ||||
|             } | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection.asm; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 17/02/2020. | ||||
|  */ | ||||
| public interface IAsm { | ||||
|     void createClassWithoutMethods(String className, | ||||
|             ArrayList<Map.Entry<String, String>> illegalMethods) throws IOException, InvocationTargetException, | ||||
|             IllegalAccessException, NoSuchMethodException, NoSuchFieldException; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -5,7 +5,6 @@ import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.util.HashMap; | ||||
| import java.util.jar.JarEntry; | ||||
| import java.util.jar.JarFile; | ||||
| import java.util.zip.ZipEntry; | ||||
|  | ||||
|   | ||||
| @@ -2,15 +2,13 @@ package me.libraryaddict.disguise.utilities.reflection.asm; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import org.bukkit.plugin.PluginDescriptionFile; | ||||
| import org.bukkit.plugin.java.JavaPluginLoader; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.*; | ||||
|  | ||||
| @@ -75,8 +73,22 @@ public class WatcherSanitizer { | ||||
|         ArrayList<String> mapped = new ArrayList<>(); | ||||
|  | ||||
|         try (InputStream stream = LibsDisguises.getInstance().getResource("ANTI_PIRACY_ENCRYPTION")) { | ||||
|             new AsmDownloader(); | ||||
|             IAsm asm = new Asm13(); | ||||
|             AsmLoader loader = new AsmLoader(); | ||||
|             loader.load(); | ||||
|  | ||||
|             Object obj; | ||||
|             Method getBytes; | ||||
|  | ||||
|             if (!loader.isAsmExists()) { | ||||
|                 loader.doDownloadIfRequired(); | ||||
|                 loader.loadClassloader(); | ||||
|  | ||||
|                 obj = Class.forName("me.libraryaddict.disguise.utilities.reflection.asm.Asm13", true, loader.getClassLoader()).newInstance(); | ||||
|             } else { | ||||
|                 obj = new Asm13(); | ||||
|             } | ||||
|  | ||||
|             getBytes = obj.getClass().getMethod("createClassWithoutMethods", String.class, ArrayList.class); | ||||
|  | ||||
|             String[] lines = new String(ReflectionManager.readFully(stream), StandardCharsets.UTF_8).split("\n"); | ||||
|  | ||||
| @@ -99,8 +111,16 @@ public class WatcherSanitizer { | ||||
|             } | ||||
|  | ||||
|             for (Map.Entry<String, ArrayList<Map.Entry<String, String>>> entry : toRemove.entrySet()) { | ||||
|                 asm.createClassWithoutMethods(entry.getKey(), entry.getValue()); | ||||
|                 byte[] bytes = (byte[]) getBytes.invoke(obj, entry.getKey(), entry.getValue()); | ||||
|                 mapped.add(entry.getKey()); | ||||
|  | ||||
|                 String name = entry.getKey().replace(".", "/") + ".class"; | ||||
|  | ||||
|                 loader.getLibsJarFile().addClass(name, bytes); | ||||
|             } | ||||
|  | ||||
|             if (!loader.isAsmExists()) { | ||||
|                 loader.unload(); | ||||
|             } | ||||
|         } catch (Throwable e) { | ||||
|             e.printStackTrace(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user