From 41681f94a54e0d42399aa633cb70a0e69b0cf7d7 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 30 Nov 2014 20:35:37 -0500 Subject: [PATCH] init of deob --- pom.xml | 6 ++ .../java/info/sigterm/deob/Attributes.java | 98 +++++++++++++++++++ .../java/info/sigterm/deob/ClassFile.java | 57 +++++++++++ .../java/info/sigterm/deob/ConstantPool.java | 61 ++++++++++++ src/main/java/info/sigterm/deob/Deob.java | 26 +++++ src/main/java/info/sigterm/deob/Field.java | 31 ++++++ src/main/java/info/sigterm/deob/Fields.java | 30 ++++++ .../java/info/sigterm/deob/Interfaces.java | 25 +++++ src/main/java/info/sigterm/deob/Method.java | 31 ++++++ src/main/java/info/sigterm/deob/Methods.java | 30 ++++++ .../sigterm/deob/attributes/Attribute.java | 32 ++++++ .../deob/attributes/AttributeType.java | 36 +++++++ .../info/sigterm/deob/attributes/Code.java | 31 ++++++ .../deob/attributes/ConstantValue.java | 19 ++++ .../info/sigterm/deob/attributes/Unknown.java | 34 +++++++ .../deob/attributes/code/Exception.java | 26 +++++ .../deob/attributes/code/Exceptions.java | 30 ++++++ .../java/info/sigterm/deob/pool/Class.java | 19 ++++ .../info/sigterm/deob/pool/ConstantType.java | 43 ++++++++ .../java/info/sigterm/deob/pool/Double.java | 26 +++++ .../java/info/sigterm/deob/pool/Field.java | 22 +++++ .../java/info/sigterm/deob/pool/Float.java | 20 ++++ .../java/info/sigterm/deob/pool/Integer.java | 20 ++++ .../sigterm/deob/pool/InterfaceMethod.java | 22 +++++ .../java/info/sigterm/deob/pool/Long.java | 26 +++++ .../java/info/sigterm/deob/pool/Method.java | 22 +++++ .../info/sigterm/deob/pool/NameAndType.java | 22 +++++ .../info/sigterm/deob/pool/PoolEntry.java | 20 ++++ .../java/info/sigterm/deob/pool/String.java | 20 ++++ .../java/info/sigterm/deob/pool/UTF8.java | 48 +++++++++ 30 files changed, 933 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/info/sigterm/deob/Attributes.java create mode 100644 src/main/java/info/sigterm/deob/ClassFile.java create mode 100644 src/main/java/info/sigterm/deob/ConstantPool.java create mode 100644 src/main/java/info/sigterm/deob/Deob.java create mode 100644 src/main/java/info/sigterm/deob/Field.java create mode 100644 src/main/java/info/sigterm/deob/Fields.java create mode 100644 src/main/java/info/sigterm/deob/Interfaces.java create mode 100644 src/main/java/info/sigterm/deob/Method.java create mode 100644 src/main/java/info/sigterm/deob/Methods.java create mode 100644 src/main/java/info/sigterm/deob/attributes/Attribute.java create mode 100644 src/main/java/info/sigterm/deob/attributes/AttributeType.java create mode 100644 src/main/java/info/sigterm/deob/attributes/Code.java create mode 100644 src/main/java/info/sigterm/deob/attributes/ConstantValue.java create mode 100644 src/main/java/info/sigterm/deob/attributes/Unknown.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/Exception.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/Exceptions.java create mode 100644 src/main/java/info/sigterm/deob/pool/Class.java create mode 100644 src/main/java/info/sigterm/deob/pool/ConstantType.java create mode 100644 src/main/java/info/sigterm/deob/pool/Double.java create mode 100644 src/main/java/info/sigterm/deob/pool/Field.java create mode 100644 src/main/java/info/sigterm/deob/pool/Float.java create mode 100644 src/main/java/info/sigterm/deob/pool/Integer.java create mode 100644 src/main/java/info/sigterm/deob/pool/InterfaceMethod.java create mode 100644 src/main/java/info/sigterm/deob/pool/Long.java create mode 100644 src/main/java/info/sigterm/deob/pool/Method.java create mode 100644 src/main/java/info/sigterm/deob/pool/NameAndType.java create mode 100644 src/main/java/info/sigterm/deob/pool/PoolEntry.java create mode 100644 src/main/java/info/sigterm/deob/pool/String.java create mode 100644 src/main/java/info/sigterm/deob/pool/UTF8.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..3b908961f2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,6 @@ + + 4.0.0 + info.sigterm + deob + 0.0.1-SNAPSHOT + \ No newline at end of file diff --git a/src/main/java/info/sigterm/deob/Attributes.java b/src/main/java/info/sigterm/deob/Attributes.java new file mode 100644 index 0000000000..5e34bbba53 --- /dev/null +++ b/src/main/java/info/sigterm/deob/Attributes.java @@ -0,0 +1,98 @@ +package info.sigterm.deob; + +import info.sigterm.deob.attributes.Attribute; +import info.sigterm.deob.attributes.AttributeType; +import info.sigterm.deob.attributes.Code; +import info.sigterm.deob.pool.UTF8; + +import java.io.DataInputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; + +public class Attributes +{ + private ClassFile classFile; + private Field field; + private Method method; + private Code code; + + private int count; + private Attribute[] attributes; + + Attributes(ClassFile cf) throws IOException + { + classFile = cf; + + load(); + } + + Attributes(Field f) throws IOException + { + field = f; + + load(); + } + + Attributes(Method m) throws IOException + { + method = m; + + load(); + } + + public Attributes(Code c) throws IOException + { + code = c; + + load(); + } + + public ClassFile getClassFile() + { + if (classFile != null) + return classFile; + + if (field != null) + return field.getFields().getClassFile(); + + if (method != null) + return method.getMethods().getClassFile(); + + if (code != null) + return code.getAttributes().getClassFile(); + + return null; + } + + public DataInputStream getStream() + { + return getClassFile().getStream(); + } + + private void load() throws IOException + { + DataInputStream is = getStream(); + + count = is.readUnsignedShort(); + attributes = new Attribute[count]; + + for (int i = 0; i < count; ++i) + { + int nameIndex = is.readUnsignedShort(); + UTF8 name = (UTF8) getClassFile().getPool().getEntry(nameIndex); + + AttributeType type = AttributeType.findType(name.getValue()); + try + { + Constructor con = type.getAttributeClass().getConstructor(new Class[] { Attributes.class }); + Attribute attr = con.newInstance(this); + + attributes[i] = attr; + } + catch (Exception ex) + { + throw new IOException(ex); + } + } + } +} diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java new file mode 100644 index 0000000000..69111d76cb --- /dev/null +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -0,0 +1,57 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +public class ClassFile +{ + private int magic; + private short minor_version; + private short major_version; + private ConstantPool pool; + private short access_flags; + private int this_class; + private int super_class; + private Interfaces interfaces; + private Fields fields; + private Methods methods; + private Attributes attributes; + + private DataInputStream is; + + public ClassFile(DataInputStream is) throws IOException + { + this.is = is; + + magic = is.readInt(); + if (magic != 0xcafebabe) + throw new IOException("File is not a java class file."); + + minor_version = is.readShort(); + major_version = is.readShort(); + + pool = new ConstantPool(this); + + access_flags = is.readShort(); + this_class = is.readUnsignedShort(); + super_class = is.readUnsignedShort(); + + interfaces = new Interfaces(this); + + fields = new Fields(this); + + methods = new Methods(this); + + attributes = new Attributes(this); + } + + public DataInputStream getStream() + { + return is; + } + + public ConstantPool getPool() + { + return pool; + } +} diff --git a/src/main/java/info/sigterm/deob/ConstantPool.java b/src/main/java/info/sigterm/deob/ConstantPool.java new file mode 100644 index 0000000000..d7a76bed02 --- /dev/null +++ b/src/main/java/info/sigterm/deob/ConstantPool.java @@ -0,0 +1,61 @@ +package info.sigterm.deob; + +import info.sigterm.deob.pool.ConstantType; +import info.sigterm.deob.pool.PoolEntry; + +import java.io.DataInputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; + +public class ConstantPool +{ + private ClassFile classFile; + + private int count; + private PoolEntry pool[]; + + ConstantPool(ClassFile c) throws IOException + { + classFile = c; + + DataInputStream is = c.getStream(); + + count = is.readUnsignedShort(); + pool = new PoolEntry[count]; + + for (int i = 1; i < count; ++i) + { + byte typeCode = is.readByte(); + + ConstantType type = ConstantType.findFromType(typeCode); + + try + { + Constructor con = type.getPoolClass().getConstructor(new Class[] { ConstantPool.class }); + PoolEntry entry = con.newInstance(this); + + pool[i] = entry; + + for (int j = 1; j < entry.getSlots(); ++j) + { + pool[i + 1] = entry; + ++i; + } + } + catch (Exception e) + { + throw new IOException(e); + } + } + } + + public ClassFile getClassFile() + { + return classFile; + } + + public PoolEntry getEntry(int index) + { + return pool[index]; + } +} diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java new file mode 100644 index 0000000000..8cc92c66ac --- /dev/null +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -0,0 +1,26 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class Deob +{ + public static void main(String[] args) throws IOException + { + JarFile jar = new JarFile(args[0]); + for (Enumeration it = jar.entries(); it.hasMoreElements();) + { + JarEntry entry = it.nextElement(); + + if (!entry.getName().endsWith(".class")) + continue; + + InputStream is = jar.getInputStream(entry); + ClassFile c = new ClassFile(new DataInputStream(is)); + } + } +} diff --git a/src/main/java/info/sigterm/deob/Field.java b/src/main/java/info/sigterm/deob/Field.java new file mode 100644 index 0000000000..abcfe78f65 --- /dev/null +++ b/src/main/java/info/sigterm/deob/Field.java @@ -0,0 +1,31 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +class Field +{ + private Fields fields; + + private short accessFlags; + private int nameIndex; + private int descriptorIndex; + private Attributes attributes; + + Field(Fields fields) throws IOException + { + this.fields = fields; + + DataInputStream is = fields.getClassFile().getStream(); + + accessFlags = is.readShort(); + nameIndex = is.readUnsignedShort(); + descriptorIndex = is.readUnsignedShort(); + attributes = new Attributes(this); + } + + public Fields getFields() + { + return fields; + } +} \ No newline at end of file diff --git a/src/main/java/info/sigterm/deob/Fields.java b/src/main/java/info/sigterm/deob/Fields.java new file mode 100644 index 0000000000..c3d9cb9980 --- /dev/null +++ b/src/main/java/info/sigterm/deob/Fields.java @@ -0,0 +1,30 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Fields +{ + private ClassFile classFile; + + private int count; + private Field[] fields; + + Fields(ClassFile c) throws IOException + { + classFile = c; + + DataInputStream is = c.getStream(); + + count = is.readUnsignedShort(); + fields = new Field[count]; + + for (int i = 0; i < count; ++i) + fields[i] = new Field(this); + } + + public ClassFile getClassFile() + { + return classFile; + } +} diff --git a/src/main/java/info/sigterm/deob/Interfaces.java b/src/main/java/info/sigterm/deob/Interfaces.java new file mode 100644 index 0000000000..f65cdec66c --- /dev/null +++ b/src/main/java/info/sigterm/deob/Interfaces.java @@ -0,0 +1,25 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Interfaces +{ + private ClassFile classFile; + + private int count; + private int interfaces[]; + + Interfaces(ClassFile c) throws IOException + { + classFile = c; + + DataInputStream is = c.getStream(); + + count = is.readUnsignedShort(); + interfaces = new int[count]; + + for (int i = 0; i < count; ++i) + interfaces[i] = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/Method.java b/src/main/java/info/sigterm/deob/Method.java new file mode 100644 index 0000000000..0fde3853bf --- /dev/null +++ b/src/main/java/info/sigterm/deob/Method.java @@ -0,0 +1,31 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +class Method +{ + private Methods methods; + + private short accessFlags; + private int nameIndex; + private int descriptorIndex; + private Attributes attributes; + + Method(Methods methods) throws IOException + { + this.methods = methods; + + DataInputStream is = methods.getClassFile().getStream(); + + accessFlags = is.readShort(); + nameIndex = is.readUnsignedShort(); + descriptorIndex = is.readUnsignedShort(); + attributes = new Attributes(this); + } + + public Methods getMethods() + { + return methods; + } +} diff --git a/src/main/java/info/sigterm/deob/Methods.java b/src/main/java/info/sigterm/deob/Methods.java new file mode 100644 index 0000000000..bc9ce32cd4 --- /dev/null +++ b/src/main/java/info/sigterm/deob/Methods.java @@ -0,0 +1,30 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Methods +{ + ClassFile classFile; + + private int count; + private Method[] methods; + + Methods(ClassFile cf) throws IOException + { + classFile = cf; + + DataInputStream is = cf.getStream(); + + count = is.readUnsignedShort(); + methods = new Method[count]; + + for (int i = 0; i < count; ++i) + methods[i] = new Method(this); + } + + public ClassFile getClassFile() + { + return classFile; + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/Attribute.java b/src/main/java/info/sigterm/deob/attributes/Attribute.java new file mode 100644 index 0000000000..76922506eb --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/Attribute.java @@ -0,0 +1,32 @@ +package info.sigterm.deob.attributes; + +import info.sigterm.deob.Attributes; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Attribute +{ + private Attributes attributes; + private AttributeType type; + private int length; + + Attribute(Attributes attr, AttributeType type) throws IOException + { + this.attributes = attr; + this.type = type; + + DataInputStream is = attr.getStream(); + this.length = is.readInt(); + } + + public Attributes getAttributes() + { + return attributes; + } + + public int getLength() + { + return length; + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/AttributeType.java b/src/main/java/info/sigterm/deob/attributes/AttributeType.java new file mode 100644 index 0000000000..bbbe0c7414 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/AttributeType.java @@ -0,0 +1,36 @@ +package info.sigterm.deob.attributes; + +public enum AttributeType +{ + CONSTANT_VALUE("ConstantValue", ConstantValue.class), + CODE("Code", Code.class), + UNKNOWN(null, Unknown.class); + + private String name; + private Class clazz; + + AttributeType(String name, Class clazz) + { + this.name = name; + this.clazz = clazz; + } + + public String getName() + { + return name; + } + + public Class getAttributeClass() + { + return clazz; + } + + public static AttributeType findType(String name) + { + for (AttributeType t : AttributeType.values()) + if (t.getName() != null && t.getName().equals(name)) + return t; + + return UNKNOWN; + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java new file mode 100644 index 0000000000..6942421dbc --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -0,0 +1,31 @@ +package info.sigterm.deob.attributes; + +import info.sigterm.deob.Attributes; +import info.sigterm.deob.attributes.code.Exceptions; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Code extends Attribute +{ + private int maxStack; + private int maxLocals; + private Exceptions exceptions; + private Attributes attributes; + + public Code(Attributes attributes) throws IOException + { + super(attributes, AttributeType.CODE); + + DataInputStream is = attributes.getStream(); + + maxStack = is.readUnsignedShort(); + maxLocals = is.readUnsignedShort(); + + int codeLen = is.readInt(); + is.skip(codeLen); + + exceptions = new Exceptions(this); + attributes = new Attributes(this); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/ConstantValue.java b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java new file mode 100644 index 0000000000..4c90a265e9 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes; + +import info.sigterm.deob.Attributes; + +import java.io.DataInputStream; +import java.io.IOException; + +public class ConstantValue extends Attribute +{ + private int constantVlaueIndex; + + public ConstantValue(Attributes attributes) throws IOException + { + super(attributes, AttributeType.CONSTANT_VALUE); + + DataInputStream is = attributes.getStream(); + constantVlaueIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/Unknown.java b/src/main/java/info/sigterm/deob/attributes/Unknown.java new file mode 100644 index 0000000000..a01243bede --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/Unknown.java @@ -0,0 +1,34 @@ +package info.sigterm.deob.attributes; + +import info.sigterm.deob.Attributes; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Unknown extends Attribute +{ + private byte[] data; + + public Unknown(Attributes attributes) throws IOException + { + super(attributes, AttributeType.UNKNOWN); + + int len = this.getLength(); + DataInputStream is = attributes.getStream(); + + data = new byte[len]; + + int read = 0; + while (read < len) + { + int i = is.read(data, read, len - read); + + if (i < 0) + throw new IOException("EOF"); + + read += i; + } + + assert read == len; + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/Exception.java b/src/main/java/info/sigterm/deob/attributes/code/Exception.java new file mode 100644 index 0000000000..d59672397c --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/Exception.java @@ -0,0 +1,26 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +class Exception +{ + private Exceptions exceptions; + + private int startPc; + private int endPc; + private int handlerPc; + private int catchType; + + Exception(Exceptions exceptions) throws IOException + { + this.exceptions = exceptions; + + DataInputStream is = exceptions.getCode().getAttributes().getStream(); + + startPc = is.readUnsignedShort(); + endPc = is.readUnsignedShort(); + handlerPc = is.readUnsignedShort(); + catchType = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java b/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java new file mode 100644 index 0000000000..3c694ba8b7 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java @@ -0,0 +1,30 @@ +package info.sigterm.deob.attributes.code; + +import info.sigterm.deob.attributes.Code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Exceptions +{ + private Code code; + private Exception[] exceptions; + + public Exceptions(Code code) throws IOException + { + this.code = code; + + DataInputStream is = code.getAttributes().getStream(); + + int count = is.readUnsignedShort(); + exceptions = new Exception[count]; + + for (int i = 0; i < count; ++i) + exceptions[i] = new Exception(this); + } + + public Code getCode() + { + return code; + } +} \ No newline at end of file diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java new file mode 100644 index 0000000000..4bbddb2615 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Class extends PoolEntry +{ + private int index; + + public Class(ConstantPool pool) throws IOException + { + super(pool, ConstantType.CLASS); + + DataInputStream is = pool.getClassFile().getStream(); + index = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/ConstantType.java b/src/main/java/info/sigterm/deob/pool/ConstantType.java new file mode 100644 index 0000000000..2873389c3b --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/ConstantType.java @@ -0,0 +1,43 @@ +package info.sigterm.deob.pool; + +public enum ConstantType +{ + CLASS(7, Class.class), + FIELDREF(9, Field.class), + METHODREF(10, Method.class), + INTERFACE_METHOD_REF(11, InterfaceMethod.class), + STRING(8, String.class), + INTEGER(3, Integer.class), + FLOAT(4, Float.class), + LONG(5, Long.class), + DOUBLE(6, Double.class), + NAME_AND_TYPE(12, NameAndType.class), + UTF8(1, UTF8.class); + + private int value; + private java.lang.Class clazz; + + ConstantType(int value, java.lang.Class clazz) + { + this.value = value; + this.clazz = clazz; + } + + public int getType() + { + return value; + } + + public java.lang.Class getPoolClass() + { + return clazz; + } + + public static ConstantType findFromType(int type) + { + for (ConstantType t : ConstantType.values()) + if (t.getType() == type) + return t; + return null; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Double.java b/src/main/java/info/sigterm/deob/pool/Double.java new file mode 100644 index 0000000000..a068ac621f --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Double.java @@ -0,0 +1,26 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Double extends PoolEntry +{ + private double value; + + public Double(ConstantPool pool) throws IOException + { + super(pool, ConstantType.DOUBLE); + + DataInputStream is = pool.getClassFile().getStream(); + + value = is.readDouble(); + } + + @Override + public int getSlots() + { + return 2; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Field.java b/src/main/java/info/sigterm/deob/pool/Field.java new file mode 100644 index 0000000000..919ab23f37 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Field.java @@ -0,0 +1,22 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Field extends PoolEntry +{ + private int classIndex; + private int nameAndTypeIndex; + + public Field(ConstantPool pool) throws IOException + { + super(pool, ConstantType.FIELDREF); + + DataInputStream is = pool.getClassFile().getStream(); + + classIndex = is.readUnsignedShort(); + nameAndTypeIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Float.java b/src/main/java/info/sigterm/deob/pool/Float.java new file mode 100644 index 0000000000..c109453572 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Float.java @@ -0,0 +1,20 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Float extends PoolEntry +{ + private float value; + + public Float(ConstantPool pool) throws IOException + { + super(pool, ConstantType.FLOAT); + + DataInputStream is = pool.getClassFile().getStream(); + + value = is.readFloat(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Integer.java b/src/main/java/info/sigterm/deob/pool/Integer.java new file mode 100644 index 0000000000..6aae3a0706 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Integer.java @@ -0,0 +1,20 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Integer extends PoolEntry +{ + private int value; + + public Integer(ConstantPool pool) throws IOException + { + super(pool, ConstantType.INTEGER); + + DataInputStream is = pool.getClassFile().getStream(); + + value = is.readInt(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java b/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java new file mode 100644 index 0000000000..4001e74d0c --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java @@ -0,0 +1,22 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InterfaceMethod extends PoolEntry +{ + private int classIndex; + private int nameAndTypeIndex; + + public InterfaceMethod(ConstantPool pool) throws IOException + { + super(pool, ConstantType.INTERFACE_METHOD_REF); + + DataInputStream is = pool.getClassFile().getStream(); + + classIndex = is.readUnsignedShort(); + nameAndTypeIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Long.java b/src/main/java/info/sigterm/deob/pool/Long.java new file mode 100644 index 0000000000..e37becee30 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Long.java @@ -0,0 +1,26 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Long extends PoolEntry +{ + private long value; + + public Long(ConstantPool pool) throws IOException + { + super(pool, ConstantType.LONG); + + DataInputStream is = pool.getClassFile().getStream(); + + value = is.readLong(); + } + + @Override + public int getSlots() + { + return 2; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Method.java b/src/main/java/info/sigterm/deob/pool/Method.java new file mode 100644 index 0000000000..802591863b --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/Method.java @@ -0,0 +1,22 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Method extends PoolEntry +{ + private int classIndex; + private int nameAndTypeIndex; + + public Method(ConstantPool pool) throws IOException + { + super(pool, ConstantType.METHODREF); + + DataInputStream is = pool.getClassFile().getStream(); + + classIndex = is.readUnsignedShort(); + nameAndTypeIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/NameAndType.java b/src/main/java/info/sigterm/deob/pool/NameAndType.java new file mode 100644 index 0000000000..66e32974c3 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/NameAndType.java @@ -0,0 +1,22 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class NameAndType extends PoolEntry +{ + private int nameIndex; + private int descriptorIndex; + + public NameAndType(ConstantPool pool) throws IOException + { + super(pool, ConstantType.NAME_AND_TYPE); + + DataInputStream is = pool.getClassFile().getStream(); + + nameIndex = is.readUnsignedShort(); + descriptorIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/PoolEntry.java b/src/main/java/info/sigterm/deob/pool/PoolEntry.java new file mode 100644 index 0000000000..9d61981761 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/PoolEntry.java @@ -0,0 +1,20 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +public abstract class PoolEntry +{ + private ConstantPool pool; + private ConstantType type; + + protected PoolEntry(ConstantPool pool, ConstantType type) + { + this.pool = pool; + this.type = type; + } + + public int getSlots() + { + return 1; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/String.java b/src/main/java/info/sigterm/deob/pool/String.java new file mode 100644 index 0000000000..e5d82abea8 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/String.java @@ -0,0 +1,20 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class String extends PoolEntry +{ + private int stringIndex; + + public String(ConstantPool pool) throws IOException + { + super(pool, ConstantType.STRING); + + DataInputStream is = pool.getClassFile().getStream(); + + stringIndex = is.readUnsignedShort(); + } +} diff --git a/src/main/java/info/sigterm/deob/pool/UTF8.java b/src/main/java/info/sigterm/deob/pool/UTF8.java new file mode 100644 index 0000000000..fafbe17525 --- /dev/null +++ b/src/main/java/info/sigterm/deob/pool/UTF8.java @@ -0,0 +1,48 @@ +package info.sigterm.deob.pool; + +import info.sigterm.deob.ConstantPool; + +import java.io.DataInputStream; +import java.io.IOException; + +public class UTF8 extends PoolEntry +{ + private StringBuilder sb = new StringBuilder(); + + public UTF8(ConstantPool pool) throws IOException + { + super(pool, ConstantType.UTF8); + + DataInputStream ios = pool.getClassFile().getStream(); + + short length = ios.readShort(); + for (int i = 0; i < length; i++) + { + int a = ios.read(); + if ((a & 0x80) == 0) + { + sb.append((char)a); + } + else if ((a & 0x20) == 0) + { + int b = ios.read(); + char c = (char)(((a & 0x1f) << 6) + (b & 0x3f)); + sb.append(c); + i++; + } + else + { + int b = ios.read(); + int c = ios.read(); + char ch = (char)(((a & 0xf) << 12) + ((b & 0x3f) << 6) + (c & 0x3f)); + sb.append(ch); + i += 2; + } + } + } + + public java.lang.String getValue() + { + return sb.toString(); + } +}