Skip to content

Commit

Permalink
Changes to prevent deobfuscator from skipping certain classes (java-d…
Browse files Browse the repository at this point in the history
…eobfuscator#441)

* bump asm, catch exception instead && accept class that is a directory

* try catch if frame analyzer failed

* bump for jitpack to rebuild
  • Loading branch information
Cubxity authored and samczsun committed Aug 19, 2019
1 parent 06b6349 commit 0c11275
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 37 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Deobfuscator [![Build Status](https://ci.samczsun.com/buildStatus/icon?job=java-deobfuscator/Deobfuscator)](https://ci.samczsun.com/job/java-deobfuscator/job/Deobfuscator)

This project aims to deobfuscate most commercially-available obfuscators for Java.

## Update 02/20/18
Expand Down
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<version.asm>6.0</version.asm>
<version.asm>7.1</version.asm>
</properties>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
Expand Down Expand Up @@ -55,10 +55,10 @@
</includes>
</artifactSet>
<relocations>
<relocation>
<!--<relocation>
<pattern>org.objectweb.asm</pattern>
<shadedPattern>com.javadeobfuscator.org.objectweb.asm</shadedPattern>
</relocation>
</relocation>-->
</relocations>
</configuration>
</execution>
Expand Down
59 changes: 37 additions & 22 deletions src/main/java/com/javadeobfuscator/deobfuscator/Deobfuscator.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,41 @@

package com.javadeobfuscator.deobfuscator;

import com.javadeobfuscator.deobfuscator.asm.*;
import com.javadeobfuscator.deobfuscator.config.*;
import com.javadeobfuscator.deobfuscator.exceptions.*;
import com.javadeobfuscator.deobfuscator.rules.*;
import com.javadeobfuscator.deobfuscator.transformers.*;
import com.javadeobfuscator.deobfuscator.utils.*;
import org.apache.commons.io.*;
import org.objectweb.asm.*;
import org.objectweb.asm.commons.*;
import org.objectweb.asm.tree.*;
import org.objectweb.asm.util.*;
import org.slf4j.*;

import java.io.*;
import java.lang.reflect.*;
import java.util.AbstractMap.*;
import com.javadeobfuscator.deobfuscator.asm.ConstantPool;
import com.javadeobfuscator.deobfuscator.config.Configuration;
import com.javadeobfuscator.deobfuscator.config.TransformerConfig;
import com.javadeobfuscator.deobfuscator.exceptions.NoClassInPathException;
import com.javadeobfuscator.deobfuscator.rules.Rule;
import com.javadeobfuscator.deobfuscator.rules.Rules;
import com.javadeobfuscator.deobfuscator.transformers.Transformer;
import com.javadeobfuscator.deobfuscator.utils.ClassTree;
import com.javadeobfuscator.deobfuscator.utils.Utils;
import org.apache.commons.io.IOUtils;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.JSRInlinerAdapter;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.util.CheckClassAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.AbstractMap.SimpleEntry;
import java.util.*;
import java.util.Map.*;
import java.util.regex.*;
import java.util.zip.*;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class Deobfuscator {
private Map<String, ClassNode> classpath = new HashMap<>();
Expand Down Expand Up @@ -165,7 +180,7 @@ private void loadInput() throws IOException {
Enumeration<? extends ZipEntry> e = zipIn.entries();
while (e.hasMoreElements()) {
ZipEntry next = e.nextElement();
if (next.isDirectory()) {
if (next.isDirectory() && !next.getName().endsWith(".class/")) {
continue;
}

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

if (name.endsWith(".class")) {
if (name.endsWith(".class") || name.endsWith(".class/")) {
try {
ClassReader reader = new ClassReader(data);
ClassNode node = new ClassNode();
Expand All @@ -202,7 +217,7 @@ public void loadInput(String name, byte[] data) {
} else {
classpath.put(node.name, node);
}
} catch (IllegalArgumentException x) {
} catch (Exception x) {
logger.error("Could not parse {} (is it a class file?)", name, x);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,16 @@

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

import com.javadeobfuscator.deobfuscator.config.*;
import com.javadeobfuscator.deobfuscator.transformers.*;
import com.javadeobfuscator.deobfuscator.utils.*;
import org.objectweb.asm.tree.*;
import org.objectweb.asm.tree.analysis.*;
import com.javadeobfuscator.deobfuscator.config.TransformerConfig;
import com.javadeobfuscator.deobfuscator.transformers.Transformer;
import com.javadeobfuscator.deobfuscator.utils.InstructionModifier;
import com.javadeobfuscator.deobfuscator.utils.Utils;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.analysis.Analyzer;
import org.objectweb.asm.tree.analysis.BasicInterpreter;
import org.objectweb.asm.tree.analysis.BasicValue;
import org.objectweb.asm.tree.analysis.Frame;

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

InstructionModifier modifier = new InstructionModifier();

Frame<BasicValue>[] frames = new Analyzer<>(new BasicInterpreter()).analyze(classNode.name, methodNode);
for (int i = 0; i < methodNode.instructions.size(); i++) {
if (!Utils.isInstruction(methodNode.instructions.get(i))) continue;
if (frames[i] != null) continue;
try {
Frame<BasicValue>[] frames = new Analyzer<>(new BasicInterpreter()).analyze(classNode.name, methodNode);
for (int i = 0; i < methodNode.instructions.size(); i++) {
if (!Utils.isInstruction(methodNode.instructions.get(i))) continue;
if (frames[i] != null) continue;

modifier.remove(methodNode.instructions.get(i));
deadInstructions++;
modifier.remove(methodNode.instructions.get(i));
deadInstructions++;
}
} catch (Exception x) {
logger.error("Error analyzing frames for method ", x);
continue;
}

modifier.apply(methodNode);
Expand Down

0 comments on commit 0c11275

Please sign in to comment.