diff options
| author | 2018-07-23 13:07:16 +0800 | |
|---|---|---|
| committer | 2018-07-23 13:07:16 +0800 | |
| commit | 8c5d13ed87f92e982a3de489543f77da8a06d7ff (patch) | |
| tree | 4feb867b492818524559e4447dd5ef76e7ec40f7 | |
| parent | fix source index tokens for inner classes that are not mapped (diff) | |
| download | enigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.tar.gz enigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.tar.xz enigma-8c5d13ed87f92e982a3de489543f77da8a06d7ff.zip | |
remove injected DUP + getClass() + POP instructions
| -rw-r--r-- | src/main/java/cuchaz/enigma/TranslatingTypeLoader.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java index eb780ee9..8300f21c 100644 --- a/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java +++ b/src/main/java/cuchaz/enigma/TranslatingTypeLoader.java | |||
| @@ -22,7 +22,10 @@ import cuchaz.enigma.mapping.entry.ReferencedEntryPool; | |||
| 22 | import cuchaz.enigma.mapping.Translator; | 22 | import cuchaz.enigma.mapping.Translator; |
| 23 | import org.objectweb.asm.ClassWriter; | 23 | import org.objectweb.asm.ClassWriter; |
| 24 | import org.objectweb.asm.Opcodes; | 24 | import org.objectweb.asm.Opcodes; |
| 25 | import org.objectweb.asm.tree.AbstractInsnNode; | ||
| 25 | import org.objectweb.asm.tree.ClassNode; | 26 | import org.objectweb.asm.tree.ClassNode; |
| 27 | import org.objectweb.asm.tree.MethodInsnNode; | ||
| 28 | import org.objectweb.asm.tree.MethodNode; | ||
| 26 | 29 | ||
| 27 | import java.util.List; | 30 | import java.util.List; |
| 28 | 31 | ||
| @@ -89,6 +92,31 @@ public class TranslatingTypeLoader extends CachingTypeLoader implements ITransla | |||
| 89 | return null; | 92 | return null; |
| 90 | } | 93 | } |
| 91 | 94 | ||
| 95 | |||
| 96 | // remove <obj>.getClass() calls that are seemingly injected | ||
| 97 | // DUP | ||
| 98 | // INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class; | ||
| 99 | // POP | ||
| 100 | for (MethodNode methodNode : node.methods){ | ||
| 101 | AbstractInsnNode insnNode = methodNode.instructions.getFirst(); | ||
| 102 | while (insnNode != null){ | ||
| 103 | if (insnNode instanceof MethodInsnNode && insnNode.getOpcode() == Opcodes.INVOKEVIRTUAL){ | ||
| 104 | MethodInsnNode methodInsnNode = (MethodInsnNode)insnNode; | ||
| 105 | if (methodInsnNode.name.equals("getClass") && methodInsnNode.owner.equals("java/lang/Object") && methodInsnNode.desc.equals("()Ljava/lang/Class")){ | ||
| 106 | AbstractInsnNode previous = methodInsnNode.getPrevious(); | ||
| 107 | AbstractInsnNode next = methodInsnNode.getNext(); | ||
| 108 | if (previous.getOpcode() == Opcodes.DUP && next.getOpcode() == Opcodes.POP){ | ||
| 109 | insnNode = previous.getPrevious();//reset the iterator so it gets the new next instruction | ||
| 110 | methodNode.instructions.remove(previous); | ||
| 111 | methodNode.instructions.remove(methodInsnNode); | ||
| 112 | methodNode.instructions.remove(next); | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | insnNode = insnNode.getNext(); | ||
| 117 | } | ||
| 118 | } | ||
| 119 | |||
| 92 | ClassWriter writer = new ClassWriter(0); | 120 | ClassWriter writer = new ClassWriter(0); |
| 93 | transformInto(node, writer); | 121 | transformInto(node, writer); |
| 94 | 122 | ||