Skip to content

Commit e13046e

Browse files
committed
Some changes
1 parent 57f1467 commit e13046e

20 files changed

+536
-154
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ Official transformers are linked via the `Transformers` class.
5858
| Stringer.HIDEACCESS_OBFUSCATION | stringer.HideAccessObfuscationTransformer | Decrypts hide access by Stringer (Included invokedynamic and reflection) |
5959
| Zelix.STRING_ENCRYPTION | zelix.StringEncryptionTransformer | Decrypts strings encrypted by Zelix |
6060
| Zelix.REFLECTION_OBFUSCATION | zelix.ReflectionObfuscationTransformer | Decrypts reflection obfuscated calls by Zelix |
61-
| General.SYNTHETIC_BRIDGE | general.SyntheticBridgeTransformer | Removes synthetic and bridge modifiers from all methods and fields |
6261
| General.PEEPHOLE_OPTIMIZER | general.peephole.PeepholeOptimizer| Optimizes the code |
63-
| General.LINENUMBER_REMOVER | general.LineNumberRemover | Removes line number metadata |
64-
| General.ILLEGAL_VARARGS | general.IllegalVarargsTransformer | Unmangles methods marked as variadic but aren't really |
62+
| General.Removers.SYNTHETIC_BRIDGE | general.remover.SyntheticBridgeRemover | Removes synthetic and bridge modifiers from all methods and fields |
63+
| General.Removers.LINE_NUMBER | general.remover.LineNumberRemover | Removes line number metadata |
64+
| General.Removers.ILLEGAL_VARARGS | general.remover.IllegalVarargsRemover | Unmangles methods marked as variadic but aren't really |
65+
| General.Removers.ILLEGAL_SIGNATURE | general.remover.IllegalSignatureRemover | Removes illegal signatures from members |
6566
| Normalizer.CLASS_NORMALIZER | normalizer.ClassNormalizer | Renames all classes to Class<number> |
6667
| Normalizer.METHOD_NORMALIZER | normalizer.MethodNormalizer | Renames all methods to Method<number> |
6768
| Normalizer.FIELD_NORMALIZER | normalizer.FieldNormalizer | Renames all fields to Field<number> |

