Skip to content

Commit 0c11275

Browse files
Cubxitysamczsun
authored andcommitted
Changes to prevent deobfuscator from skipping certain classes (#441)
* bump asm, catch exception instead && accept class that is a directory * try catch if frame analyzer failed * bump for jitpack to rebuild
1 parent 06b6349 commit 0c11275

File tree

4 files changed

+62
-37
lines changed

4 files changed

+62
-37
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Deobfuscator [![Build Status](https://ci.samczsun.com/buildStatus/icon?job=java-deobfuscator/Deobfuscator)](https://ci.samczsun.com/job/java-deobfuscator/job/Deobfuscator)
2-
2+
33
This project aims to deobfuscate most commercially-available obfuscators for Java.
44

55
## Update 02/20/18

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<version>1.0.0</version>
77
<properties>
88
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
9-
<version.asm>6.0</version.asm>
9+
<version.asm>7.1</version.asm>
1010
</properties>
1111
<build>
1212
<sourceDirectory>src/main/java</sourceDirectory>
@@ -55,10 +55,10 @@
5555
</includes>
5656
</artifactSet>
5757
<relocations>
58-
<relocation>
58+
<!--<relocation>
5959
<pattern>org.objectweb.asm</pattern>
6060
<shadedPattern>com.javadeobfuscator.org.objectweb.asm</shadedPattern>
61-
</relocation>
61+
</relocation>-->
6262
</relocations>
6363
</configuration>
6464
</execution>

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

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,41 @@
1616

1717
package com.javadeobfuscator.deobfuscator;
1818

19-
import com.javadeobfuscator.deobfuscator.asm.*;
20-
import com.javadeobfuscator.deobfuscator.config.*;
21-
import com.javadeobfuscator.deobfuscator.exceptions.*;
22-
import com.javadeobfuscator.deobfuscator.rules.*;
23-
import com.javadeobfuscator.deobfuscator.transformers.*;
24-
import com.javadeobfuscator.deobfuscator.utils.*;
25-
import org.apache.commons.io.*;
26-
import org.objectweb.asm.*;
27-
import org.objectweb.asm.commons.*;
28-
import org.objectweb.asm.tree.*;
29-
import org.objectweb.asm.util.*;
30-
import org.slf4j.*;
31-
32-
import java.io.*;
33-
import java.lang.reflect.*;
34-
import java.util.AbstractMap.*;
19+
import com.javadeobfuscator.deobfuscator.asm.ConstantPool;
20+
import com.javadeobfuscator.deobfuscator.config.Configuration;
21+
import com.javadeobfuscator.deobfuscator.config.TransformerConfig;
22+
import com.javadeobfuscator.deobfuscator.exceptions.NoClassInPathException;
23+
import com.javadeobfuscator.deobfuscator.rules.Rule;
24+
import com.javadeobfuscator.deobfuscator.rules.Rules;
25+
import com.javadeobfuscator.deobfuscator.transformers.Transformer;
26+
import com.javadeobfuscator.deobfuscator.utils.ClassTree;
27+
import com.javadeobfuscator.deobfuscator.utils.Utils;
28+
import org.apache.commons.io.IOUtils;
29+
import org.objectweb.asm.ClassReader;
30+
import org.objectweb.asm.ClassWriter;
31+
import org.objectweb.asm.Opcodes;
32+
import org.objectweb.asm.commons.JSRInlinerAdapter;
33+
import org.objectweb.asm.tree.AbstractInsnNode;
34+
import org.objectweb.asm.tree.ClassNode;
35+
import org.objectweb.asm.tree.MethodInsnNode;
36+
import org.objectweb.asm.tree.MethodNode;
37+
import org.objectweb.asm.util.CheckClassAdapter;
38+
import org.slf4j.Logger;
39+
import org.slf4j.LoggerFactory;
40+
41+
import java.io.File;
42+
import java.io.FileOutputStream;
43+
import java.io.IOException;
44+
import java.lang.reflect.Modifier;
45+
import java.util.AbstractMap.SimpleEntry;
3546
import java.util.*;
36-
import java.util.Map.*;
37-
import java.util.regex.*;
38-
import java.util.zip.*;
47+
import java.util.Map.Entry;
48+
import java.util.regex.Matcher;
49+
import java.util.regex.Pattern;
50+
import java.util.regex.PatternSyntaxException;
51+
import java.util.zip.ZipEntry;
52+
import java.util.zip.ZipFile;
53+
import java.util.zip.ZipOutputStream;
3954

4055
public class Deobfuscator {
4156
private Map<String, ClassNode> classpath = new HashMap<>();
@@ -165,7 +180,7 @@ private void loadInput() throws IOException {
165180
Enumeration<? extends ZipEntry> e = zipIn.entries();
166181
while (e.hasMoreElements()) {
167182
ZipEntry next = e.nextElement();
168-
if (next.isDirectory()) {
183+
if (next.isDirectory() && !next.getName().endsWith(".class/")) {
169184
continue;
170185
}
171186

@@ -180,7 +195,7 @@ private void loadInput() throws IOException {
180195
public void loadInput(String name, byte[] data) {
181196
boolean passthrough = true;
182197

183-
if (name.endsWith(".class")) {
198+
if (name.endsWith(".class") || name.endsWith(".class/")) {
184199
try {
185200
ClassReader reader = new ClassReader(data);
186201
ClassNode node = new ClassNode();
@@ -202,7 +217,7 @@ public void loadInput(String name, byte[] data) {
202217
} else {
203218
classpath.put(node.name, node);
204219
}
205-
} catch (IllegalArgumentException x) {
220+
} catch (Exception x) {
206221
logger.error("Could not parse {} (is it a class file?)", name, x);
207222
}
208223
}

src/main/java/com/javadeobfuscator/deobfuscator/transformers/general/peephole/DeadCodeRemover.java

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

1717
package com.javadeobfuscator.deobfuscator.transformers.general.peephole;
1818

19-
import com.javadeobfuscator.deobfuscator.config.*;
20-
import com.javadeobfuscator.deobfuscator.transformers.*;
21-
import com.javadeobfuscator.deobfuscator.utils.*;
22-
import org.objectweb.asm.tree.*;
23-
import org.objectweb.asm.tree.analysis.*;
19+
import com.javadeobfuscator.deobfuscator.config.TransformerConfig;
20+
import com.javadeobfuscator.deobfuscator.transformers.Transformer;
21+
import com.javadeobfuscator.deobfuscator.utils.InstructionModifier;
22+
import com.javadeobfuscator.deobfuscator.utils.Utils;
23+
import org.objectweb.asm.tree.ClassNode;
24+
import org.objectweb.asm.tree.MethodNode;
25+
import org.objectweb.asm.tree.analysis.Analyzer;
26+
import org.objectweb.asm.tree.analysis.BasicInterpreter;
27+
import org.objectweb.asm.tree.analysis.BasicValue;
28+
import org.objectweb.asm.tree.analysis.Frame;
2429

2530
public class DeadCodeRemover extends Transformer<TransformerConfig> {
2631
@Override
@@ -32,13 +37,18 @@ public boolean transform() throws Throwable {
3237

3338
InstructionModifier modifier = new InstructionModifier();
3439

35-
Frame<BasicValue>[] frames = new Analyzer<>(new BasicInterpreter()).analyze(classNode.name, methodNode);
36-
for (int i = 0; i < methodNode.instructions.size(); i++) {
37-
if (!Utils.isInstruction(methodNode.instructions.get(i))) continue;
38-
if (frames[i] != null) continue;
40+
try {
41+
Frame<BasicValue>[] frames = new Analyzer<>(new BasicInterpreter()).analyze(classNode.name, methodNode);
42+
for (int i = 0; i < methodNode.instructions.size(); i++) {
43+
if (!Utils.isInstruction(methodNode.instructions.get(i))) continue;
44+
if (frames[i] != null) continue;
3945

40-
modifier.remove(methodNode.instructions.get(i));
41-
deadInstructions++;
46+
modifier.remove(methodNode.instructions.get(i));
47+
deadInstructions++;
48+
}
49+
} catch (Exception x) {
50+
logger.error("Error analyzing frames for method ", x);
51+
continue;
4252
}
4353

4454
modifier.apply(methodNode);

0 commit comments

Comments
 (0)