Build class graph

This commit is contained in:
Adam
2014-12-01 12:51:30 -05:00
parent df28895fc8
commit 0d50085e03
5 changed files with 105 additions and 4 deletions

View File

@@ -1,10 +1,20 @@
package info.sigterm.deob;
import info.sigterm.deob.pool.Class;
import info.sigterm.deob.pool.UTF8;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
public class ClassFile
{
private ClassGroup group;
private DataInputStream is;
private ClassFile parent; // super class
private ArrayList<ClassFile> children = new ArrayList<ClassFile>(); // classes which inherit from this
private int magic;
private short minor_version;
private short major_version;
@@ -17,10 +27,9 @@ public class ClassFile
private Methods methods;
private Attributes attributes;
private DataInputStream is;
public ClassFile(DataInputStream is) throws IOException
public ClassFile(ClassGroup group, DataInputStream is) throws IOException
{
this.group = group;
this.is = is;
magic = is.readInt();
@@ -54,4 +63,28 @@ public class ClassFile
{
return pool;
}
public String getName()
{
Class entry = (Class) pool.getEntry(this_class);
UTF8 className = (UTF8) pool.getEntry(entry.getIndex());
return className.getValue();
}
public void buildClassGraph()
{
Class entry = (Class) pool.getEntry(super_class);
UTF8 className = (UTF8) pool.getEntry(entry.getIndex());
String superName = className.getValue();
ClassFile other = group.findClass(superName);
if (other == null)
return; // inherits from a class not in my group
assert other != null;
assert other != this;
this.parent = other;
parent.children.add(this);
}
}

View File

@@ -0,0 +1,35 @@
package info.sigterm.deob;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
public class ClassGroup
{
private ArrayList<ClassFile> classes = new ArrayList<ClassFile>();
public ClassGroup()
{
}
public ClassFile addClass(String name, DataInputStream is) throws IOException
{
ClassFile cf = new ClassFile(this, is);
classes.add(cf);
return cf;
}
public ClassFile findClass(String name)
{
for (ClassFile c : classes)
if (c.getName().equals(name))
return c;
return null;
}
public void buildClassGraph()
{
for (ClassFile c : classes)
c.buildClassGraph();
}
}

View File

@@ -11,6 +11,8 @@ public class Deob
{
public static void main(String[] args) throws IOException
{
ClassGroup group = new ClassGroup();
JarFile jar = new JarFile(args[0]);
for (Enumeration<JarEntry> it = jar.entries(); it.hasMoreElements();)
{
@@ -20,7 +22,9 @@ public class Deob
continue;
InputStream is = jar.getInputStream(entry);
ClassFile c = new ClassFile(new DataInputStream(is));
}
group.addClass(entry.getName(), new DataInputStream(is));
}
group.buildClassGraph();
}
}

View File

@@ -0,0 +1,24 @@
package info.sigterm.deob.attributes.code.instructions;
import info.sigterm.deob.attributes.code.Instruction;
import info.sigterm.deob.attributes.code.InstructionType;
import info.sigterm.deob.attributes.code.Instructions;
import java.io.DataInputStream;
import java.io.IOException;
public class InvokeDynamic extends Instruction
{
private int index;
public InvokeDynamic(Instructions instructions, InstructionType type, int pc) throws IOException
{
super(instructions, type, pc);
DataInputStream is = instructions.getCode().getAttributes().getStream();
index = is.readUnsignedShort();
is.skip(2);
length += 4;
}
}

View File

@@ -16,4 +16,9 @@ public class Class extends PoolEntry
DataInputStream is = pool.getClassFile().getStream();
index = is.readUnsignedShort();
}
public int getIndex()
{
return index;
}
}