", "()V", false);
mv.visitInsn(ATHROW);
mv.visitLabel(l9);
- mv.visitFrame(Opcodes.F_APPEND,2, new Object[] {"java/lang/Object", "java/lang/Object"}, 0, null);
+ mv.visitFrame(Opcodes.F_APPEND, 2, new Object[]{"java/lang/Object", "java/lang/Object"}, 0, null);
mv.visitVarInsn(ALOAD, 3);
mv.visitVarInsn(ASTORE, 11);
Label l11 = new Label();
@@ -752,7 +753,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitJumpInsn(GOTO, l15);
Label l16 = new Label();
mv.visitLabel(l16);
- mv.visitFrame(Opcodes.F_FULL, 16, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", Opcodes.INTEGER}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 16, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", Opcodes.INTEGER}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 14);
mv.visitVarInsn(ILOAD, 15);
mv.visitVarInsn(ALOAD, 13);
@@ -801,7 +802,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitJumpInsn(GOTO, l23);
Label l24 = new Label();
mv.visitLabel(l24);
- mv.visitFrame(Opcodes.F_FULL, 19, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", Opcodes.INTEGER}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 19, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", Opcodes.INTEGER}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 17);
mv.visitVarInsn(ILOAD, 18);
mv.visitVarInsn(ALOAD, 16);
@@ -849,7 +850,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitJumpInsn(GOTO, l31);
Label l32 = new Label();
mv.visitLabel(l32);
- mv.visitFrame(Opcodes.F_FULL, 22, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", Opcodes.INTEGER}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 22, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", Opcodes.INTEGER}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 20);
mv.visitVarInsn(ILOAD, 21);
mv.visitVarInsn(ALOAD, 19);
@@ -883,9 +884,9 @@ public static MethodNode heavyBSM(String methodName, String className) {
Label l36 = new Label();
Label l37 = new Label();
Label l38 = new Label();
- mv.visitTableSwitchInsn(0, 1, l38, new Label[] { l36, l37 });
+ mv.visitTableSwitchInsn(0, 1, l38, new Label[]{l36, l37});
mv.visitLabel(l36);
- mv.visitFrame(Opcodes.F_FULL, 22, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 22, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 4);
mv.visitVarInsn(ASTORE, 22);
Label l39 = new Label();
@@ -901,7 +902,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;", false);
mv.visitVarInsn(ASTORE, 24);
mv.visitLabel(l0);
- mv.visitFrame(Opcodes.F_APPEND,3, new Object[] {"java/lang/Object", "java/lang/reflect/Field", "java/lang/Class"}, 0, null);
+ mv.visitFrame(Opcodes.F_APPEND, 3, new Object[]{"java/lang/Object", "java/lang/reflect/Field", "java/lang/Class"}, 0, null);
mv.visitVarInsn(ALOAD, 24);
mv.visitVarInsn(ALOAD, 18);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;", false);
@@ -910,7 +911,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
Label l41 = new Label();
mv.visitJumpInsn(GOTO, l41);
mv.visitLabel(l2);
- mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/NoSuchFieldException"});
+ mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/NoSuchFieldException"});
mv.visitVarInsn(ASTORE, 25);
Label l42 = new Label();
mv.visitLabel(l42);
@@ -940,7 +941,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
Label l47 = new Label();
Label l48 = new Label();
Label l49 = new Label();
- mv.visitTableSwitchInsn(0, 3, l49, new Label[] { l45, l46, l47, l48 });
+ mv.visitTableSwitchInsn(0, 3, l49, new Label[]{l45, l46, l47, l48});
mv.visitLabel(l45);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitVarInsn(ALOAD, 12);
@@ -1002,7 +1003,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitLabel(l55);
mv.visitJumpInsn(GOTO, l51);
mv.visitLabel(l37);
- mv.visitFrame(Opcodes.F_CHOP,3, null, 0, null);
+ mv.visitFrame(Opcodes.F_CHOP, 3, null, 0, null);
mv.visitVarInsn(ALOAD, 4);
mv.visitVarInsn(ASTORE, 25);
Label l56 = new Label();
@@ -1020,9 +1021,9 @@ public static MethodNode heavyBSM(String methodName, String className) {
Label l58 = new Label();
Label l59 = new Label();
Label l60 = new Label();
- mv.visitTableSwitchInsn(0, 1, l60, new Label[] { l58, l59 });
+ mv.visitTableSwitchInsn(0, 1, l60, new Label[]{l58, l59});
mv.visitLabel(l58);
- mv.visitFrame(Opcodes.F_FULL, 27, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String", Opcodes.TOP, Opcodes.TOP, Opcodes.TOP, "java/lang/Object", "java/lang/invoke/MethodType"}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 27, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String", Opcodes.TOP, Opcodes.TOP, Opcodes.TOP, "java/lang/Object", "java/lang/invoke/MethodType"}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 12);
mv.visitTypeInsn(CHECKCAST, "java/lang/invoke/MethodHandles$Lookup");
mv.visitVarInsn(ALOAD, 15);
@@ -1053,11 +1054,11 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitLabel(l63);
mv.visitJumpInsn(GOTO, l51);
mv.visitLabel(l38);
- mv.visitFrame(Opcodes.F_FULL, 22, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 22, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[]{});
mv.visitInsn(ACONST_NULL);
mv.visitVarInsn(ASTORE, 10);
mv.visitLabel(l51);
- mv.visitFrame(Opcodes.F_FULL, 22, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/invoke/MethodHandle", "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[] {});
+ mv.visitFrame(Opcodes.F_FULL, 22, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/invoke/MethodHandle", "java/lang/Object", "java/lang/Object", "[C", "[C", "java/lang/Class", "[C", "[C", "java/lang/String", "[C", "[C", "java/lang/String"}, 0, new Object[]{});
mv.visitVarInsn(ALOAD, 10);
mv.visitVarInsn(ALOAD, 2);
mv.visitTypeInsn(CHECKCAST, "java/lang/invoke/MethodType");
@@ -1072,7 +1073,7 @@ public static MethodNode heavyBSM(String methodName, String className) {
mv.visitLabel(l4);
mv.visitInsn(ARETURN);
mv.visitLabel(l5);
- mv.visitFrame(Opcodes.F_FULL, 13, new Object[] {"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object"}, 1, new Object[] {"java/lang/Throwable"});
+ mv.visitFrame(Opcodes.F_FULL, 13, new Object[]{"java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", "java/lang/Object", Opcodes.TOP, "java/lang/Object", "java/lang/Object"}, 1, new Object[]{"java/lang/Throwable"});
mv.visitVarInsn(ASTORE, 13);
Label l65 = new Label();
mv.visitLabel(l65);
diff --git a/src/main/java/me/itzsomebody/radon/methods/StringEncryption.java b/src/main/java/me/itzsomebody/radon/methods/StringEncryption.java
index e25b5d84..d9ff9abb 100644
--- a/src/main/java/me/itzsomebody/radon/methods/StringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/methods/StringEncryption.java
@@ -1,9 +1,12 @@
package me.itzsomebody.radon.methods;
+import me.itzsomebody.radon.transformers.stringencryption.HeavyStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.LightStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.NormalStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.SuperLightStringEncryption;
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.MethodNode;
-import me.itzsomebody.radon.transformers.stringencryption.*;
/**
* Class containing {@link MethodNode}s needed to decrypt a {@link String} for the
diff --git a/src/main/java/me/itzsomebody/radon/templates/HeavyStringEncryption.java b/src/main/java/me/itzsomebody/radon/templates/HeavyStringEncryption.java
index ce939440..5cfb7322 100644
--- a/src/main/java/me/itzsomebody/radon/templates/HeavyStringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/templates/HeavyStringEncryption.java
@@ -1,10 +1,10 @@
package me.itzsomebody.radon.templates;
-import javax.crypto.*;
-import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
public class HeavyStringEncryption {
public static String decrypt(Object strToDecrypt, Object random, Object secret) {
diff --git a/src/main/java/me/itzsomebody/radon/templates/LightInvokeDynamic.java b/src/main/java/me/itzsomebody/radon/templates/LightInvokeDynamic.java
index 2d1767d6..b8bd4922 100644
--- a/src/main/java/me/itzsomebody/radon/templates/LightInvokeDynamic.java
+++ b/src/main/java/me/itzsomebody/radon/templates/LightInvokeDynamic.java
@@ -7,12 +7,12 @@
class LightInvokeDynamic {
public static Object LightInvokeDynamic(Object lookupName,
- Object callerName,
- Object callerType,
- Object opcodeIndicator,
- Object originalClassName,
- Object originalMethodName,
- Object originalMethodSignature) {
+ Object callerName,
+ Object callerType,
+ Object opcodeIndicator,
+ Object originalClassName,
+ Object originalMethodName,
+ Object originalMethodSignature) {
try {
char[] encClassNameChars = originalClassName.toString().toCharArray();
char[] classNameChars = new char[encClassNameChars.length];
diff --git a/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java b/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
index 3010b092..0802abe1 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
@@ -1,12 +1,14 @@
package me.itzsomebody.radon.transformers;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import me.itzsomebody.radon.utils.CustomRegexUtils;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.CodeSizeEvaluator;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
-import me.itzsomebody.radon.utils.CustomRegexUtils;
-
-import java.util.*;
/**
* Abstract class used to make transformers.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java b/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
index fb011282..8008bcd8 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
@@ -1,15 +1,23 @@
package me.itzsomebody.radon.transformers.flow;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.analyzer.StackAnalyzer;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import org.objectweb.asm.tree.*;
-
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.JumpInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.VarInsnNode;
/**
* This transformer attempts to increase flow obsucurity by making additional
diff --git a/src/main/java/me/itzsomebody/radon/transformers/flow/LightFlowObfuscation.java b/src/main/java/me/itzsomebody/radon/transformers/flow/LightFlowObfuscation.java
index 20083f9a..ed4f140b 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/flow/LightFlowObfuscation.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/flow/LightFlowObfuscation.java
@@ -1,15 +1,15 @@
package me.itzsomebody.radon.transformers.flow;
-import me.itzsomebody.radon.utils.NumberUtils;
-import me.itzsomebody.radon.utils.StringUtils;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import me.itzsomebody.radon.utils.StringUtils;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.JumpInsnNode;
/**
* Transformer that sets GOTO->LABEL instructions as a condition which is always true.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/flow/NormalFlowObfuscation.java b/src/main/java/me/itzsomebody/radon/transformers/flow/NormalFlowObfuscation.java
index fe3b3976..fdaed2a4 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/flow/NormalFlowObfuscation.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/flow/NormalFlowObfuscation.java
@@ -1,17 +1,21 @@
package me.itzsomebody.radon.transformers.flow;
+import java.util.Stack;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.analyzer.StackAnalyzer;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.Stack;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.JumpInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.VarInsnNode;
/**
* Transformer that applies multiple (skidded) flow obfuscations.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/HeavyInvokeDynamic.java b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/HeavyInvokeDynamic.java
index bc2382ab..74a13a21 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/HeavyInvokeDynamic.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/HeavyInvokeDynamic.java
@@ -1,19 +1,20 @@
package me.itzsomebody.radon.transformers.invokedynamic;
-import org.objectweb.asm.Handle;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.*;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.InvokeDynamicBSM;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.InvokeDynamicInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.TypeInsnNode;
/**
* Transformer that applies an InvokeDynamic obfuscation to field and
diff --git a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/LightInvokeDynamic.java b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/LightInvokeDynamic.java
index 1b7c56f3..e2edaefc 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/LightInvokeDynamic.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/LightInvokeDynamic.java
@@ -1,16 +1,18 @@
package me.itzsomebody.radon.transformers.invokedynamic;
-import org.objectweb.asm.Handle;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.InvokeDynamicBSM;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InvokeDynamicInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.TypeInsnNode;
/**
* Transformer that applies an InvokeDynamic obfuscation which
diff --git a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/NormalInvokeDynamic.java b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/NormalInvokeDynamic.java
index 9a5a0864..4a19f401 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/NormalInvokeDynamic.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/invokedynamic/NormalInvokeDynamic.java
@@ -1,16 +1,18 @@
package me.itzsomebody.radon.transformers.invokedynamic;
-import org.objectweb.asm.Handle;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.InvokeDynamicBSM;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InvokeDynamicInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.TypeInsnNode;
/**
* Transformer that applies an InvokeDynamic which attempts to prevent
diff --git a/src/main/java/me/itzsomebody/radon/transformers/linenumbers/ObfuscateLineNumbers.java b/src/main/java/me/itzsomebody/radon/transformers/linenumbers/ObfuscateLineNumbers.java
index 37f455ff..af815ccf 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/linenumbers/ObfuscateLineNumbers.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/linenumbers/ObfuscateLineNumbers.java
@@ -1,14 +1,12 @@
package me.itzsomebody.radon.transformers.linenumbers;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.NumberUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LineNumberNode;
/**
* Transformer that applies a line number obfuscation by changing the
diff --git a/src/main/java/me/itzsomebody/radon/transformers/linenumbers/RemoveLineNumbers.java b/src/main/java/me/itzsomebody/radon/transformers/linenumbers/RemoveLineNumbers.java
index 2a7187c3..bba079ea 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/linenumbers/RemoveLineNumbers.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/linenumbers/RemoveLineNumbers.java
@@ -1,13 +1,11 @@
package me.itzsomebody.radon.transformers.linenumbers;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LineNumberNode;
/**
* Transformer that applies a line number obfuscation by removing them.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/localvariables/ObfuscateLocalVariables.java b/src/main/java/me/itzsomebody/radon/transformers/localvariables/ObfuscateLocalVariables.java
index 62e579dd..4339e16f 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/localvariables/ObfuscateLocalVariables.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/localvariables/ObfuscateLocalVariables.java
@@ -1,13 +1,10 @@
package me.itzsomebody.radon.transformers.localvariables;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that applies a local variable obfuscation by changing the names.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/localvariables/RemoveLocalVariables.java b/src/main/java/me/itzsomebody/radon/transformers/localvariables/RemoveLocalVariables.java
index cb4a35f2..784f1bb3 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/localvariables/RemoveLocalVariables.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/localvariables/RemoveLocalVariables.java
@@ -1,12 +1,9 @@
package me.itzsomebody.radon.transformers.localvariables;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that applies a local variable obfuscation by removing t
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/Crasher.java b/src/main/java/me/itzsomebody/radon/transformers/misc/Crasher.java
index d3f2b266..4579612d 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/Crasher.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/Crasher.java
@@ -1,12 +1,10 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that applies a crashing technique by exploiting class signature parsing.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/Expiry.java b/src/main/java/me/itzsomebody/radon/transformers/misc/Expiry.java
index a3bccf57..6e3c62e5 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/Expiry.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/Expiry.java
@@ -1,11 +1,10 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that adds an expiration block of code to methods.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/HideCode.java b/src/main/java/me/itzsomebody/radon/transformers/misc/HideCode.java
index 72e73aea..e26bea2e 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/HideCode.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/HideCode.java
@@ -1,11 +1,10 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that applies a code hiding technique by applying synthetic modifiers to the class, fields, and methods.
* Known to have problems with Spigot plugins with EventHandlers.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/InnerClassRemover.java b/src/main/java/me/itzsomebody/radon/transformers/misc/InnerClassRemover.java
index a4e2d444..814eecbe 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/InnerClassRemover.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/InnerClassRemover.java
@@ -1,10 +1,9 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer which removes innerclass infomation.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/NumberObfuscation.java b/src/main/java/me/itzsomebody/radon/transformers/misc/NumberObfuscation.java
index deb4b818..6270e03d 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/NumberObfuscation.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/NumberObfuscation.java
@@ -1,14 +1,13 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
-import org.objectweb.asm.tree.*;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.NumberUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.InsnNode;
/**
* Transformer that splits up integers into simple arithmetic evaluations.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/Shuffler.java b/src/main/java/me/itzsomebody/radon/transformers/misc/Shuffler.java
index a5f22c99..d4dbe153 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/Shuffler.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/Shuffler.java
@@ -1,10 +1,9 @@
package me.itzsomebody.radon.transformers.misc;
-import me.itzsomebody.radon.transformers.AbstractTransformer;
-import me.itzsomebody.radon.utils.LoggerUtils;
-
import java.util.Collections;
import java.util.concurrent.atomic.AtomicInteger;
+import me.itzsomebody.radon.transformers.AbstractTransformer;
+import me.itzsomebody.radon.utils.LoggerUtils;
/**
* Transformer which shuffles class members.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/StringPool.java b/src/main/java/me/itzsomebody/radon/transformers/misc/StringPool.java
index 3ff18d74..11b574ad 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/StringPool.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/StringPool.java
@@ -1,15 +1,17 @@
package me.itzsomebody.radon.transformers.misc;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.tree.*;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
/**
* Transformer that takes all the strings in a class and pools them into a
diff --git a/src/main/java/me/itzsomebody/radon/transformers/misc/TrashClasses.java b/src/main/java/me/itzsomebody/radon/transformers/misc/TrashClasses.java
index 115aa023..f81743ed 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/misc/TrashClasses.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/misc/TrashClasses.java
@@ -1,11 +1,22 @@
package me.itzsomebody.radon.transformers.misc;
+import me.itzsomebody.radon.utils.NumberUtils;
+import me.itzsomebody.radon.utils.StringUtils;
import org.objectweb.asm.Handle;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
-import me.itzsomebody.radon.utils.NumberUtils;
-import me.itzsomebody.radon.utils.StringUtils;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.IincInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.IntInsnNode;
+import org.objectweb.asm.tree.InvokeDynamicInsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.VarInsnNode;
/**
* Not really a transformer. This "transformer" generates trash classes full
diff --git a/src/main/java/me/itzsomebody/radon/transformers/renamer/ClassTree.java b/src/main/java/me/itzsomebody/radon/transformers/renamer/ClassTree.java
index 5ad56458..c3c1c846 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/renamer/ClassTree.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/renamer/ClassTree.java
@@ -1,12 +1,11 @@
package me.itzsomebody.radon.transformers.renamer;
+import java.util.HashSet;
+import java.util.Set;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.MethodNode;
-import java.util.HashSet;
-import java.util.Set;
-
/**
* Specifies subclasses and parents of a class.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java b/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
index 724eb0b5..d4e8065d 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
@@ -1,5 +1,10 @@
package me.itzsomebody.radon.transformers.renamer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
@@ -8,10 +13,9 @@
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.commons.SimpleRemapper;
-import org.objectweb.asm.tree.*;
-
-import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodNode;
/**
* Transformer that renames classes and their members.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/ObfuscateSourceDebug.java b/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/ObfuscateSourceDebug.java
index 765ebd54..e7011fcc 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/ObfuscateSourceDebug.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/ObfuscateSourceDebug.java
@@ -1,13 +1,10 @@
package me.itzsomebody.radon.transformers.sourcedebug;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that obfuscates the source debug attribute by changing the
* corresponding value.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/RemoveSourceDebug.java b/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/RemoveSourceDebug.java
index 1a1db406..3cd00e8b 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/RemoveSourceDebug.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/sourcedebug/RemoveSourceDebug.java
@@ -1,12 +1,9 @@
package me.itzsomebody.radon.transformers.sourcedebug;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that obfuscates the source debug attribute by changing the
* corresponding value.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/sourcename/ObfuscateSourceName.java b/src/main/java/me/itzsomebody/radon/transformers/sourcename/ObfuscateSourceName.java
index 27c82225..c194fcdc 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/sourcename/ObfuscateSourceName.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/sourcename/ObfuscateSourceName.java
@@ -1,13 +1,10 @@
package me.itzsomebody.radon.transformers.sourcename;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that obfuscates the source name attribute by changing the
* corresponding value.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/sourcename/RemoveSourceName.java b/src/main/java/me/itzsomebody/radon/transformers/sourcename/RemoveSourceName.java
index f6c64ff8..d91c6ad0 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/sourcename/RemoveSourceName.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/sourcename/RemoveSourceName.java
@@ -1,12 +1,9 @@
package me.itzsomebody.radon.transformers.sourcename;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.LoggerUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
/**
* Transformer that obfuscates the source name attribute by removing the
* attribute entirely.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/HeavyStringEncryption.java b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/HeavyStringEncryption.java
index 0ad537ff..16601c63 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/HeavyStringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/HeavyStringEncryption.java
@@ -1,10 +1,10 @@
package me.itzsomebody.radon.transformers.stringencryption;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.StringEncryption;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
@@ -12,8 +12,6 @@
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
-import java.util.concurrent.atomic.AtomicInteger;
-
public class HeavyStringEncryption extends AbstractTransformer {
/**
* Indication to not encrypt strings containing Spigot placeholders
diff --git a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/LightStringEncryption.java b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/LightStringEncryption.java
index a4076b2e..107f3117 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/LightStringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/LightStringEncryption.java
@@ -1,17 +1,16 @@
package me.itzsomebody.radon.transformers.stringencryption;
-import me.itzsomebody.radon.utils.NumberUtils;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.StringEncryption;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
+import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
/**
* Transformer that encrypts strings using a stacktrace-backed method.
diff --git a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/NormalStringEncryption.java b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/NormalStringEncryption.java
index db6ee342..96e01915 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/NormalStringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/NormalStringEncryption.java
@@ -1,17 +1,17 @@
package me.itzsomebody.radon.transformers.stringencryption;
-import me.itzsomebody.radon.utils.NumberUtils;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.StringEncryption;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
+import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
/**
* Transformer that encrypts strings the same way {@link LightStringEncryption}
diff --git a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/SuperLightStringEncryption.java b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/SuperLightStringEncryption.java
index 9149b7ec..ed31534d 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/stringencryption/SuperLightStringEncryption.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/stringencryption/SuperLightStringEncryption.java
@@ -1,17 +1,15 @@
package me.itzsomebody.radon.transformers.stringencryption;
-import me.itzsomebody.radon.utils.NumberUtils;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
+import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.methods.StringEncryption;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
+import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
/**
* Transformer that encrypts strings using an extremely simple XOR algorithm.
diff --git a/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java b/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
index 2ffa3b10..4f2ebc85 100644
--- a/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
@@ -2,7 +2,17 @@
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.tree.*;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.IntInsnNode;
+import org.objectweb.asm.tree.JumpInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TypeInsnNode;
/**
* Utils used for operating on bytecode.
diff --git a/src/main/java/me/itzsomebody/radon/utils/FileUtils.java b/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
index 70971ab5..af4b61ef 100644
--- a/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
@@ -2,7 +2,6 @@
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.util.zip.ZipOutputStream;
/**
@@ -37,7 +36,7 @@ public static String renameExistingFile(File existing) {
/**
* Writes a bytes to a {@link ZipOutputStream}.
*
- * @param zos the {@link ZipOutputStream} to write to.
+ * @param zos the {@link ZipOutputStream} to write to.
* @param data bytes to write to output
* @throws IOException if an error happens while writing to output stream.
*/
diff --git a/src/main/java/me/itzsomebody/radon/utils/LoggerUtils.java b/src/main/java/me/itzsomebody/radon/utils/LoggerUtils.java
index 0b890f36..faa7e194 100644
--- a/src/main/java/me/itzsomebody/radon/utils/LoggerUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/LoggerUtils.java
@@ -1,13 +1,13 @@
package me.itzsomebody.radon.utils;
-import me.itzsomebody.radon.Radon;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import me.itzsomebody.radon.Radon;
/**
* Utils to print fancy stuff in the console and to write log file.
diff --git a/src/main/java/me/itzsomebody/radon/utils/StringUtils.java b/src/main/java/me/itzsomebody/radon/utils/StringUtils.java
index be66b0c3..3e961015 100644
--- a/src/main/java/me/itzsomebody/radon/utils/StringUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/StringUtils.java
@@ -1,11 +1,17 @@
package me.itzsomebody.radon.utils;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.List;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
-import java.security.MessageDigest;
-import java.util.*;
-
-import me.itzsomebody.radon.transformers.stringencryption.*;
+import me.itzsomebody.radon.transformers.stringencryption.HeavyStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.LightStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.NormalStringEncryption;
+import me.itzsomebody.radon.transformers.stringencryption.SuperLightStringEncryption;
/**
* Utils for operating, and generating {@link String}s.
diff --git a/src/main/java/me/itzsomebody/radon/utils/WatermarkUtils.java b/src/main/java/me/itzsomebody/radon/utils/WatermarkUtils.java
index 1d68a771..aae8145a 100644
--- a/src/main/java/me/itzsomebody/radon/utils/WatermarkUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/WatermarkUtils.java
@@ -1,8 +1,5 @@
package me.itzsomebody.radon.utils;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.tree.ClassNode;
-
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
@@ -10,6 +7,8 @@
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.tree.ClassNode;
/**
* Watermarking utils for the obfuscator.
From c54c9380222124f49185a781b13a536ccc0014d4 Mon Sep 17 00:00:00 2001
From: ItzSomebody <23221108+ItzSomebody@users.noreply.github.com>
Date: Fri, 11 May 2018 13:09:46 -0700
Subject: [PATCH 004/281] Different way of determining how to set ClassWriter
flags
---
.../itzsomebody/radon/internal/Bootstrap.java | 60 +++++++++----------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
index cdcd2925..0020405a 100644
--- a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
+++ b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
@@ -235,41 +235,41 @@ public void startTheParty(boolean doInit) throws Throwable {
this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
this.logStrings.add(LoggerUtils.stdOut("Writing classes to output"));
for (ClassNode classNode : this.classes.values()) {
- ClassWriter cw = new CustomClassWriter(ClassWriter.COMPUTE_FRAMES);
-
- if (this.watermarkMsg != null) {
- if (this.watermarkType == 0
- && NumberUtils.getRandomInt(10) >= 5) {
- cw.newUTF8("WMID: "
- + StringUtils.aesEncrypt(this.watermarkMsg, this.watermarkKey));
-
- this.logStrings.add(LoggerUtils.stdOut("Watermarking "
- + this.watermarkMsg + " into " + classNode.name));
- } else if (this.watermarkType == 1
- && NumberUtils.getRandomInt(10) >= 5) {
- classNode.signature =
- StringUtils.aesEncrypt("WMID: " + this.watermarkMsg,
- this.watermarkKey);
-
- this.logStrings.add(LoggerUtils.stdOut("Watermarking "
- + this.watermarkMsg + " into " + classNode.name));
- }
+ ClassWriter cw;
+
+ if (classNode.version > Opcodes.V1_5) {
+ cw = new CustomClassWriter(ClassWriter.COMPUTE_FRAMES);
+ } else {
+ cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
}
- cw.newUTF8("RADON" + Radon.VERSION); // :D
try {
classNode.accept(cw);
- } catch (Throwable t) {
- if (t.getMessage() != null
- && t.getMessage().contains("JSR/RET")) {
- cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- classNode.accept(cw);
- } else {
- this.logStrings.add(LoggerUtils
- .stdOut("Error while writing "
- + classNode.name + " -> " + t.getMessage()));
- throw t;
+ if (this.watermarkMsg != null) {
+ if (this.watermarkType == 0
+ && NumberUtils.getRandomInt(10) >= 5) {
+ cw.newUTF8("WMID: "
+ + StringUtils.aesEncrypt(this.watermarkMsg, this.watermarkKey));
+
+ this.logStrings.add(LoggerUtils.stdOut("Watermarking "
+ + this.watermarkMsg + " into " + classNode.name));
+ } else if (this.watermarkType == 1
+ && NumberUtils.getRandomInt(10) >= 5) {
+ classNode.signature =
+ StringUtils.aesEncrypt("WMID: " + this.watermarkMsg,
+ this.watermarkKey);
+
+ this.logStrings.add(LoggerUtils.stdOut("Watermarking "
+ + this.watermarkMsg + " into " + classNode.name));
+ }
}
+
+ cw.newUTF8("RADON" + Radon.VERSION); // :D
+ } catch (Throwable t) {
+ this.logStrings.add(LoggerUtils
+ .stdOut("Error while writing "
+ + classNode.name + " -> " + t.getMessage()));
+ throw t;
}
ZipEntry newEntry = new ZipEntry(classNode.name
From dfcdf22e0ff91b8397708bd289476c938b1bf135 Mon Sep 17 00:00:00 2001
From: ItzSomebody <23221108+ItzSomebody@users.noreply.github.com>
Date: Fri, 11 May 2018 13:13:26 -0700
Subject: [PATCH 005/281] version change
---
CHANGELOG.md | 5 +++++
pom.xml | 2 +-
src/main/java/me/itzsomebody/radon/Radon.java | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index acccbf72..161ad320 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.7.0
+
+* Completely rewrote StackAnalyzer.
+* Changed some internals.
+
## 0.6.1
* Fixed an issue with the invokedynamic transformers which sometimes caused programs to crash with an access exception.
diff --git a/pom.xml b/pom.xml
index e15e559e..bb7b1d30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.itzsomebody
Radon
- 0.6.1
+ 0.7.0
UTF-8
diff --git a/src/main/java/me/itzsomebody/radon/Radon.java b/src/main/java/me/itzsomebody/radon/Radon.java
index de244046..3aaa33ae 100644
--- a/src/main/java/me/itzsomebody/radon/Radon.java
+++ b/src/main/java/me/itzsomebody/radon/Radon.java
@@ -14,7 +14,7 @@ public class Radon {
* Static abuse variables xD
*/
public static String PREFIX = "[Radon]";
- public static String VERSION = "0.6.1";
+ public static String VERSION = "0.7.0";
public static String AUTHORS = "ItzSomebody";
/**
From bf9331963bbde151560d593a1f5b9f93f958aa83 Mon Sep 17 00:00:00 2001
From: ItzSomebody <23221108+ItzSomebody@users.noreply.github.com>
Date: Fri, 11 May 2018 13:42:41 -0700
Subject: [PATCH 006/281] Lots of changes
---
CHANGELOG.md | 5 +
pom.xml | 7 +-
src/main/java/me/itzsomebody/radon/Radon.java | 2 +-
.../itzsomebody/radon/config/ConfigEnum.java | 35 +++
.../radon/config/ConfigWriter.java | 205 ++++++++++++++++
.../me/itzsomebody/radon/gui/MainGUI.java | 225 +++++++++++++++++-
.../itzsomebody/radon/internal/Bootstrap.java | 56 +++--
.../transformers/AbstractTransformer.java | 26 ++
.../radon/transformers/renamer/Renamer.java | 29 ++-
.../radon/utils/BytecodeUtils.java | 27 ---
.../me/itzsomebody/radon/utils/FileUtils.java | 29 ++-
.../resources/META-INF/commons-io-license.txt | 203 ----------------
12 files changed, 580 insertions(+), 269 deletions(-)
create mode 100644 src/main/java/me/itzsomebody/radon/config/ConfigEnum.java
create mode 100644 src/main/java/me/itzsomebody/radon/config/ConfigWriter.java
delete mode 100644 src/main/resources/META-INF/commons-io-license.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 161ad320..02484bc6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.8.0
+
+* Changed even more internals.
+* Resources can now be processed by obfuscator.
+
## 0.7.0
* Completely rewrote StackAnalyzer.
diff --git a/pom.xml b/pom.xml
index bb7b1d30..5a374dfc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.itzsomebody
Radon
- 0.7.0
+ 0.8.0
UTF-8
@@ -74,11 +74,6 @@
-
- commons-io
- commons-io
- 2.6
-
org.yaml
snakeyaml
diff --git a/src/main/java/me/itzsomebody/radon/Radon.java b/src/main/java/me/itzsomebody/radon/Radon.java
index 3aaa33ae..7ea03992 100644
--- a/src/main/java/me/itzsomebody/radon/Radon.java
+++ b/src/main/java/me/itzsomebody/radon/Radon.java
@@ -14,7 +14,7 @@ public class Radon {
* Static abuse variables xD
*/
public static String PREFIX = "[Radon]";
- public static String VERSION = "0.7.0";
+ public static String VERSION = "0.8.0";
public static String AUTHORS = "ItzSomebody";
/**
diff --git a/src/main/java/me/itzsomebody/radon/config/ConfigEnum.java b/src/main/java/me/itzsomebody/radon/config/ConfigEnum.java
new file mode 100644
index 00000000..66c95e16
--- /dev/null
+++ b/src/main/java/me/itzsomebody/radon/config/ConfigEnum.java
@@ -0,0 +1,35 @@
+package me.itzsomebody.radon.config;
+
+/**
+ * Enums of config objects :D
+ *
+ * @author ItzSomebody
+ */
+public enum ConfigEnum {
+ INPUT,
+ OUTPUT,
+ LIBRARIES,
+ EXEMPTS,
+ STRING_ENCRYPTION,
+ FLOW_OBFUSCATION,
+ INVOKEDYNAMIC,
+ LOCAL_VARIABLES,
+ CRASHER,
+ HIDER,
+ STRING_POOL,
+ LINE_NUMBERS,
+ NUMBERS,
+ SOURCE_NAME,
+ SOURCE_DEBUG,
+ TRASH_CLASSES,
+ WATERMARK_MSG,
+ WATERMARK_KEY,
+ WATERMARK_TYPE,
+ SPIGOT_PLUGIN,
+ RENAMER,
+ EXPIRATION_TIME,
+ EXPIRATION_MESSAGE,
+ SHUFFLER,
+ DICTIONARY,
+ INNERCLASSES
+}
diff --git a/src/main/java/me/itzsomebody/radon/config/ConfigWriter.java b/src/main/java/me/itzsomebody/radon/config/ConfigWriter.java
new file mode 100644
index 00000000..dc8eb7e5
--- /dev/null
+++ b/src/main/java/me/itzsomebody/radon/config/ConfigWriter.java
@@ -0,0 +1,205 @@
+package me.itzsomebody.radon.config;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Constructs a config in memory and writes to file.
+ *
+ * @author ItzSomebody
+ */
+public class ConfigWriter {
+ /**
+ * Key -> Value map.
+ */
+ private Map keyValueMap;
+
+ /**
+ * Lines to write to config.
+ */
+ private List lines = new ArrayList<>();
+
+ /**
+ * Creates a new ConfigWriter object.
+ *
+ * @param keyValueMap Key -> Value map.
+ */
+ public ConfigWriter(Map keyValueMap) {
+ this.keyValueMap = keyValueMap;
+ }
+
+ /**
+ * Parses all options into a virtual config.
+ */
+ public void parseOptions() {
+ Object result = this.keyValueMap.get(ConfigEnum.INPUT);
+ if (result != null) {
+ lines.add("Input: \"" + result.toString().replace("\\", "/") + "\"");
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.OUTPUT);
+ if (result != null) {
+ lines.add("Output: \"" + result.toString().replace("\\", "/") + "\"");
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.STRING_ENCRYPTION);
+ if (result != null) {
+ lines.add("StringEncryption: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.INVOKEDYNAMIC);
+ if (result != null) {
+ lines.add("InvokeDynamic: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.FLOW_OBFUSCATION);
+ if (result != null) {
+ lines.add("FlowObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.LOCAL_VARIABLES);
+ if (result != null) {
+ lines.add("LocalVariableObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.CRASHER);
+ if (result != null) {
+ lines.add("Crasher: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.HIDER);
+ if (result != null) {
+ lines.add("HideCode: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.STRING_POOL);
+ if (result != null) {
+ lines.add("StringPool: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.LINE_NUMBERS);
+ if (result != null) {
+ lines.add("LineNumberObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.NUMBERS);
+ if (result != null) {
+ lines.add("NumberObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.SOURCE_NAME);
+ if (result != null) {
+ lines.add("SourceNameObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.SOURCE_DEBUG);
+ if (result != null) {
+ lines.add("SourceDebugObfuscation: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.TRASH_CLASSES);
+ if (result != null) {
+ lines.add("TrashClasses: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.WATERMARK_MSG);
+ if (result != null) {
+ lines.add("WatermarkMessage: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.WATERMARK_TYPE);
+ if (result != null) {
+ lines.add("WatermarkType: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.WATERMARK_KEY);
+ if (result != null) {
+ lines.add("WatermarkKey: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.SPIGOT_PLUGIN);
+ if (result != null) {
+ lines.add("SpigotPlugin: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.RENAMER);
+ if (result != null) {
+ lines.add("Renamer: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.EXPIRATION_TIME);
+ if (result != null) {
+ lines.add("ExpiryTime: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.EXPIRATION_MESSAGE);
+ if (result != null) {
+ lines.add("ExpiryMessage: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.SHUFFLER);
+ if (result != null) {
+ lines.add("Shuffler: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.DICTIONARY);
+ if (result != null) {
+ lines.add("Dictionary: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.INNERCLASSES);
+ if (result != null) {
+ lines.add("InnerClassRemover: " + result);
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.LIBRARIES);
+ if (result != null) {
+ List libs = (List) result;
+ if (!libs.isEmpty()) {
+ lines.add("Libraries: ");
+ for (String lib : libs) {
+ lines.add(" - \"" + lib.replace("\\", "/") + "\"");
+ }
+ }
+ }
+
+ result = this.keyValueMap.get(ConfigEnum.EXEMPTS);
+ if (result != null) {
+ List exempts = (List) result;
+ if (!exempts.isEmpty()) {
+ lines.add("Exempts: ");
+ for (String exempt : exempts) {
+ lines.add(" - \"" + exempt + "\"");
+ }
+ }
+ }
+ }
+
+ /**
+ * Writes config to a file.
+ *
+ * @throws IOException if the file already exists, is an output or some
+ * other weird thing happens.
+ */
+ public void writeConfig(String path) throws IOException {
+ File output = new File(path);
+ if (output.exists())
+ throw new IOException(path + " already exists!");
+
+ if (output.isDirectory())
+ throw new IOException(path + " needs to be a file, not a directory");
+
+ output.createNewFile();
+ BufferedWriter stream = new BufferedWriter(new FileWriter(output));
+ for (String line : this.lines) {
+ stream.write(line);
+ stream.write('\n');
+ }
+ stream.close();
+ }
+}
diff --git a/src/main/java/me/itzsomebody/radon/gui/MainGUI.java b/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
index 2e51c128..92ee27eb 100644
--- a/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
+++ b/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
@@ -10,9 +10,12 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.swing.*;
import me.itzsomebody.radon.Radon;
import me.itzsomebody.radon.config.Config;
+import me.itzsomebody.radon.config.ConfigEnum;
+import me.itzsomebody.radon.config.ConfigWriter;
import me.itzsomebody.radon.internal.Bootstrap;
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.transformers.flow.LightFlowObfuscation;
@@ -1501,8 +1504,9 @@ public void run() {
throw new IOException("Config file does " +
"not exist.");
+ FileInputStream fis = new FileInputStream(config);
Config configParser
- = new Config(new FileInputStream(config));
+ = new Config(fis);
configParser.loadIntoMap();
configParser.sortExempts();
configParser.checkConfig();
@@ -1756,6 +1760,9 @@ public void run() {
int dictionary = configParser.getDictionaryType();
dictionaryComboBox.setSelectedIndex(dictionary);
+ fis.close();
+
+ lastPath = chooser.getSelectedFile();
} catch (Throwable t) {
JOptionPane.showMessageDialog(null,
t.getMessage(), "Error",
@@ -1770,6 +1777,222 @@ public void run() {
btnLoadConfiguration.setToolTipText("Loads config for pre-defined " +
"settings.");
panel_6.add(btnLoadConfiguration);
+ JButton saveConfigButton = new JButton("Save configuration");
+ saveConfigButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setMultiSelectionEnabled(false);
+ chooser.setFileSelectionMode(0);
+ int result = chooser.showOpenDialog(frmRadonObfuscator);
+ if (result == 0) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Map settings = new HashMap<>();
+ if (inputField.getText() != null
+ && !inputField.getText().isEmpty()) {
+ settings.put(ConfigEnum.INPUT, inputField.getText());
+ }
+
+ if (outputField.getText() != null
+ && !outputField.getText().isEmpty()) {
+ settings.put(ConfigEnum.OUTPUT, outputField.getText());
+ }
+
+ if (chckbxStringEncryption.isSelected()) {
+ switch (comboBox.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.STRING_ENCRYPTION, "SuperLight");
+ break;
+ case 1:
+ settings.put(ConfigEnum.STRING_ENCRYPTION, "Light");
+ break;
+ case 2:
+ settings.put(ConfigEnum.STRING_ENCRYPTION, "Normal");
+ break;
+ case 3:
+ settings.put(ConfigEnum.STRING_ENCRYPTION, "Heavy");
+ break;
+ }
+ }
+
+ if (chckbxInvokeDynamic.isSelected()) {
+ switch (comboBox_1.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.INVOKEDYNAMIC, "Light");
+ break;
+ case 1:
+ settings.put(ConfigEnum.INVOKEDYNAMIC, "Normal");
+ break;
+ case 2:
+ settings.put(ConfigEnum.INVOKEDYNAMIC, "Heavy");
+ break;
+ }
+ }
+
+ if (chckbxFlow.isSelected()) {
+ switch (comboBox_2.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.FLOW_OBFUSCATION, "Light");
+ break;
+ case 1:
+ settings.put(ConfigEnum.FLOW_OBFUSCATION, "Normal");
+ break;
+ case 2:
+ settings.put(ConfigEnum.FLOW_OBFUSCATION, "Heavy");
+ break;
+ }
+ }
+
+ if (chckbxLocalVariables.isSelected()) {
+ switch (comboBox_3.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.LOCAL_VARIABLES, "Obfuscate");
+ break;
+ case 1:
+ settings.put(ConfigEnum.LOCAL_VARIABLES, "Remove");
+ break;
+ }
+ }
+
+ if (chckbxCrasher.isSelected()) {
+ settings.put(ConfigEnum.CRASHER, "true");
+ }
+
+ if (chckbxHidecode.isSelected()) {
+ settings.put(ConfigEnum.HIDER, "true");
+ }
+
+ if (chckbxSpringPool.isSelected()) {
+ settings.put(ConfigEnum.STRING_POOL, "true");
+ }
+
+ if (chckbxLineObfuscation.isSelected()) {
+ switch (comboBox_5.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.LINE_NUMBERS, "Obfuscate");
+ break;
+ case 1:
+ settings.put(ConfigEnum.LINE_NUMBERS, "Remove");
+ break;
+ }
+ }
+
+ if (chckbxNumberObfuscation.isSelected()) {
+ settings.put(ConfigEnum.NUMBERS, "true");
+ }
+
+ if (chckbxSourceName.isSelected()) {
+ switch (comboBox_123.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.SOURCE_NAME, "Obfuscate");
+ break;
+ case 1:
+ settings.put(ConfigEnum.SOURCE_NAME, "Remove");
+ break;
+ }
+ }
+
+ if (chckbxSourceDebug.isSelected()) {
+ switch (comboBox_1234.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.SOURCE_DEBUG, "Obfuscate");
+ break;
+ case 1:
+ settings.put(ConfigEnum.SOURCE_DEBUG, "Remove");
+ break;
+ }
+ }
+
+ if (chckbxTrashClasses.isSelected()) {
+ if (trashChanceField.getText() != null
+ && !trashChanceField.getText().isEmpty()) {
+ settings.put(ConfigEnum.TRASH_CLASSES, trashChanceField.getText());
+ }
+ }
+
+ if (chckbxAddWatermark.isSelected()) {
+ if (waterMarkMessageField.getText() != null
+ && !waterMarkMessageField.getText().isEmpty()
+ && watermarkPassword.getText() != null
+ && !watermarkPassword.getText().isEmpty()) {
+ switch (comboBox_05.getSelectedIndex()) {
+ case 0:
+ settings.put(ConfigEnum.WATERMARK_TYPE, "ConstantPool");
+ break;
+ case 1:
+ settings.put(ConfigEnum.WATERMARK_TYPE, "Signature");
+ break;
+ }
+
+ settings.put(ConfigEnum.WATERMARK_MSG, waterMarkMessageField.getText());
+ settings.put(ConfigEnum.WATERMARK_KEY, watermarkPassword.getText());
+ }
+ }
+
+ if (chckbxSpigotPlugin.isSelected()) {
+ settings.put(ConfigEnum.SPIGOT_PLUGIN, "true");
+ }
+
+ if (chckbxClassRenammer.isSelected()) {
+ settings.put(ConfigEnum.RENAMER, "true");
+ }
+
+ if (chckbxAddExpiration.isSelected()) {
+ if (expirationMessageField.getText() != null
+ && !expireMessageLabel.getText().isEmpty()
+ && expirationDateField.getText() != null
+ && !expirationDateField.getText().isEmpty()) {
+ settings.put(ConfigEnum.EXPIRATION_MESSAGE, expirationMessageField.getText());
+ settings.put(ConfigEnum.EXPIRATION_TIME, expirationDateField.getText());
+ }
+ }
+
+ if (chckbxShuffler.isSelected()) {
+ settings.put(ConfigEnum.SHUFFLER, "true");
+ }
+
+ settings.put(ConfigEnum.DICTIONARY, String.valueOf(dictionaryComboBox.getSelectedIndex()));
+
+ if (chckbxInnerClasses.isSelected()) {
+ settings.put(ConfigEnum.INNERCLASSES, "true");
+ }
+
+ List libs = new ArrayList<>();
+ for (int i = 0; i < libList.size(); i++) {
+ String lib = libList.get(i);
+ libs.add(lib);
+ }
+
+ settings.put(ConfigEnum.LIBRARIES, libs);
+
+ List exempts = new ArrayList<>();
+ for (int i = 0; i < exemptList.size(); i++) {
+ String exempt = exemptList.get(i);
+ exempts.add(exempt);
+ }
+
+ settings.put(ConfigEnum.EXEMPTS, exempts);
+
+ ConfigWriter writer = new ConfigWriter(settings);
+ writer.parseOptions();
+ writer.writeConfig(chooser.getSelectedFile().getAbsolutePath());
+
+ lastPath = chooser.getSelectedFile();
+ } catch (Throwable t) {
+ JOptionPane.showMessageDialog(null,
+ t.getMessage(), "Error",
+ JOptionPane.ERROR_MESSAGE);
+ t.printStackTrace();
+ }
+ }
+ });
+ }
+ }
+ });
+ panel_6.add(saveConfigButton);
this.frmRadonObfuscator.setVisible(true);
}
}
diff --git a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
index 0020405a..c6f38b4d 100644
--- a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
+++ b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
@@ -22,7 +22,6 @@
import me.itzsomebody.radon.utils.LoggerUtils;
import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
-import org.apache.commons.io.IOUtils;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
@@ -49,6 +48,11 @@ public class Bootstrap { // Eyyy bootstrap bill
*/
private Map extraClasses = new HashMap<>();
+ /**
+ * Resources which "pass through" the obfuscator.
+ */
+ private Map passThru = new HashMap<>();
+
/**
* Config object
*/
@@ -194,9 +198,9 @@ public void startTheParty(boolean doInit) throws Throwable {
for (AbstractTransformer transformer : this.transformers) {
if (transformer instanceof Renamer) {
- transformer.init(this.classes, this.classPath, this.exempts, this.dictionary);
+ transformer.init(this.classes, this.classPath, this.passThru, this.exempts, this.dictionary);
} else {
- transformer.init(this.classes, this.exempts, this.dictionary);
+ transformer.init(this.classes, this.extraClasses, this.exempts, this.dictionary);
}
transformer.obfuscate();
this.logStrings.addAll(transformer.getLogStrings());
@@ -227,7 +231,8 @@ public void startTheParty(boolean doInit) throws Throwable {
newEntry.setTime(this.currentTime);
newEntry.setCompressedSize(-1);
this.zos.putNextEntry(newEntry);
- FileUtils.writeToZip(this.zos, cw.toByteArray());
+ this.zos.write(cw.toByteArray());
+ this.zos.closeEntry();
}
}
@@ -277,7 +282,19 @@ public void startTheParty(boolean doInit) throws Throwable {
newEntry.setTime(this.currentTime);
newEntry.setCompressedSize(-1);
this.zos.putNextEntry(newEntry);
- FileUtils.writeToZip(this.zos, cw.toByteArray());
+ this.zos.write(cw.toByteArray());
+ this.zos.closeEntry();
+ }
+
+ // Write resources to output
+ this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
+ this.logStrings.add(LoggerUtils.stdOut("Writing resources to output"));
+ for (String name : this.passThru.keySet()) {
+ ZipEntry newEntry = new ZipEntry(name);
+ newEntry.setTime(this.currentTime);
+ this.zos.putNextEntry(newEntry);
+ this.zos.write(this.passThru.get(name));
+ this.zos.closeEntry();
}
this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
@@ -414,7 +431,7 @@ private void loadClassPath() throws RuntimeException {
entries = zipFile.entries();
while (entries.hasMoreElements()) {
zipEntry = entries.nextElement();
- if (zipEntry.getName().endsWith(".class")) {
+ if (zipEntry.getName().endsWith(".class") && !zipEntry.isDirectory()) {
ClassReader cr = new ClassReader(zipFile
.getInputStream(zipEntry));
ClassNode classNode = new ClassNode();
@@ -457,23 +474,20 @@ private void loadInput() throws RuntimeException {
entries = zipFile.entries();
while (entries.hasMoreElements()) {
zipEntry = entries.nextElement();
- if (zipEntry.getName().endsWith(".class")) {
- ClassReader cr = new ClassReader(zipFile
- .getInputStream(zipEntry));
- ClassNode classNode = new ClassNode();
- classNode.libraryNode = false;
+ if (!zipEntry.isDirectory()) {
+ if (zipEntry.getName().endsWith(".class")) {
+ ClassReader cr = new ClassReader(zipFile
+ .getInputStream(zipEntry));
+ ClassNode classNode = new ClassNode();
+ classNode.libraryNode = false;
- // We will manually compute stack frames later
- cr.accept(classNode, ClassReader.SKIP_FRAMES);
+ // We will manually compute stack frames later
+ cr.accept(classNode, ClassReader.SKIP_FRAMES);
- this.classes.put(classNode.name, classNode);
- } else {
- ZipEntry newEntry = new ZipEntry(zipEntry);
- newEntry.setTime(this.currentTime);
- newEntry.setCompressedSize(-1);
- this.zos.putNextEntry(newEntry);
- FileUtils.writeToZip(zos, IOUtils.toByteArray(zipFile
- .getInputStream(zipEntry)));
+ this.classes.put(classNode.name, classNode);
+ } else {
+ this.passThru.put(zipEntry.getName(), FileUtils.toByteArray(zipFile.getInputStream(zipEntry)));
+ }
}
}
zipFile.close();
diff --git a/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java b/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
index 0802abe1..8a348989 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/AbstractTransformer.java
@@ -26,6 +26,11 @@ public abstract class AbstractTransformer implements Opcodes {
*/
private Map classPath;
+ /**
+ * Resources.
+ */
+ protected Map passThru;
+
/**
* Exempt information.
*/
@@ -72,6 +77,27 @@ public void init(Map classes,
this.logStrings = new ArrayList<>();
}
+ /**
+ * The other-other init method.
+ *
+ * @param classes the classes.
+ * @param classPath the almighty classpath. (Bow down to it)
+ * @param passThru the manifest.
+ * @param exempts the exempted classes.
+ */
+ public void init(Map classes,
+ Map classPath,
+ Map passThru,
+ List exempts,
+ int dictionary) {
+ this.classes = classes;
+ this.classPath = classPath;
+ this.exempts = exempts;
+ this.passThru = passThru;
+ this.dictionary = dictionary;
+ this.logStrings = new ArrayList<>();
+ }
+
/**
* Returns {@link AbstractTransformer#classes}.
*
diff --git a/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java b/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
index d4e8065d..d1a71e67 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/renamer/Renamer.java
@@ -1,5 +1,6 @@
package me.itzsomebody.radon.transformers.renamer;
+import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -75,8 +76,7 @@ public void obfuscate() {
}
});
- if (!this.exempted(classNode.name, "Renamer")
- && !BytecodeUtils.isMain(classNode, this.spigotMode)) {
+ if (!this.exempted(classNode.name, "Renamer")) {
int packages = NumberUtils.getRandomInt(2) + 1;
StringBuilder newName = new StringBuilder();
for (int i = 0; i < packages; i++) {
@@ -114,6 +114,31 @@ public void obfuscate() {
}
this.logStrings.add(LoggerUtils.stdOut("Mapped " + counter + " members."));
+ current = System.currentTimeMillis();
+
+ // Fix screw ups in resources.
+ this.logStrings.add(LoggerUtils.stdOut("Attempting to map class names in resources"));
+ AtomicInteger fixed = new AtomicInteger();
+ passThru.forEach((name, byteArray) -> {
+ if (name.equals("META-INF/MANIFEST.MF")
+ || (name.equals("plugin.yml") && spigotMode)) {
+ String stringVer = new String(byteArray);
+ for (String mapping : mappings.keySet()) {
+ if (stringVer.contains(mapping.replace("/", "."))) {
+ stringVer = stringVer.replace(mapping.replace("/", "."), mappings.get(mapping).replace("/", "."));
+ }
+ }
+
+ try {
+ passThru.put(name, stringVer.getBytes("UTF-8"));
+ fixed.incrementAndGet();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+ });
+ this.logStrings.add(LoggerUtils.stdOut("Mapped " + fixed + " names in resources. [" + tookThisLong(current) + "ms]"));
this.logStrings.add(LoggerUtils.stdOut("Finished applying mappings. [" +
String.valueOf(System.currentTimeMillis() - current) + "ms]"));
}
diff --git a/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java b/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
index 4f2ebc85..0f2d3bcf 100644
--- a/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/BytecodeUtils.java
@@ -3,7 +3,6 @@
import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
@@ -20,32 +19,6 @@
* @author ItzSomebody
*/
public class BytecodeUtils {
- /**
- * Checks if the input class is a main method.
- *
- * @param clazz {@link ClassNode} to check for main methods.
- * @param spigotMode if obfuscator should consider the input
- * {@link ClassNode} as a Spigot/Bukkit/Bungee plugin.
- * @return true if the input {@link ClassNode} contains a main method,
- * false if not.
- */
- public static boolean isMain(ClassNode clazz, boolean spigotMode) {
- if (spigotMode) {
- if (clazz.superName.equals("org/bukkit/plugin/java/JavaPlugin")
- || clazz.superName.equals("net/md_5/bungee/api/plugin/Plugin")) {
- return true;
- }
- }
-
- for (MethodNode methodNode : clazz.methods) {
- if (methodNode.name.equals("main")
- || methodNode.name.equals("premain")) {
- return true;
- }
- }
- return false;
- }
-
/**
* Returns access modifier without private or protected so that class
* renaming works properly.
diff --git a/src/main/java/me/itzsomebody/radon/utils/FileUtils.java b/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
index af4b61ef..496112d3 100644
--- a/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
+++ b/src/main/java/me/itzsomebody/radon/utils/FileUtils.java
@@ -1,7 +1,9 @@
package me.itzsomebody.radon.utils;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.util.zip.ZipOutputStream;
/**
@@ -34,15 +36,26 @@ public static String renameExistingFile(File existing) {
}
/**
- * Writes a bytes to a {@link ZipOutputStream}.
+ * Creates a byte array from a given {@link InputStream}.
*
- * @param zos the {@link ZipOutputStream} to write to.
- * @param data bytes to write to output
- * @throws IOException if an error happens while writing to output stream.
+ * @param in {@link InputStream} to convert to a byte array.
+ * @return a byte array from the inputted
*/
- public static void writeToZip(ZipOutputStream zos, byte[] data)
- throws IOException {
- zos.write(data);
- zos.closeEntry();
+ public static byte[] toByteArray(InputStream in) {
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ while (in.available() > 0) {
+ int data = in.read(buffer);
+ out.write(buffer, 0, data);
+ }
+
+ in.close();
+ out.close();
+ return out.toByteArray();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ throw new RuntimeException(ioe.getMessage());
+ }
}
}
diff --git a/src/main/resources/META-INF/commons-io-license.txt b/src/main/resources/META-INF/commons-io-license.txt
deleted file mode 100644
index 6b0b1270..00000000
--- a/src/main/resources/META-INF/commons-io-license.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
From e17f4d3d43c332d0707447c45bc7f02303939988 Mon Sep 17 00:00:00 2001
From: ItzSomebody <23221108+ItzSomebody@users.noreply.github.com>
Date: Wed, 16 May 2018 12:38:50 -0700
Subject: [PATCH 007/281] 0.8.1 - Heavy flow transformer + some other changes
---
.../me/itzsomebody/radon/gui/MainGUI.java | 11 +-
.../itzsomebody/radon/internal/Bootstrap.java | 97 ++++++++++--
.../flow/HeavyFlowObfuscation.java | 149 ++++++++++--------
.../flow/NormalFlowObfuscation.java | 71 +++++----
4 files changed, 215 insertions(+), 113 deletions(-)
diff --git a/src/main/java/me/itzsomebody/radon/gui/MainGUI.java b/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
index 92ee27eb..bc16aa38 100644
--- a/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
+++ b/src/main/java/me/itzsomebody/radon/gui/MainGUI.java
@@ -18,6 +18,7 @@
import me.itzsomebody.radon.config.ConfigWriter;
import me.itzsomebody.radon.internal.Bootstrap;
import me.itzsomebody.radon.transformers.AbstractTransformer;
+import me.itzsomebody.radon.transformers.flow.HeavyFlowObfuscation;
import me.itzsomebody.radon.transformers.flow.LightFlowObfuscation;
import me.itzsomebody.radon.transformers.flow.NormalFlowObfuscation;
import me.itzsomebody.radon.transformers.invokedynamic.HeavyInvokeDynamic;
@@ -393,7 +394,7 @@ public void actionPerformed(ActionEvent e) {
gbc_comboBox_2.gridx = 9;
gbc_comboBox_2.gridy = 2;
- String[] flows = {"Light", "Normal"};
+ String[] flows = {"Light", "Normal", "Heavy"};
for (String s : flows) {
comboBox_2.addItem(s);
}
@@ -1379,6 +1380,9 @@ protected Object doInBackground() throws Exception {
case 1:
transformers.add(new NormalFlowObfuscation());
break;
+ case 2:
+ transformers.add(new HeavyFlowObfuscation());
+ break;
}
}
if (chckbxSpringPool.isSelected()) {
@@ -1569,6 +1573,11 @@ public void run() {
chckbxFlow.setSelected(true);
comboBox_2.setSelectedIndex(1);
comboBox_2.setEnabled(true);
+ } else if (flowObfuscationMode
+ instanceof HeavyFlowObfuscation) {
+ chckbxFlow.setSelected(true);
+ comboBox_2.setSelectedIndex(2);
+ comboBox_2.setEnabled(true);
}
AbstractTransformer invokeDynamicMode =
diff --git a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
index c6f38b4d..abdce5f1 100644
--- a/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
+++ b/src/main/java/me/itzsomebody/radon/internal/Bootstrap.java
@@ -3,11 +3,15 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
@@ -17,6 +21,7 @@
import me.itzsomebody.radon.transformers.AbstractTransformer;
import me.itzsomebody.radon.transformers.misc.Expiry;
import me.itzsomebody.radon.transformers.misc.TrashClasses;
+import me.itzsomebody.radon.transformers.renamer.ClassTree;
import me.itzsomebody.radon.transformers.renamer.Renamer;
import me.itzsomebody.radon.utils.FileUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
@@ -53,6 +58,11 @@ public class Bootstrap { // Eyyy bootstrap bill
*/
private Map passThru = new HashMap<>();
+ /**
+ * Class hiearchy.
+ */
+ private Map hierarchy = new HashMap<>();
+
/**
* Config object
*/
@@ -218,6 +228,9 @@ public void startTheParty(boolean doInit) throws Throwable {
+ String.valueOf(this.trashClasses) + " trash classes"));
}
+ this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
+ this.createTrees();
+
if (this.extraClasses.values().size() != 0) {
this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
this.logStrings.add(LoggerUtils.stdOut("Writing generated classes to output"));
@@ -502,8 +515,44 @@ private void loadInput() throws RuntimeException {
this.classPath.putAll(this.classes);
}
+ /**
+ * Creates {@link ClassTree}s needed for renaming.
+ */
+ private void createTrees() {
+ long executionTime = System.currentTimeMillis();
+ this.logStrings.add(LoggerUtils.stdOut("Creating class hierarchy."));
+ classPath.values().forEach(classNode -> {
+ classNode.methods.forEach(methodNode -> {
+ methodNode.owner = classNode.name;
+ });
+ classNode.fields.forEach(fieldNode -> {
+ fieldNode.owner = classNode.name;
+ });
+ ClassTree classTree = new ClassTree(classNode.name, classNode.libraryNode);
+ classTree.parentClasses.add(classNode.superName);
+ classTree.parentClasses.addAll(classNode.interfaces);
+ classes.values().forEach(anotherClass -> {
+ if (anotherClass.interfaces != null
+ && anotherClass.interfaces.contains(classNode.name)) {
+ classTree.subClasses.add(anotherClass.name);
+ }
+
+ if (anotherClass.superName != null
+ && anotherClass.superName.equals(classNode.name)) {
+ classTree.subClasses.add(anotherClass.name);
+ }
+ });
+
+ classTree.methods.addAll(classNode.methods);
+ classTree.fields.addAll(classNode.fields);
+ hierarchy.put(classNode.name, classTree);
+ });
+ this.logStrings.add(LoggerUtils.stdOut("Finished creating class hierarchy. [" + (System.currentTimeMillis() - executionTime) + "ms]"));
+ }
+
/**
* CustomClassWriter that doesn't use the internal Java classpath.
+ * Concept taken from Java-Deobfuscator by samczsun
*
* @author ItzSomebody
*/
@@ -520,7 +569,16 @@ protected String getCommonSuperClass(final String type1,
return "java/lang/Object";
}
- return deriveCommonSuperName(type1, type2);
+ String first = deriveCommonSuperName(type1, type2);
+ String second = deriveCommonSuperName(type2, type1);
+ if (!first.equals("java/lang/Object")) {
+ return first;
+ }
+ if (!second.equals("java/lang/Object")) {
+ return second;
+ }
+
+ return getCommonSuperClass(returnClazz(type1).superName, returnClazz(type2).superName);
}
/**
@@ -533,23 +591,18 @@ protected String getCommonSuperClass(final String type1,
private String deriveCommonSuperName(String type1, String type2) {
ClassNode first = returnClazz(type1);
ClassNode second = returnClazz(type2);
-
if (isAssignableFrom(first, second)) {
return type1;
- }
-
- if (isAssignableFrom(second, first)) {
+ } else if (isAssignableFrom(first, second)) {
return type2;
- }
-
- if ((first.access & Opcodes.ACC_INTERFACE) == 0
- || (second.access & Opcodes.ACC_INTERFACE) == 0) {
+ } else if (Modifier.isInterface(first.access) || Modifier.isInterface(second.access)) {
return "java/lang/Object";
} else {
do {
- first = returnClazz(first.superName);
+ type1 = first.superName;
+ first = returnClazz(type1);
} while (!isAssignableFrom(first, second));
- return first.name;
+ return type1;
}
}
@@ -578,8 +631,26 @@ private ClassNode returnClazz(String ref) {
* @return true/false based on if clazz1 is the superclass of clazz2.
*/
private boolean isAssignableFrom(ClassNode clazz1, ClassNode clazz2) {
- return (clazz1.name.equals("java/lang/Object")
- || clazz1.superName.equals(clazz2.name));
+ if (clazz1.name.equals("java/lang/Object")) {
+ return true;
+ }
+ if (clazz1.name.equals(clazz2.name)) {
+ return true;
+ }
+ ClassTree firstTree = hierarchy.get(clazz1.name);
+ if (firstTree == null) {
+ throw new RuntimeException("Could not find " + clazz1.name + " in the built class hiearchy");
+ }
+ Set children = new HashSet<>();
+ LinkedList searchThese = new LinkedList<>(firstTree.subClasses);
+ while (!searchThese.isEmpty()) {
+ String s = searchThese.poll();
+ if (children.add(s)) {
+ ClassTree tempTree = hierarchy.get(s);
+ searchThese.addAll(tempTree.subClasses);
+ }
+ }
+ return children.contains(clazz2.name);
}
}
}
diff --git a/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java b/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
index 8008bcd8..b0f89f41 100644
--- a/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
+++ b/src/main/java/me/itzsomebody/radon/transformers/flow/HeavyFlowObfuscation.java
@@ -1,28 +1,27 @@
package me.itzsomebody.radon.transformers.flow;
-import java.util.ArrayList;
-import java.util.List;
+import java.lang.reflect.Modifier;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicInteger;
import me.itzsomebody.radon.analyzer.StackAnalyzer;
import me.itzsomebody.radon.transformers.AbstractTransformer;
-import me.itzsomebody.radon.utils.BytecodeUtils;
import me.itzsomebody.radon.utils.LoggerUtils;
-import me.itzsomebody.radon.utils.NumberUtils;
import me.itzsomebody.radon.utils.StringUtils;
+import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.LineNumberNode;
+import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
/**
- * This transformer attempts to increase flow obsucurity by making additional
- * jumps to other inserted flow obfuscation instructions.
- * TODO: Fix this
+ * Transformer that does the same as {@link NormalFlowObfuscation}, but with
+ * a couple extra fake jumps.
*
* @author ItzSomebody
*/
@@ -35,57 +34,63 @@ public void obfuscate() {
long current = System.currentTimeMillis();
this.logStrings.add(LoggerUtils.stdOut("------------------------------------------------"));
this.logStrings.add(LoggerUtils.stdOut("Started heavy flow obfuscation transformer"));
- this.classNodes().stream().filter(classNode -> !this.exempted(classNode.name, "Flow")).forEach(classNode -> {
+ classNodes().parallelStream().filter(classNode -> !this.exempted(classNode.name, "Flow")).forEach(classNode -> {
FieldNode field = new FieldNode(ACC_PUBLIC + ACC_STATIC +
ACC_FINAL, StringUtils.randomString(this.dictionary), "Z", null, null);
classNode.fields.add(field);
- classNode.methods.stream().filter(methodNode ->
- !exempted(classNode.name + '.' + methodNode.name + methodNode.desc, "Flow")
- && !methodNode.name.equals("")
- && !BytecodeUtils.isAbstractMethod(methodNode.access)).forEach(methodNode -> {
- methodNode.owner = classNode.name;
+ classNode.methods.parallelStream().filter(methodNode ->
+ !this.exempted(classNode.name + '.' + methodNode.name + methodNode.desc, "Flow")
+ && !Modifier.isAbstract(methodNode.access)).forEach(methodNode -> {
int varIndex = methodNode.maxLocals;
- List jumps = new ArrayList<>();
- AbstractInsnNode[] untouched = methodNode.instructions.toArray();
- LabelNode exitNode = exitLabel(methodNode);
- for (AbstractInsnNode insn : untouched) {
+ methodNode.maxLocals++;
+ methodNode.owner = classNode.name;
+ AbstractInsnNode[] untouchedList = methodNode.instructions.toArray();
+ LabelNode labelNode = exitLabel(methodNode);
+ boolean calledSuper = false;
+ for (AbstractInsnNode insn : untouchedList) {
+ if (this.methodSize(methodNode) > 60000) break;
+ if (methodNode.name.equals("")) {
+ if (insn instanceof MethodInsnNode) {
+ if (insn.getOpcode() == INVOKESPECIAL
+ && insn.getPrevious() instanceof VarInsnNode
+ && ((VarInsnNode) insn.getPrevious()).var == 0) {
+ calledSuper = true;
+ }
+ }
+ }
if (insn != methodNode.instructions.getFirst()
- && insn != methodNode.instructions.getLast()) {
+ && !(insn instanceof LineNumberNode)) {
+ if (methodNode.name.equals("") && !calledSuper)
+ continue;
StackAnalyzer sa = new StackAnalyzer(methodNode, insn);
Stack