From 4a24560be5729544b00a13ca2b29b43c792c1c41 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 1 Dec 2014 17:00:55 -0500 Subject: [PATCH] Add field references, only for getstatic currently --- .../java/info/sigterm/deob/ClassFile.java | 45 ++++++++++++++----- .../java/info/sigterm/deob/ClassGroup.java | 6 +++ src/main/java/info/sigterm/deob/Deob.java | 1 + src/main/java/info/sigterm/deob/Field.java | 22 +++++++++ src/main/java/info/sigterm/deob/Fields.java | 10 +++++ src/main/java/info/sigterm/deob/Method.java | 8 ++++ src/main/java/info/sigterm/deob/Methods.java | 6 +++ .../info/sigterm/deob/attributes/Code.java | 5 +++ .../deob/attributes/code/Instruction.java | 9 ++++ .../deob/attributes/code/Instructions.java | 6 +++ .../code/instructions/GetStatic.java | 24 ++++++++++ .../java/info/sigterm/deob/pool/Class.java | 5 ++- .../java/info/sigterm/deob/pool/Field.java | 10 +++++ .../info/sigterm/deob/pool/NameAndType.java | 12 +++++ .../info/sigterm/deob/pool/PoolEntry.java | 5 +++ 15 files changed, 162 insertions(+), 12 deletions(-) diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 971ecb2cf5..904ba54bc4 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -2,7 +2,7 @@ package info.sigterm.deob; import info.sigterm.deob.attributes.Attributes; import info.sigterm.deob.pool.Class; -import info.sigterm.deob.pool.UTF8; +import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; import java.io.IOException; @@ -55,6 +55,11 @@ public class ClassFile attributes = new Attributes(this); } + public ClassGroup getGroup() + { + return group; + } + public DataInputStream getStream() { return is; @@ -68,23 +73,43 @@ public class ClassFile public String getName() { Class entry = (Class) pool.getEntry(this_class); - UTF8 className = (UTF8) pool.getEntry(entry.getIndex()); - return className.getValue(); + return entry.getName(); + } + + public ClassFile getParent() + { + Class entry = (Class) pool.getEntry(super_class); + String superName = entry.getName(); + ClassFile other = group.findClass(superName); + assert other != this; + return other; + } + + public Field findField(NameAndType nat) + { + Field f = fields.findField(nat); + if (f != null) + return f; + + ClassFile parent = getParent(); + if (parent != null) + return parent.findField(nat); + + return null; } 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); + ClassFile other = getParent(); if (other == null) return; // inherits from a class not in my group - assert other != this; - this.parent = other; parent.children.add(this); } + + public void buildInstructionGraph() + { + methods.buildInstructionGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/ClassGroup.java b/src/main/java/info/sigterm/deob/ClassGroup.java index 3e58224307..71b8b05a20 100644 --- a/src/main/java/info/sigterm/deob/ClassGroup.java +++ b/src/main/java/info/sigterm/deob/ClassGroup.java @@ -32,4 +32,10 @@ public class ClassGroup for (ClassFile c : classes) c.buildClassGraph(); } + + public void buildInstructionGraph() + { + for (ClassFile c : classes) + c.buildInstructionGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index 5323b02b44..880ed810c7 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -26,5 +26,6 @@ public class Deob } group.buildClassGraph(); + group.buildInstructionGraph(); } } diff --git a/src/main/java/info/sigterm/deob/Field.java b/src/main/java/info/sigterm/deob/Field.java index 87e27ee7be..13c76f6da8 100644 --- a/src/main/java/info/sigterm/deob/Field.java +++ b/src/main/java/info/sigterm/deob/Field.java @@ -1,9 +1,12 @@ package info.sigterm.deob; import info.sigterm.deob.attributes.Attributes; +import info.sigterm.deob.attributes.code.Instruction; +import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; import java.io.IOException; +import java.util.ArrayList; public class Field { @@ -14,6 +17,8 @@ public class Field private int descriptorIndex; private Attributes attributes; + private ArrayList instructions = new ArrayList(); // instructions which reference this field + Field(Fields fields) throws IOException { this.fields = fields; @@ -30,4 +35,21 @@ public class Field { return fields; } + + public String getName() + { + UTF8 u = (UTF8) fields.getClassFile().getPool().getEntry(nameIndex); + return u.getValue(); + } + + public String getDescriptor() + { + UTF8 u = (UTF8) fields.getClassFile().getPool().getEntry(descriptorIndex); + return u.getValue(); + } + + public void addReference(Instruction ins) + { + instructions.add(ins); + } } \ 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 index c3d9cb9980..833780d586 100644 --- a/src/main/java/info/sigterm/deob/Fields.java +++ b/src/main/java/info/sigterm/deob/Fields.java @@ -1,5 +1,7 @@ package info.sigterm.deob; +import info.sigterm.deob.pool.NameAndType; + import java.io.DataInputStream; import java.io.IOException; @@ -27,4 +29,12 @@ public class Fields { return classFile; } + + public Field findField(NameAndType nat) + { + for (Field f : fields) + if (f.getName().equals(nat.getName()) && f.getDescriptor().equals(nat.getDescriptor())) + return f; + return null; + } } diff --git a/src/main/java/info/sigterm/deob/Method.java b/src/main/java/info/sigterm/deob/Method.java index ec86718936..6478219fcd 100644 --- a/src/main/java/info/sigterm/deob/Method.java +++ b/src/main/java/info/sigterm/deob/Method.java @@ -37,4 +37,12 @@ public class Method { return (Code) attributes.findType(AttributeType.CODE); } + + public void buildInstructionGraph() + { + Code code = getCode(); + + if (code != null) + code.buildInstructionGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/Methods.java b/src/main/java/info/sigterm/deob/Methods.java index bc9ce32cd4..67cef2f1d8 100644 --- a/src/main/java/info/sigterm/deob/Methods.java +++ b/src/main/java/info/sigterm/deob/Methods.java @@ -27,4 +27,10 @@ public class Methods { return classFile; } + + public void buildInstructionGraph() + { + for (Method m : methods) + m.buildInstructionGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index 38d8628797..680970c247 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -38,4 +38,9 @@ public class Code extends Attribute { return maxLocals; } + + public void buildInstructionGraph() + { + instructions.buildInstructionGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java index a0c47255d1..edab9b4d0b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -22,6 +22,11 @@ public class Instruction this.pc = pc; } + public Instructions getInstructions() + { + return instructions; + } + public int getPc() { return pc; @@ -46,6 +51,10 @@ public class Instruction { } + public void buildInstructionGraph() + { + } + public void execute(Execution e) { } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java index 29f4510e32..3773dce834 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -53,6 +53,12 @@ public class Instructions i.buildJumpGraph(); } + public void buildInstructionGraph() + { + for (Instruction i : instructions) + i.buildInstructionGraph(); + } + public Code getCode() { return code; diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java index e0db5d1d65..06e7f74c10 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java @@ -1,8 +1,13 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; +import info.sigterm.deob.pool.Class; +import info.sigterm.deob.pool.Field; +import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; import java.io.IOException; @@ -20,4 +25,23 @@ public class GetStatic extends Instruction length += 2; } + @Override + public void buildInstructionGraph() + { + ConstantPool pool = this.getInstructions().getCode().getAttributes().getClassFile().getPool(); + Field entry = (Field) pool.getEntry(index); + + Class clazz = entry.getClassEntry(); + NameAndType nat = entry.getNameAndType(); + + ClassFile cf = this.getInstructions().getCode().getAttributes().getClassFile().getGroup().findClass(clazz.getName()); + if (cf == null) + return; + + info.sigterm.deob.Field f = cf.findField(nat); + assert f != null; + + f.addReference(this); + } + } diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java index a6ad6d0b20..f6c5b77f07 100644 --- a/src/main/java/info/sigterm/deob/pool/Class.java +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -17,8 +17,9 @@ public class Class extends PoolEntry index = is.readUnsignedShort(); } - public int getIndex() + public java.lang.String getName() { - return index; + UTF8 u = (UTF8) this.getPool().getEntry(index); + return u.getValue(); } } diff --git a/src/main/java/info/sigterm/deob/pool/Field.java b/src/main/java/info/sigterm/deob/pool/Field.java index 919ab23f37..1b2798fc5e 100644 --- a/src/main/java/info/sigterm/deob/pool/Field.java +++ b/src/main/java/info/sigterm/deob/pool/Field.java @@ -19,4 +19,14 @@ public class Field extends PoolEntry classIndex = is.readUnsignedShort(); nameAndTypeIndex = is.readUnsignedShort(); } + + public Class getClassEntry() + { + return (Class) this.getPool().getEntry(classIndex); + } + + public NameAndType getNameAndType() + { + return (NameAndType) this.getPool().getEntry(nameAndTypeIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/NameAndType.java b/src/main/java/info/sigterm/deob/pool/NameAndType.java index 66e32974c3..83bf20858c 100644 --- a/src/main/java/info/sigterm/deob/pool/NameAndType.java +++ b/src/main/java/info/sigterm/deob/pool/NameAndType.java @@ -19,4 +19,16 @@ public class NameAndType extends PoolEntry nameIndex = is.readUnsignedShort(); descriptorIndex = is.readUnsignedShort(); } + + public java.lang.String getName() + { + UTF8 u = (UTF8) this.getPool().getEntry(nameIndex); + return u.getValue(); + } + + public java.lang.String getDescriptor() + { + UTF8 u = (UTF8) this.getPool().getEntry(descriptorIndex); + return u.getValue(); + } } diff --git a/src/main/java/info/sigterm/deob/pool/PoolEntry.java b/src/main/java/info/sigterm/deob/pool/PoolEntry.java index 9d61981761..c3121921d0 100644 --- a/src/main/java/info/sigterm/deob/pool/PoolEntry.java +++ b/src/main/java/info/sigterm/deob/pool/PoolEntry.java @@ -13,6 +13,11 @@ public abstract class PoolEntry this.type = type; } + public ConstantPool getPool() + { + return pool; + } + public int getSlots() { return 1;