src/main/java/com/javadeobfuscator/deobfuscator/Deobfuscator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public void start() throws Throwable {
9494
while (entries.hasMoreElements()) {
9595
ZipEntry ent = entries.nextElement();
9696
if (ent.getName().endsWith(".class")) {
97+
if (ent.getName().equals("module-info.class")) { // *rolls eyes*
98+
continue;
99+
}
97100
ClassReader reader = new ClassReader(zipIn.getInputStream(ent));
98101
ClassNode node = new ClassNode();
99102
node.isLibrary = true;

src/main/java/com/javadeobfuscator/deobfuscator/analyzer/MethodAnalyzer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@
215215
import static com.javadeobfuscator.deobfuscator.org.objectweb.asm.Opcodes.SWAP;
216216
import static com.javadeobfuscator.deobfuscator.org.objectweb.asm.Opcodes.TABLESWITCH;
217217

218+
// todo this is seriously broken. right now any jump which share the same end and start (i.e. insn 5 jumps into insn 8) will only be run once
219+
// however this was based on a flawed assumption that a jump over the same gap would produce the same results every time
220+
// for example, a -> b -> c -> d and a -> c -> d both do a jump from c -> d, but clearly the behaviour at c will be different
218221
public class MethodAnalyzer {
219222
private static final boolean DEBUG = false;
220223

src/main/java/com/javadeobfuscator/deobfuscator/analyzer/frame/FieldFrame.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,12 @@ public String getName() {
5151
public String getOwner() {
5252
return owner;
5353
}
54+
55+
public Frame getInstance() {
56+
return instance;
57+
}
58+
59+
public Frame getObj() {
60+
return obj;
61+
}
5462
}

src/main/java/com/javadeobfuscator/deobfuscator/analyzer/frame/Frame.java

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,77 @@
1010
import java.util.List;
1111

1212
public class Frame {
13-
protected int opcode;
13+
private static final String ILLEGAL_OPCODE = "<illegal opcode>";
14+
15+
private static final String[] OPCODE_NAMES = {
16+
"nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1",
17+
"iconst_2", "iconst_3", "iconst_4", "iconst_5", "lconst_0",
18+
"lconst_1", "fconst_0", "fconst_1", "fconst_2", "dconst_0",
19+
"dconst_1", "bipush", "sipush", "ldc", "ldc_w", "ldc2_w", "iload",
20+
"lload", "fload", "dload", "aload", "iload_0", "iload_1", "iload_2",
21+
"iload_3", "lload_0", "lload_1", "lload_2", "lload_3", "fload_0",
22+
"fload_1", "fload_2", "fload_3", "dload_0", "dload_1", "dload_2",
23+
"dload_3", "aload_0", "aload_1", "aload_2", "aload_3", "iaload",
24+
"laload", "faload", "daload", "aaload", "baload", "caload", "saload",
25+
"istore", "lstore", "fstore", "dstore", "astore", "istore_0",
26+
"istore_1", "istore_2", "istore_3", "lstore_0", "lstore_1",
27+
"lstore_2", "lstore_3", "fstore_0", "fstore_1", "fstore_2",
28+
"fstore_3", "dstore_0", "dstore_1", "dstore_2", "dstore_3",
29+
"astore_0", "astore_1", "astore_2", "astore_3", "iastore", "lastore",
30+
"fastore", "dastore", "aastore", "bastore", "castore", "sastore",
31+
"pop", "pop2", "dup", "dup_x1", "dup_x2", "dup2", "dup2_x1",
32+
"dup2_x2", "swap", "iadd", "ladd", "fadd", "dadd", "isub", "lsub",
33+
"fsub", "dsub", "imul", "lmul", "fmul", "dmul", "idiv", "ldiv",
34+
"fdiv", "ddiv", "irem", "lrem", "frem", "drem", "ineg", "lneg",
35+
"fneg", "dneg", "ishl", "lshl", "ishr", "lshr", "iushr", "lushr",
36+
"iand", "land", "ior", "lor", "ixor", "lxor", "iinc", "i2l", "i2f",
37+
"i2d", "l2i", "l2f", "l2d", "f2i", "f2l", "f2d", "d2i", "d2l", "d2f",
38+
"i2b", "i2c", "i2s", "lcmp", "fcmpl", "fcmpg",
39+
"dcmpl", "dcmpg", "ifeq", "ifne", "iflt", "ifge", "ifgt", "ifle",
40+
"if_icmpeq", "if_icmpne", "if_icmplt", "if_icmpge", "if_icmpgt",
41+
"if_icmple", "if_acmpeq", "if_acmpne", "goto", "jsr", "ret",
42+
"tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn",
43+
"dreturn", "areturn", "return", "getstatic", "putstatic", "getfield",
44+
"putfield", "invokevirtual", "invokespecial", "invokestatic",
45+
"invokeinterface", "invokedynamic", "new", "newarray", "anewarray",
46+
"arraylength", "athrow", "checkcast", "instanceof", "monitorenter",
47+
"monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull",
48+
"goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE,
49+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
50+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
51+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
52+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
53+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
54+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
55+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
56+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
57+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
58+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
59+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
60+
ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE,
61+
ILLEGAL_OPCODE, "impdep1", "impdep2"
62+
};
63+
64+
protected transient int opcode;
65+
protected String mnemonic;
1466

1567
protected transient List<Frame> parents = new ArrayList<>(); // Represents all the frames which contributed to creating this frame
1668
protected transient List<Frame> children = new ArrayList<>(); // Represents all the frames which this frame was involved in
1769

18-
private transient LinkedList<Value> locals = new LinkedList<>();
19-
private transient LinkedList<Value> stack = new LinkedList<>();
70+
// private transient LinkedList<Value> locals = new LinkedList<>();
71+
// private transient LinkedList<Value> stack = new LinkedList<>();
2072
private transient Value[] localsArr;
2173
private transient Value[] stackArr;
2274

2375
private Boolean isConstant;
2476

2577
public Frame(int opcode) {
2678
this.opcode = opcode;
79+
if (opcode == -1) {
80+
this.mnemonic = "-1";
81+
} else {
82+
this.mnemonic = OPCODE_NAMES[opcode];
83+
}
2784
}
2885

2986
public final int getOpcode() {
@@ -34,28 +91,28 @@ public List<Frame> getChildren() {
3491
return children;
3592
}
3693

37-
public Value getLocalAt(int index) {
38-
if (localsArr == null) {
39-
localsArr = locals.toArray(new Value[locals.size()]);
40-
}
41-
return localsArr[index];
42-
}
94+
// public Value getLocalAt(int index) {
95+
// if (localsArr == null) {
96+
// localsArr = locals.toArray(new Value[locals.size()]);
97+
// }
98+
// return localsArr[index];
99+
// }
43100

44-
public Value getStackAt(int index) {
45-
if (stackArr == null) {
46-
stackArr = stack.toArray(new Value[stack.size()]);
47-
}
48-
return stackArr[index];
49-
}
101+
// public Value getStackAt(int index) {
102+
// if (stackArr == null) {
103+
// stackArr = stack.toArray(new Value[stack.size()]);
104+
// }
105+
// return stackArr[index];
106+
// }
50107

51108
public void pushLocal(Value value) {
52-
this.locals.add(value);
53-
this.localsArr = null;
109+
// this.locals.add(value);
110+
// this.localsArr = null;
54111
}
55112

56113
public void pushStack(Value value) {
57-
this.stack.add(value);
58-
this.stackArr = null;
114+
// this.stack.add(value);
115+
// this.stackArr = null;
59116
}
60117

61118
public boolean isConstant() {

src/main/java/com/javadeobfuscator/deobfuscator/executor/Context.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.javadeobfuscator.deobfuscator.executor;
22

33
import com.javadeobfuscator.deobfuscator.executor.providers.Provider;
4+
import com.javadeobfuscator.deobfuscator.executor.values.JavaValue;
5+
import com.javadeobfuscator.deobfuscator.org.objectweb.asm.tree.AbstractInsnNode;
46
import com.javadeobfuscator.deobfuscator.utils.WrappedClassNode;
57

68
import java.io.File;
79
import java.util.*;
10+
import java.util.function.Consumer;
811

912
public class Context { //FIXME clinit classes
1013
private List<StackTraceElement> context = new ArrayList<>();
@@ -45,4 +48,46 @@ public StackTraceElement[] getStackTrace() {
4548
}
4649
return orig;
4750
}
51+
52+
private Map<AbstractInsnNode, Consumer<BreakpointInfo>> breakpointsBefore = new HashMap<>();
53+
private Map<AbstractInsnNode, Consumer<BreakpointInfo>> breakpointsAfter = new HashMap<>();
54+
55+
public void doBreakpoint(AbstractInsnNode now, boolean before, List<JavaValue> stack, List<JavaValue> locals, Object tothrow) {
56+
if (before && breakpointsBefore.containsKey(now)) {
57+
breakpointsBefore.get(now).accept(new BreakpointInfo(tothrow, stack, locals));
58+
} else if (!before && breakpointsAfter.containsKey(now)) {
59+
breakpointsAfter.get(now).accept(new BreakpointInfo(tothrow, stack, locals));
60+
}
61+
}
62+
63+
public void breakpoint(AbstractInsnNode now, Consumer<BreakpointInfo> before, Consumer<BreakpointInfo> after) {
64+
if (before != null)
65+
breakpointsBefore.put(now, before);
66+
if (after != null)
67+
breakpointsAfter.put(now, after);
68+
}
69+
70+
public static class BreakpointInfo {
71+
private Object throwable;
72+
private List<JavaValue> stack;
73+
private List<JavaValue> locals;
74+
75+
public BreakpointInfo(Object throwable, List<JavaValue> stack, List<JavaValue> locals) {
76+
this.throwable = throwable;
77+
this.stack = stack;
78+
this.locals = locals;
79+
}
80+
81+
public Object getThrowable() {
82+
return throwable;
83+
}
84+
85+
public List<JavaValue> getStack() {
86+
return stack;
87+
}
88+
89+
public List<JavaValue> getLocals() {
90+
return locals;
91+
}
92+
}
4893
}

src/main/java/com/javadeobfuscator/deobfuscator/executor/MethodExecutor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ private static <T> T execute(WrappedClassNode classNode, MethodNode method, Abst
343343
if (now == null) {
344344
throw new FallingOffCodeException();
345345
}
346+
347+
context.doBreakpoint(now, true, stack, locals, null);
348+
346349
Throwable toThrow = null;
347350
switch (now.getOpcode()) {
348351
case NOP:
@@ -1460,6 +1463,8 @@ private static <T> T execute(WrappedClassNode classNode, MethodNode method, Abst
14601463
}
14611464
}
14621465

1466+
context.doBreakpoint(now, false, stack, locals, toThrow);
1467+
14631468
if (toThrow != null) {
14641469
if (DEBUG_PRINT_EXCEPTIONS) {
14651470
toThrow.printStackTrace(System.out);

src/main/java/com/javadeobfuscator/deobfuscator/transformers/Transformers.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616

1717
package com.javadeobfuscator.deobfuscator.transformers;
1818

19+
import com.javadeobfuscator.deobfuscator.transformers.general.removers.IllegalSignatureRemover;
20+
import com.javadeobfuscator.deobfuscator.transformers.general.removers.IllegalVarargsRemover;
21+
import com.javadeobfuscator.deobfuscator.transformers.general.removers.LineNumberRemover;
22+
import com.javadeobfuscator.deobfuscator.transformers.general.removers.SyntheticBridgeRemover;
23+
1924
public class Transformers {
2025
public static class Allatori {
2126
public static final Class<? extends Transformer> STRING_ENCRYPTION = com.javadeobfuscator.deobfuscator.transformers.allatori.StringEncryptionTransformer.class;
@@ -33,10 +38,14 @@ public static class Stringer {
3338
}
3439

3540
public static class General {
36-
public static final Class<? extends Transformer> SYNTHETIC_BRIDGE = com.javadeobfuscator.deobfuscator.transformers.general.SyntheticBridgeTransformer.class;
3741
public static final Class<? extends Transformer> PEEPHOLE_OPTIMIZER = com.javadeobfuscator.deobfuscator.transformers.general.peephole.PeepholeOptimizer.class;
38-
public static final Class<? extends Transformer> LINENUMBER_REMOVER = com.javadeobfuscator.deobfuscator.transformers.general.LineNumberRemover.class;
39-
public static final Class<? extends Transformer> ILLEGAL_VARARGS = com.javadeobfuscator.deobfuscator.transformers.general.IllegalVarargsTransformer.class;
42+
43+
public static class Removers {
44+
public static final Class<? extends Transformer> ILLEGAL_VARARGS = IllegalVarargsRemover.class;
45+
public static final Class<? extends Transformer> LINE_NUMBERS = LineNumberRemover.class;
46+
public static final Class<? extends Transformer> ILLEGAL_SIGNATURE = IllegalSignatureRemover.class;
47+
public static final Class<? extends Transformer> SYNTHETIC_BRIDGE = SyntheticBridgeRemover.class;
48+
}
4049
}
4150

4251
public static class Smoke {

0 commit comments

Comments
 (0)