diff --git a/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/Skidfuscator.java b/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/Skidfuscator.java index 6b72679..a423231 100644 --- a/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/Skidfuscator.java +++ b/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/Skidfuscator.java @@ -62,6 +62,7 @@ import dev.skidfuscator.obfuscator.transform.impl.sdk.SdkInjectorTransformer; import dev.skidfuscator.obfuscator.transform.impl.string.StringEncryptionType; import dev.skidfuscator.obfuscator.transform.impl.string.StringTransformerV2; +import dev.skidfuscator.obfuscator.transform.impl.vm.VmConditionTransformer; import dev.skidfuscator.obfuscator.util.ConsoleColors; import dev.skidfuscator.obfuscator.util.MapleJarUtil; import dev.skidfuscator.obfuscator.util.MiscUtil; @@ -84,10 +85,8 @@ import org.mapleir.deob.PassGroup; import org.mapleir.deob.dataflow.LiveDataFlowAnalysisImpl; import org.mapleir.ir.cfg.ControlFlowGraph; -import org.matomo.java.tracking.MatomoTracker; -import org.matomo.java.tracking.TrackerConfiguration; +import org.matomo.java.tracking.*; import org.objectweb.asm.Opcodes; -import org.matomo.java.tracking.MatomoRequest; import org.topdank.byteengineer.commons.data.JarClassData; import org.topdank.byteengineer.commons.data.JarContents; @@ -114,6 +113,7 @@ public class Skidfuscator { public static boolean CLOUD = false; public static final String VERSION = "2.1.0"; + public static final Double VERSION_DOUBLE = 2.1; private final SkidfuscatorSession session; @@ -383,36 +383,62 @@ public void run() { } private void _runAnalytics() { - final MatomoTracker tracker = new MatomoTracker( + final String sessionId = UUID.randomUUID().toString(); + try (MatomoTracker tracker = new MatomoTracker( TrackerConfiguration .builder() .apiEndpoint(URI.create("https://analytics.ghast.dev/matomo.php")) .build() - ); - final MatomoRequest request = MatomoRequest.request() - .siteId(1) - .actionUrl("https://app.skidfuscator.dev") - .actionName("skidfuscator/launch") - .campaignName("community") - .campaignKeyword("launch") - .pluginJava(true) - .userId(MiscUtil.getHwid()) - .additionalParameters(Map.of( - "version", VERSION, - "java_version", String.valueOf(MiscUtil.getJavaVersion()), - "os", System.getProperty("os.name"), - "os_version", System.getProperty("os.version"), - "os_arch", System.getProperty("os.arch") - )) - .serverTime(System.currentTimeMillis()) - .customAction(true) - .apiVersion(VERSION) - .eventAction("launch") - .eventCategory("skidfuscator/community") - .eventName("Java") - .eventValue((double) MiscUtil.getJavaVersion()) - .build(); - tracker.sendRequestAsync(request); + )) { + final MatomoRequest versionRequest = MatomoRequests + .event("skidfuscator", "version", VERSION, null) + .userId(MiscUtil.getHwid()) + .siteId(1) + .pluginJava(true) + .campaignName("community") + .campaignKeyword("launch") + .sessionId(sessionId) + .build(); + final MatomoRequest javaRequest = MatomoRequests + .event("skidfuscator", "java_version", null, (double) MiscUtil.getJavaVersion()) + .userId(MiscUtil.getHwid()) + .siteId(1) + .pluginJava(true) + .campaignName("community") + .campaignKeyword("launch") + .sessionId(sessionId) + .build(); + final MatomoRequest osRequest = MatomoRequests + .event("skidfuscator", "os", System.getProperty("os.name"), null) + .userId(MiscUtil.getHwid()) + .siteId(1) + .pluginJava(true) + .campaignName("community") + .campaignKeyword("launch") + .sessionId(sessionId) + .build(); + final MatomoRequest osVersionRequest = MatomoRequests + .event("skidfuscator", "os_version", System.getProperty("os.version"), null) + .userId(MiscUtil.getHwid()) + .siteId(1) + .pluginJava(true) + .campaignName("community") + .campaignKeyword("launch") + .sessionId(sessionId) + .build(); + final MatomoRequest osArchRequest = MatomoRequests + .event("skidfuscator", "os_arch", System.getProperty("os.arch"), null) + .userId(MiscUtil.getHwid()) + .siteId(1) + .pluginJava(true) + .campaignName("community") + .campaignKeyword("launch") + .sessionId(sessionId) + .build(); + tracker.sendBulkRequestAsync(versionRequest, javaRequest, osRequest, osVersionRequest, osArchRequest); + } catch (Exception e) { + LOGGER.warn("Failed to send analytics request"); + } } protected void _verifyEnvironment() { diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/TypeUtils.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/TypeUtils.java index bad9c86..38d86fa 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/TypeUtils.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/TypeUtils.java @@ -9,6 +9,8 @@ import java.util.Map; import java.util.Set; +import com.google.gson.internal.bind.ArrayTypeAdapter; +import lombok.Getter; import org.mapleir.app.service.ApplicationClassSource; import org.mapleir.app.service.ClassTree; import org.objectweb.asm.Opcodes; @@ -32,6 +34,7 @@ private static Set __getIntrinsicErrors() { public static final Type CLASS = Type.getType(Class.class); public static final Type STRING_TYPE = Type.getType(String.class); public static final Type OBJECT_TYPE = Type.getType(Object.class); + public static final Type OBJECT_ARRAY_TYPE = Type.getType(Object[].class); public static final Type CLONEABLE_TYPE = Type.getType(Cloneable.class); public static final Type SERIALIZABLE_TYPE = Type.getType(Serializable.class); public static final Type THROWABLE = Type.getType(Throwable.class); @@ -39,43 +42,47 @@ private static Set __getIntrinsicErrors() { public static final Type UNDEFINED_TYPE = Type.getType(Undefined.class); public static final Type UNINITIALIZED_TYPE = Type.getType(Uninitialized.class); + public static final Type INT_ARRAY_TYPE = Type.getType(int[].class); + public static final Type LONG_ARRAY_TYPE = Type.getType(long[].class); + public static final Type DOUBLE_ARRAY_TYPE = Type.getType(double[].class); + public static final Type FLOAT_ARRAY_TYPE = Type.getType(float[].class); // TODO: remove public static final Type ANY = Type.getType("L;"); - - public enum ArrayType { - INT(Type.INT_TYPE, 0), - LONG(Type.LONG_TYPE, 1), - FLOAT(Type.FLOAT_TYPE, 2), - DOUBLE(Type.DOUBLE_TYPE, 3), - OBJECT(OBJECT_TYPE, 4), - BYTE(Type.BYTE_TYPE, 5), - CHAR(Type.CHAR_TYPE, 6), - SHORT(Type.SHORT_TYPE, 7); + public static ArrayType arrayTypeOfObject(final Type type) { + return ArrayType.ofObj(type); + } + + @Getter + public static class ArrayType { + public static ArrayType INT = new ArrayType(Type.INT_TYPE, 0); + public static ArrayType LONG = new ArrayType(Type.LONG_TYPE, 1); + public static ArrayType FLOAT = new ArrayType(Type.FLOAT_TYPE, 2); + public static ArrayType DOUBLE = new ArrayType(Type.DOUBLE_TYPE, 3); + public static ArrayType OBJECT = new ArrayType(OBJECT_TYPE, 4); + public static ArrayType BYTE = new ArrayType(Type.BYTE_TYPE, 5); + public static ArrayType CHAR = new ArrayType(Type.CHAR_TYPE, 6); + public static ArrayType SHORT = new ArrayType(Type.SHORT_TYPE, 7); private final Type type; private final int loadOpcode, storeOpcode; + + private static final ArrayType[] VALUES = new ArrayType[] { + INT, LONG, FLOAT, DOUBLE, OBJECT, BYTE, CHAR, SHORT + }; + + public static ArrayType[] values() { + return VALUES; + } - private ArrayType(Type type, int offset) { + public ArrayType(Type type, int offset) { this.type = type; loadOpcode = IALOAD + offset; storeOpcode = IASTORE + offset; } - - public Type getType() { - return type; - } - - public int getLoadOpcode() { - return loadOpcode; - } - - public int getStoreOpcode() { - return storeOpcode; - } - - public static ArrayType resolve(int opcode) { + + public static ArrayType resolve(int opcode) { if(opcode >= IALOAD && opcode <= SALOAD) { return values()[opcode - IALOAD]; } else if(opcode >= IASTORE && opcode <= SASTORE) { @@ -84,6 +91,10 @@ public static ArrayType resolve(int opcode) { throw new UnsupportedOperationException(Printer.OPCODES[opcode]); } } + + public static ArrayType ofObj(final Type objectType) { + return new ArrayType(objectType, 4); + } } public static final Type[] OPCODE_TYPE_TABLE = new Type[] { Type.INT_TYPE, Type.LONG_TYPE, Type.FLOAT_TYPE, Type.DOUBLE_TYPE, OBJECT_TYPE, Type.BYTE_TYPE, Type.CHAR_TYPE, diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/BasicBlock.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/BasicBlock.java index db64d85..c5f6d5e 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/BasicBlock.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/BasicBlock.java @@ -210,6 +210,11 @@ public Stmt set(int index, Stmt stmt) { return statements.set(index, stmt); } + public void replace(final Stmt o, final Stmt n) { + statements.add(indexOf(o), n); + statements.remove(o); + } + @Override public int size() { return statements.size(); diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/ControlFlowGraph.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/ControlFlowGraph.java index 5ea969a..447483b 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/ControlFlowGraph.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/ControlFlowGraph.java @@ -61,6 +61,12 @@ public int makeBlockId() { return blockCounter++; } + public Stream traverse() { + return vertices().stream().flatMap(Collection::stream) + .map(Stmt::traverse) + .flatMap(Streams::stream); + } + public Stream allExprStream() { return vertices().stream().flatMap(Collection::stream).map(Stmt::enumerateWithSelf).flatMap(Streams::stream); } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/builder/ControlFlowGraphBuilder.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/builder/ControlFlowGraphBuilder.java index c397f1b..bb57958 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/builder/ControlFlowGraphBuilder.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/builder/ControlFlowGraphBuilder.java @@ -21,7 +21,7 @@ public class ControlFlowGraphBuilder { public final MethodNode method; protected final SSAFactory factory; - protected final ControlFlowGraph graph; + public final ControlFlowGraph graph; protected final Set locals; protected final NullPermeableHashMap> assigns; protected BasicBlock head; diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/CodeUnit.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/CodeUnit.java index 5d263d6..2004407 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/CodeUnit.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/CodeUnit.java @@ -8,10 +8,7 @@ import org.mapleir.stdlib.util.TabbedStringWriter; import org.objectweb.asm.MethodVisitor; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; /** * This is the shared base between the {@link Stmt} and {@link Expr} classes, @@ -406,6 +403,10 @@ public static String print(CodeUnit node) { return printer.toString(); } + public List traverse() { + return Collections.emptyList(); + } + @Override public boolean equals(Object o) { if (this == o) diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/AllocObjectExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/AllocObjectExpr.java index 4db6f88..773b7a5 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/AllocObjectExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/AllocObjectExpr.java @@ -8,6 +8,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.Collections; +import java.util.List; + public class AllocObjectExpr extends Expr { private Type type; @@ -60,4 +63,9 @@ public boolean canChangeFlow() { public boolean equivalent(CodeUnit s) { return s instanceof AllocObjectExpr && type.equals(((AllocObjectExpr) s).type); } + + @Override + public List traverse() { + return List.of(this); + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArithmeticExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArithmeticExpr.java index f30795e..a191e34 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArithmeticExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArithmeticExpr.java @@ -9,6 +9,10 @@ import org.objectweb.asm.Type; import org.objectweb.asm.util.Printer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static org.objectweb.asm.Opcodes.*; public class ArithmeticExpr extends Expr { @@ -301,4 +305,15 @@ public void overwrite(Expr previous, Expr newest) { // // TODO Auto-generated method stub // return 0; // } + + + @Override + public List traverse() { + final List self = new ArrayList<>(); + self.add(this); + self.addAll(left.traverse()); + self.addAll(right.traverse()); + + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLengthExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLengthExpr.java index 9e2aae9..1aba77f 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLengthExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLengthExpr.java @@ -8,6 +8,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class ArrayLengthExpr extends Expr { private Expr expression; @@ -85,4 +88,11 @@ public void overwrite(Expr previous, Expr newest) { public boolean equivalent(CodeUnit s) { return (s instanceof ArrayLengthExpr) && expression.equivalent(((ArrayLengthExpr)s).expression); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLoadExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLoadExpr.java index 4399aaf..192a4e9 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLoadExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArrayLoadExpr.java @@ -9,6 +9,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class ArrayLoadExpr extends Expr { private Expr arrayExpression; @@ -53,7 +56,9 @@ public Expr copy() { @Override public Type getType() { - return type.getType(); + return arrayExpression.getType().getSort() == Type.ARRAY + ? arrayExpression.getType().getElementType() + : type.getType(); } @Override @@ -125,4 +130,12 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(arrayExpression.traverse()); + self.addAll(indexExpression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CastExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CastExpr.java index 0f9a687..1cd0e84 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CastExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CastExpr.java @@ -9,6 +9,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class CastExpr extends Expr { private Expr expression; @@ -107,4 +110,11 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CaughtExceptionExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CaughtExceptionExpr.java index 368f7a8..47063b3 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CaughtExceptionExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/CaughtExceptionExpr.java @@ -7,6 +7,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class CaughtExceptionExpr extends Expr { private Type type; @@ -69,4 +72,10 @@ public boolean equivalent(CodeUnit s) { return false; } } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ComparisonExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ComparisonExpr.java index 3f2e5a0..ef5cfe8 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ComparisonExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ComparisonExpr.java @@ -11,6 +11,9 @@ import org.objectweb.asm.Type; import org.objectweb.asm.util.Printer; +import java.util.ArrayList; +import java.util.List; + public class ComparisonExpr extends Expr { public enum ValueComparisonType { @@ -156,4 +159,12 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(left.traverse()); + self.addAll(right.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ConstantExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ConstantExpr.java index abac21d..c580c8c 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ConstantExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ConstantExpr.java @@ -10,6 +10,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class ConstantExpr extends Expr { private Object cst; @@ -256,4 +259,10 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/FieldLoadExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/FieldLoadExpr.java index 1b6acc8..31073de 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/FieldLoadExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/FieldLoadExpr.java @@ -8,6 +8,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class FieldLoadExpr extends Expr implements IUsesJavaDesc { private Expr instanceExpression; @@ -162,4 +165,13 @@ public JavaDescUse.UseType getDataUseType() { public JavaDesc getDataUseLocation() { return getBlock().getGraph().getJavaDesc(); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + + if (instanceExpression != null) + self.addAll(instanceExpression.traverse()); + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/InstanceofExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/InstanceofExpr.java index dec1da4..5c04383 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/InstanceofExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/InstanceofExpr.java @@ -8,6 +8,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class InstanceofExpr extends Expr { private Expr expression; @@ -100,4 +103,11 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NegationExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NegationExpr.java index 37c3d9f..9166e42 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NegationExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NegationExpr.java @@ -8,6 +8,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class NegationExpr extends Expr { private Expr expression; @@ -95,4 +98,11 @@ public void overwrite(Expr previous, Expr newest) { public boolean equivalent(CodeUnit s) { return (s instanceof NegationExpr && expression.equivalent(((NegationExpr)s).expression)); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NewArrayExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NewArrayExpr.java index 36b1de2..ae72c6b 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NewArrayExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/NewArrayExpr.java @@ -10,7 +10,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class NewArrayExpr extends Expr { @@ -232,4 +234,19 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + + for (Expr expression : bounds) { + self.addAll(expression.traverse()); + } + + for (Expr cst : cst) { + self.addAll(cst.traverse()); + } + + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/VarExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/VarExpr.java index b3a1c52..20f8ca9 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/VarExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/VarExpr.java @@ -9,6 +9,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class VarExpr extends Expr { private Local local; @@ -79,4 +82,9 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + return List.of(this); + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InitialisedObjectExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InitialisedObjectExpr.java index 04162d5..7a58f90 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InitialisedObjectExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InitialisedObjectExpr.java @@ -12,7 +12,9 @@ import org.objectweb.asm.Type; import org.mapleir.asm.MethodNode; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; public class InitialisedObjectExpr extends Invocation { @@ -205,4 +207,14 @@ public String getName() { public Set resolveTargets(InvocationResolver res) { return CollectionUtils.asCollection(HashSet::new, res.resolveVirtualInitCall(getOwner(), getDesc())); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + + for (Expr expr : args) { + self.addAll(expr.traverse()); + } + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InvocationExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InvocationExpr.java index 36f3d4a..1aa829b 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InvocationExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/InvocationExpr.java @@ -10,9 +10,7 @@ import org.objectweb.asm.Type; import java.lang.reflect.Array; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public abstract class InvocationExpr extends Invocation implements IUsesJavaDesc { @@ -326,4 +324,14 @@ public JavaDescUse.UseType getDataUseType() { public JavaDesc getDataUseLocation() { return getBlock().getGraph().getJavaDesc(); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + + for (Expr expr : args) { + self.addAll(expr.traverse()); + } + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/StaticInvocationExpr.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/StaticInvocationExpr.java index a42a94a..9134906 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/StaticInvocationExpr.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/invoke/StaticInvocationExpr.java @@ -23,7 +23,7 @@ public StaticInvocationExpr(CallType callType, Expr[] args, String owner, String @Override public StaticInvocationExpr copy() { - return new StaticInvocationExpr(copyArgs(), getOwner(), getName(), getDesc()); + return new StaticInvocationExpr(getCallType(), copyArgs(), getOwner(), getName(), getDesc()); } @Override diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ArrayStoreStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ArrayStoreStmt.java index a087cb9..a775f26 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ArrayStoreStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ArrayStoreStmt.java @@ -11,12 +11,15 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class ArrayStoreStmt extends Stmt { - private Expr arrayExpression; - private Expr indexExpression; - private Expr valueExpression; - private ArrayType type; + protected Expr arrayExpression; + protected Expr indexExpression; + protected Expr valueExpression; + protected ArrayType type; public ArrayStoreStmt(Expr arrayExpression, Expr indexExpression, Expr valueExpression, ArrayType type) { super(ARRAY_STORE); @@ -140,4 +143,13 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(arrayExpression.traverse()); + self.addAll(indexExpression.traverse()); + self.addAll(valueExpression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ConditionalJumpStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ConditionalJumpStmt.java index b54efb4..8586b29 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ConditionalJumpStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ConditionalJumpStmt.java @@ -14,6 +14,9 @@ import org.objectweb.asm.Type; import org.objectweb.asm.util.Printer; +import java.util.ArrayList; +import java.util.List; + public class ConditionalJumpStmt extends Stmt { public enum ComparisonType { @@ -294,4 +297,12 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(left.traverse()); + self.addAll(right.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/FieldStoreStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/FieldStoreStmt.java index 9958e0a..dfa1bb4 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/FieldStoreStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/FieldStoreStmt.java @@ -11,6 +11,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class FieldStoreStmt extends Stmt implements IUsesJavaDesc { private Expr instanceExpression; @@ -184,4 +187,14 @@ public JavaDescUse.UseType getDataUseType() { public JavaDesc getDataUseLocation() { return getBlock().getGraph().getJavaDesc(); } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + + if (instanceExpression != null) + self.addAll(instanceExpression.traverse()); + self.addAll(valueExpression.traverse()); + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/MonitorStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/MonitorStmt.java index ec48b47..3bf0364 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/MonitorStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/MonitorStmt.java @@ -8,6 +8,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.util.ArrayList; +import java.util.List; + public class MonitorStmt extends Stmt { public enum MonitorMode { @@ -86,4 +89,11 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/NopStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/NopStmt.java index 4eeeaee..87ee7f3 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/NopStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/NopStmt.java @@ -7,6 +7,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.util.ArrayList; +import java.util.List; + public class NopStmt extends Stmt { public NopStmt() { super(NOP); @@ -41,4 +44,10 @@ public NopStmt copy() { public boolean equivalent(CodeUnit s) { return s instanceof NopStmt; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/PopStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/PopStmt.java index 34565ca..031f209 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/PopStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/PopStmt.java @@ -9,6 +9,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class PopStmt extends Stmt { private Expr expression; @@ -76,4 +79,11 @@ public PopStmt copy() { public boolean equivalent(CodeUnit s) { return s instanceof PopStmt && expression.equivalent(((PopStmt) s).expression); } + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } + } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ReturnStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ReturnStmt.java index cdc66a0..1c5c359 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ReturnStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ReturnStmt.java @@ -10,6 +10,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + public class ReturnStmt extends Stmt { private Type type; @@ -103,4 +106,13 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + if (expression != null) + self.addAll(expression.traverse()); + + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/SwitchStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/SwitchStmt.java index 9849aba..f815acc 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/SwitchStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/SwitchStmt.java @@ -207,4 +207,11 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ThrowStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ThrowStmt.java index b3380a1..b2fea9d 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ThrowStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/ThrowStmt.java @@ -8,6 +8,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.util.ArrayList; +import java.util.List; + public class ThrowStmt extends Stmt { private Expr expression; @@ -74,4 +77,11 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/UnconditionalJumpStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/UnconditionalJumpStmt.java index e75610f..20cf3a8 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/UnconditionalJumpStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/UnconditionalJumpStmt.java @@ -9,6 +9,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.util.ArrayList; +import java.util.List; + public class UnconditionalJumpStmt extends Stmt { private BasicBlock target; @@ -69,4 +72,10 @@ public boolean equivalent(CodeUnit s) { } return false; } + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/copy/AbstractCopyStmt.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/copy/AbstractCopyStmt.java index 2afc140..6b28373 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/copy/AbstractCopyStmt.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/code/stmt/copy/AbstractCopyStmt.java @@ -12,6 +12,9 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.ArrayList; +import java.util.List; + /** * This class is the base for the two types of copy/move statements in the IR: * {@link CopyVarStmt} and {@link CopyPhiStmt}.
@@ -37,15 +40,15 @@ public abstract class AbstractCopyStmt extends Stmt { /** * Whether or not this copy is a synthetic copy. See class javadocs. */ - private final boolean synthetic; + protected final boolean synthetic; /** * The RHS expression (source). */ - private Expr expression; + protected Expr expression; /** * The LHS variable (destination). */ - private VarExpr variable; + protected VarExpr variable; public AbstractCopyStmt(int opcode, VarExpr variable, Expr expression) { this(opcode, variable, expression, false); @@ -185,4 +188,12 @@ public void overwrite(Expr previous, Expr newest) { @Override public abstract boolean equivalent(CodeUnit s); + + @Override + public List traverse() { + final List self = new ArrayList<>(List.of(this)); + self.addAll(expression.traverse()); + self.addAll(variable.traverse()); + return self; + } } \ No newline at end of file diff --git a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/locals/LocalsPool.java b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/locals/LocalsPool.java index 6a52f11..6e664b8 100644 --- a/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/locals/LocalsPool.java +++ b/org.mapleir.parent/org.mapleir.ir/src/main/java/org/mapleir/ir/locals/LocalsPool.java @@ -1,14 +1,7 @@ package org.mapleir.ir.locals; -import org.mapleir.ir.TypeUtils; -import org.mapleir.ir.cfg.BasicBlock; -import org.mapleir.ir.cfg.ControlFlowGraph; -import org.mapleir.ir.code.Expr; -import org.mapleir.ir.code.Opcode; -import org.mapleir.ir.code.Stmt; import org.mapleir.ir.code.expr.VarExpr; import org.mapleir.ir.code.stmt.copy.AbstractCopyStmt; -import org.mapleir.ir.code.stmt.copy.CopyVarStmt; import org.mapleir.ir.locals.impl.BasicLocal; import org.mapleir.ir.locals.impl.VersionedLocal; import org.mapleir.stdlib.collections.bitset.BitSetIndexer; @@ -16,10 +9,8 @@ import org.mapleir.stdlib.collections.bitset.IncrementalBitSetIndexer; import org.mapleir.stdlib.collections.map.NullPermeableHashMap; import org.mapleir.stdlib.collections.map.ValueCreator; -import org.objectweb.asm.Type; import java.util.*; -import java.util.Map.Entry; import java.util.function.Predicate; public abstract class LocalsPool implements ValueCreator> { @@ -156,6 +147,10 @@ public BasicLocal newLocal(int i, boolean isStack) { i++; } } + + public BasicLocal nextFree() { + return get(getMaxLocals() + 1); + } public BasicLocal getNextFreeLocal(boolean isStack) { return newLocal(0, isStack);