From 84be2039c86a0bcaf9d7248b7bc5a67ceff9490f Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 21 Apr 2016 18:38:58 -0400 Subject: [PATCH] Add asm client version reader --- .../deob/clientver/ClientVersion.java | 44 +++++++++++++++++++ .../deob/clientver/VersionClassVisitor.java | 33 ++++++++++++++ .../deob/clientver/VersionMethodVisitor.java | 36 +++++++++++++++ .../deob/clientver/ClientVersionTest.java | 18 ++++++++ 4 files changed, 131 insertions(+) create mode 100644 src/main/java/net/runelite/deob/clientver/ClientVersion.java create mode 100644 src/main/java/net/runelite/deob/clientver/VersionClassVisitor.java create mode 100644 src/main/java/net/runelite/deob/clientver/VersionMethodVisitor.java create mode 100644 src/test/java/net/runelite/deob/clientver/ClientVersionTest.java diff --git a/src/main/java/net/runelite/deob/clientver/ClientVersion.java b/src/main/java/net/runelite/deob/clientver/ClientVersion.java new file mode 100644 index 0000000000..0b122d8e3c --- /dev/null +++ b/src/main/java/net/runelite/deob/clientver/ClientVersion.java @@ -0,0 +1,44 @@ +package net.runelite.deob.clientver; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import org.objectweb.asm.ClassReader; + +public class ClientVersion +{ + private File jar; + + public ClientVersion(File jar) + { + this.jar = jar; + } + + public int getVersion() throws IOException + { + try (JarFile jar = new JarFile(this.jar)) + { + for (Enumeration it = jar.entries(); it.hasMoreElements();) + { + JarEntry entry = it.nextElement(); + + if (!entry.getName().equals("client.class")) + continue; + + InputStream in = jar.getInputStream(entry); + + ClassReader reader = new ClassReader(in); + VersionClassVisitor v = new VersionClassVisitor(); + reader.accept(v, 0); + return v.getVersion(); + //entries.put(entry.getName(), entry); + } + } + + return -1; + } +} diff --git a/src/main/java/net/runelite/deob/clientver/VersionClassVisitor.java b/src/main/java/net/runelite/deob/clientver/VersionClassVisitor.java new file mode 100644 index 0000000000..2ef754c88a --- /dev/null +++ b/src/main/java/net/runelite/deob/clientver/VersionClassVisitor.java @@ -0,0 +1,33 @@ +package net.runelite.deob.clientver; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +public class VersionClassVisitor extends ClassVisitor +{ + private VersionMethodVisitor vmv = new VersionMethodVisitor(); + + public VersionClassVisitor() + { + super(Opcodes.ASM5); + } + + @Override + public MethodVisitor visitMethod(int access, + String name, + String desc, + String signature, + String[] exceptions) + { + if (!name.equals("init")) + return null; + + return vmv; + } + + public int getVersion() + { + return vmv.getVersion(); + } +} diff --git a/src/main/java/net/runelite/deob/clientver/VersionMethodVisitor.java b/src/main/java/net/runelite/deob/clientver/VersionMethodVisitor.java new file mode 100644 index 0000000000..18594090f8 --- /dev/null +++ b/src/main/java/net/runelite/deob/clientver/VersionMethodVisitor.java @@ -0,0 +1,36 @@ +package net.runelite.deob.clientver; + +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +public class VersionMethodVisitor extends MethodVisitor +{ + private int state = 0; + private int version = -1; + + VersionMethodVisitor() + { + super(Opcodes.ASM5); + } + + @Override + public void visitIntInsn(int opcode, int operand) + { + if (state == 2) + { + version = operand; + ++state; + } + + if (operand == 765 || operand == 503) + { + ++state; + return; + } + } + + public int getVersion() + { + return version; + } +} diff --git a/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java b/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java new file mode 100644 index 0000000000..75670bd675 --- /dev/null +++ b/src/test/java/net/runelite/deob/clientver/ClientVersionTest.java @@ -0,0 +1,18 @@ +package net.runelite.deob.clientver; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import org.junit.Test; + +public class ClientVersionTest +{ + @Test + public void test() throws IOException, URISyntaxException + { + File f = new File(ClientVersionTest.class.getResource("/gamepack_v21.jar").toURI()); + ClientVersion ver = new ClientVersion(f); + System.out.println(ver.getVersion()); + } + +}