init of deob
This commit is contained in:
6
pom.xml
Normal file
6
pom.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>info.sigterm</groupId>
|
||||||
|
<artifactId>deob</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</project>
|
||||||
98
src/main/java/info/sigterm/deob/Attributes.java
Normal file
98
src/main/java/info/sigterm/deob/Attributes.java
Normal file
@@ -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<? extends Attribute> con = type.getAttributeClass().getConstructor(new Class[] { Attributes.class });
|
||||||
|
Attribute attr = con.newInstance(this);
|
||||||
|
|
||||||
|
attributes[i] = attr;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new IOException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
57
src/main/java/info/sigterm/deob/ClassFile.java
Normal file
57
src/main/java/info/sigterm/deob/ClassFile.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
61
src/main/java/info/sigterm/deob/ConstantPool.java
Normal file
61
src/main/java/info/sigterm/deob/ConstantPool.java
Normal file
@@ -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<? extends PoolEntry> 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/main/java/info/sigterm/deob/Deob.java
Normal file
26
src/main/java/info/sigterm/deob/Deob.java
Normal file
@@ -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<JarEntry> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/main/java/info/sigterm/deob/Field.java
Normal file
31
src/main/java/info/sigterm/deob/Field.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/main/java/info/sigterm/deob/Fields.java
Normal file
30
src/main/java/info/sigterm/deob/Fields.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/main/java/info/sigterm/deob/Interfaces.java
Normal file
25
src/main/java/info/sigterm/deob/Interfaces.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/main/java/info/sigterm/deob/Method.java
Normal file
31
src/main/java/info/sigterm/deob/Method.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/main/java/info/sigterm/deob/Methods.java
Normal file
30
src/main/java/info/sigterm/deob/Methods.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
32
src/main/java/info/sigterm/deob/attributes/Attribute.java
Normal file
32
src/main/java/info/sigterm/deob/attributes/Attribute.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<? extends Attribute> clazz;
|
||||||
|
|
||||||
|
AttributeType(String name, Class<? extends Attribute> clazz)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.clazz = clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<? extends Attribute> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/main/java/info/sigterm/deob/attributes/Code.java
Normal file
31
src/main/java/info/sigterm/deob/attributes/Code.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/main/java/info/sigterm/deob/attributes/Unknown.java
Normal file
34
src/main/java/info/sigterm/deob/attributes/Unknown.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/main/java/info/sigterm/deob/pool/Class.java
Normal file
19
src/main/java/info/sigterm/deob/pool/Class.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
43
src/main/java/info/sigterm/deob/pool/ConstantType.java
Normal file
43
src/main/java/info/sigterm/deob/pool/ConstantType.java
Normal file
@@ -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<? extends PoolEntry> clazz;
|
||||||
|
|
||||||
|
ConstantType(int value, java.lang.Class<? extends PoolEntry> clazz)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
this.clazz = clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public java.lang.Class<? extends PoolEntry> getPoolClass()
|
||||||
|
{
|
||||||
|
return clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConstantType findFromType(int type)
|
||||||
|
{
|
||||||
|
for (ConstantType t : ConstantType.values())
|
||||||
|
if (t.getType() == type)
|
||||||
|
return t;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/main/java/info/sigterm/deob/pool/Double.java
Normal file
26
src/main/java/info/sigterm/deob/pool/Double.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/info/sigterm/deob/pool/Field.java
Normal file
22
src/main/java/info/sigterm/deob/pool/Field.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/info/sigterm/deob/pool/Float.java
Normal file
20
src/main/java/info/sigterm/deob/pool/Float.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/info/sigterm/deob/pool/Integer.java
Normal file
20
src/main/java/info/sigterm/deob/pool/Integer.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/info/sigterm/deob/pool/InterfaceMethod.java
Normal file
22
src/main/java/info/sigterm/deob/pool/InterfaceMethod.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/main/java/info/sigterm/deob/pool/Long.java
Normal file
26
src/main/java/info/sigterm/deob/pool/Long.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/info/sigterm/deob/pool/Method.java
Normal file
22
src/main/java/info/sigterm/deob/pool/Method.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/info/sigterm/deob/pool/NameAndType.java
Normal file
22
src/main/java/info/sigterm/deob/pool/NameAndType.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/info/sigterm/deob/pool/PoolEntry.java
Normal file
20
src/main/java/info/sigterm/deob/pool/PoolEntry.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/java/info/sigterm/deob/pool/String.java
Normal file
20
src/main/java/info/sigterm/deob/pool/String.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
48
src/main/java/info/sigterm/deob/pool/UTF8.java
Normal file
48
src/main/java/info/sigterm/deob/pool/UTF8.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user