From d2cfb88ad5fd8333ed3db919baa09214ef6795b2 Mon Sep 17 00:00:00 2001 From: Parnassian Date: Fri, 1 May 2015 16:41:04 +0200 Subject: [PATCH 1/6] RefMethod invoke fix --- parabotv2/src/org/parabot/core/reflect/RefMethod.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parabotv2/src/org/parabot/core/reflect/RefMethod.java b/parabotv2/src/org/parabot/core/reflect/RefMethod.java index 752669e..2c3aac8 100644 --- a/parabotv2/src/org/parabot/core/reflect/RefMethod.java +++ b/parabotv2/src/org/parabot/core/reflect/RefMethod.java @@ -130,6 +130,9 @@ public class RefMethod extends RefModifiers { throw new IllegalStateException( "Can not invoke non static method without an instance."); } + if(!isAccessible()) { + method.setAccessible(true); + } try { Object retObject = method.invoke(instance, args); return retObject; From ca709add18a6e8dca7bfb11d0d9658cc9df7cba4 Mon Sep 17 00:00:00 2001 From: Parnassian Date: Sun, 3 May 2015 00:07:58 +0200 Subject: [PATCH 2/6] Toggable logger --- parabotv2/src/org/parabot/core/ui/BotUI.java | 8 ++++++ parabotv2/src/org/parabot/core/ui/Logger.java | 26 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/parabotv2/src/org/parabot/core/ui/BotUI.java b/parabotv2/src/org/parabot/core/ui/BotUI.java index a5cee74..3a11479 100644 --- a/parabotv2/src/org/parabot/core/ui/BotUI.java +++ b/parabotv2/src/org/parabot/core/ui/BotUI.java @@ -74,6 +74,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, JMenuItem proxy = new JMenuItem("Network"); JMenuItem randoms = new JMenuItem("Randoms"); JMenuItem dialog = new JCheckBoxMenuItem("Disable dialog"); + JMenuItem logger = new JCheckBoxMenuItem("Logger"); JMenuItem api = new JMenuItem("Set API key"); @@ -99,6 +100,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, proxy.addActionListener(this); randoms.addActionListener(this); dialog.addActionListener(this); + logger.addActionListener(this); explorer.addActionListener(this); exit.addActionListener(this); @@ -111,6 +113,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, file.add(proxy); file.add(randoms); file.add(dialog); + file.add(logger); file.add(explorer); file.add(exit); @@ -171,6 +174,11 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, case "Stop": setScriptState(Script.STATE_STOPPED); break; + case "Logger": + Logger.getInstance().setVisible(!Logger.getInstance().isVisible()); + BotUI.getInstance().pack(); + BotUI.getInstance().revalidate(); + break; case "Disable dialog": BotDialog.getInstance().setVisible(!dialog.isVisible()); break; diff --git a/parabotv2/src/org/parabot/core/ui/Logger.java b/parabotv2/src/org/parabot/core/ui/Logger.java index fb44234..6b67b44 100644 --- a/parabotv2/src/org/parabot/core/ui/Logger.java +++ b/parabotv2/src/org/parabot/core/ui/Logger.java @@ -1,16 +1,28 @@ package org.parabot.core.ui; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ListCellRenderer; + import org.parabot.core.Context; import org.parabot.core.ui.components.GamePanel; -import javax.swing.*; -import java.awt.*; - /** * @author JKetelaar */ public class Logger extends JPanel { - private static Logger instance; + private static final long serialVersionUID = 1L; + private static Logger instance; private final DefaultListModel model; private Logger(){ @@ -26,11 +38,15 @@ public class Logger extends JPanel { list.setModel(model); setPreferredSize(new Dimension((int) GamePanel.getInstance().getPreferredSize().getWidth(), 150)); model.addElement("Logger started"); + + setVisible(false); } private ListCellRenderer getRenderer() { return new DefaultListCellRenderer(){ - @Override + private static final long serialVersionUID = -3589192791360628745L; + + @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { From cacbf02b61cbbf40ab37a32e740ba3549ad7a17f Mon Sep 17 00:00:00 2001 From: Parnassian Date: Sun, 3 May 2015 00:10:31 +0200 Subject: [PATCH 3/6] Resources dump support --- .../src/org/parabot/core/asm/ASMClassLoader.java | 8 +++++++- .../src/org/parabot/core/classpath/ClassPath.java | 13 ++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/parabotv2/src/org/parabot/core/asm/ASMClassLoader.java b/parabotv2/src/org/parabot/core/asm/ASMClassLoader.java index b72c10c..c7d03c0 100644 --- a/parabotv2/src/org/parabot/core/asm/ASMClassLoader.java +++ b/parabotv2/src/org/parabot/core/asm/ASMClassLoader.java @@ -5,6 +5,7 @@ import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; import org.parabot.core.classpath.ClassPath; +import java.net.MalformedURLException; import java.net.URL; import java.security.AllPermission; import java.security.CodeSource; @@ -36,7 +37,12 @@ public class ASMClassLoader extends ClassLoader { protected URL findResource(String name) { if (getSystemResource(name) == null) { if (classPath.resources.containsKey(name)) { - return classPath.resources.get(name); + try { + return classPath.resources.get(name).toURI().toURL(); + } catch (MalformedURLException e) { + e.printStackTrace(); + return null; + } } else { return null; } diff --git a/parabotv2/src/org/parabot/core/classpath/ClassPath.java b/parabotv2/src/org/parabot/core/classpath/ClassPath.java index 9e34957..01e5eec 100644 --- a/parabotv2/src/org/parabot/core/classpath/ClassPath.java +++ b/parabotv2/src/org/parabot/core/classpath/ClassPath.java @@ -10,9 +10,11 @@ import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; @@ -38,7 +40,7 @@ import org.parabot.core.ui.components.VerboseLoader; public class ClassPath { public final ArrayList classNames; public final HashMap classes; - public final Map resources; + public final Map resources; public URL lastParsed; private ClassRemapper classRemapper; private boolean isJar; @@ -53,7 +55,7 @@ public class ClassPath { public ClassPath(final boolean isJar) { this.classNames = new ArrayList(); this.classes = new HashMap(); - this.resources = new HashMap(); + this.resources = new HashMap(); this.classRemapper = new ClassRemapper(); this.parseJar = true; this.jarFiles = new ArrayList(); @@ -247,7 +249,7 @@ public class ClassPath { out.write(buffer, 0, len); } catch (IOException e) { } - this.resources.put(name, f.toURI().toURL()); + this.resources.put(name, f); } /** @@ -293,6 +295,11 @@ public class ClassPath { cn.accept(cw); out.write(cw.toByteArray()); } + for(Entry entry : this.resources.entrySet()) { + JarEntry je = new JarEntry(entry.getKey()); + out.putNextEntry(je); + out.write(Files.readAllBytes(entry.getValue().toPath())); + } out.close(); stream.close(); } catch (Exception e) { From cb857fd8b96d265bd563bce03e9f4a93cc3950bf Mon Sep 17 00:00:00 2001 From: Parnassian Date: Sun, 3 May 2015 00:12:06 +0200 Subject: [PATCH 4/6] support for conditional return with methods that return a boolean + constructor callback support --- .../core/asm/adapters/AddCallbackAdapter.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/parabotv2/src/org/parabot/core/asm/adapters/AddCallbackAdapter.java b/parabotv2/src/org/parabot/core/asm/adapters/AddCallbackAdapter.java index 3952575..2159b7e 100644 --- a/parabotv2/src/org/parabot/core/asm/adapters/AddCallbackAdapter.java +++ b/parabotv2/src/org/parabot/core/asm/adapters/AddCallbackAdapter.java @@ -5,6 +5,7 @@ import java.lang.reflect.Modifier; import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.JumpInsnNode; @@ -67,10 +68,31 @@ public class AddCallbackAdapter implements Injectable, Opcodes { if(this.conditional) { LabelNode ln = new LabelNode(new Label()); inject.add(new JumpInsnNode(IFEQ, ln)); - inject.add(new InsnNode(RETURN)); + if(Type.getReturnType(method.desc).equals(Type.BOOLEAN_TYPE)) { + inject.add(new InsnNode(ICONST_1)); + inject.add(new InsnNode(IRETURN)); + } else { + inject.add(new InsnNode(RETURN)); + } inject.add(ln); } - this.method.instructions.insert(inject); + + if(method.name.startsWith("<") && !Modifier.isStatic(method.access)) { + // find target + AbstractInsnNode target = null; + for(AbstractInsnNode node : this.method.instructions.toArray()) { + if(node.getOpcode() == Opcodes.INVOKESPECIAL) { + target = node; + break; + } + } + + if(target != null) { + this.method.instructions.insert(target, inject); + } + } else { + this.method.instructions.insert(inject); + } } } From 75f223ef5e954b406224b1e4621d91f1b8727885 Mon Sep 17 00:00:00 2001 From: Parnassian Date: Sun, 3 May 2015 00:12:41 +0200 Subject: [PATCH 5/6] different debug adapter --- .../core/asm/adapters/AddDebugAdapter.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/parabotv2/src/org/parabot/core/asm/adapters/AddDebugAdapter.java b/parabotv2/src/org/parabot/core/asm/adapters/AddDebugAdapter.java index beb4dce..ec4d68d 100644 --- a/parabotv2/src/org/parabot/core/asm/adapters/AddDebugAdapter.java +++ b/parabotv2/src/org/parabot/core/asm/adapters/AddDebugAdapter.java @@ -1,33 +1,43 @@ package org.parabot.core.asm.adapters; +import org.objectweb.asm.Label; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.InsnList; -import org.objectweb.asm.tree.IntInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class AddDebugAdapter { + private ClassNode owner; private MethodNode mn; + public AddDebugAdapter(ClassNode owner, MethodNode mn) { + this.owner = owner; + this.mn = mn; + } + public AddDebugAdapter(MethodNode mn) { this.mn = mn; } public void inject() { + InsnList inject = new InsnList(); + Label l0 = new Label(); + inject.add(new LabelNode(l0)); + + String callString = owner.name + "." + mn.name + " " + mn.desc; + LdcInsnNode ldc = new LdcInsnNode(callString); + + MethodInsnNode methodNode = new MethodInsnNode(Opcodes.INVOKESTATIC, "org/parabot/core/Core", "debug", + "(Ljava/lang/String;)V"); + + inject.add(ldc); + inject.add(methodNode); + + mn.instructions.insert(inject); - int i = 20; - for(AbstractInsnNode node : mn.instructions.toArray().clone()) { - if(node.getType() == AbstractInsnNode.METHOD_INSN || node.getOpcode() == Opcodes.PUTFIELD || node.getOpcode() == Opcodes.ASTORE || node.getOpcode() == Opcodes.ISTORE) { - i++; - InsnList inject = new InsnList(); - inject.add(new IntInsnNode(Opcodes.BIPUSH, i)); - inject.add(new MethodInsnNode(Opcodes.INVOKESTATIC, - "org/parabot/core/Core", "debug", - "(I)V")); - mn.instructions.insertBefore(node.getNext(), inject); - } - } } } From df6a9d3ae626201a901324732b997e6c00cf9b7b Mon Sep 17 00:00:00 2001 From: Parnassian Date: Sun, 3 May 2015 00:16:17 +0200 Subject: [PATCH 6/6] Context support for manual setting applet with serverprovider --- parabotv2/src/org/parabot/core/Context.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/parabotv2/src/org/parabot/core/Context.java b/parabotv2/src/org/parabot/core/Context.java index d079e22..ed60582 100644 --- a/parabotv2/src/org/parabot/core/Context.java +++ b/parabotv2/src/org/parabot/core/Context.java @@ -171,10 +171,24 @@ public class Context { classPath.dump(new File(Directories.getWorkspace(), "dump.jar")); Core.verbose("Done."); } - gameApplet = serverProvider.fetchApplet(); - if (getClient() == null) { + Applet applet = serverProvider.fetchApplet(); + // if applet is null the server provider will call setApplet itself + if(applet != null) { + setApplet(applet); + } + } + + /** + * Sets the bot target applet + * @param applet + */ + public void setApplet(final Applet applet) { + gameApplet = applet; + + if (getClient() == null) { setClientInstance(gameApplet); } + Core.verbose("Applet fetched."); final GamePanel panel = GamePanel.getInstance();