diff --git a/dev.skidfuscator.obfuscator/build.gradle b/dev.skidfuscator.obfuscator/build.gradle index e379a488..9e586301 100644 --- a/dev.skidfuscator.obfuscator/build.gradle +++ b/dev.skidfuscator.obfuscator/build.gradle @@ -18,7 +18,7 @@ dependencies { api project(':commons') implementation 'me.tongfei:progressbar:0.9.3' implementation 'com.github.matomo-org:matomo-java-tracker:v1.7' - implementation 'com.github.Col-E:jphantom:1.4.3' + api 'com.github.Col-E:jphantom:1.4.3' implementation 'dev.dirs:directories:26' testAnnotationProcessor 'org.projectlombok:lombok:1.18.24' 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 e0245cb2..30187604 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 @@ -231,21 +231,7 @@ public void run() { * * Here though shall puteth all your transformers. Enjoy! */ - for (Listener o : Arrays.asList( - new StringTransformer(this), - //new NegationTransformer(this), - //new FlatteningFlowTransformer(this), - new NumberTransformer(this), - new SwitchTransformer(this), - new BasicSimplifierTransformer(this), - new BasicConditionTransformer(this), - new BasicExceptionTransformer(this), - new BasicRangeTransformer(this), - new AhegaoTransformer(this) - // - )) { - EventBus.register(o); - } + _loadTransformer(); LOGGER.log("Finished loading transformers..."); @@ -307,7 +293,7 @@ public void run() { _dump(); - + IntegerBlockPredicateRenderer.DEBUG = false; LOGGER.post("Goodbye!"); } @@ -526,6 +512,24 @@ protected void _importClasspath() { LOGGER.log("Finished importing classpath!"); } + protected void _loadTransformer() { + for (Listener o : Arrays.asList( + new StringTransformer(this), + //new NegationTransformer(this), + //new FlatteningFlowTransformer(this), + new NumberTransformer(this), + new SwitchTransformer(this), + new BasicSimplifierTransformer(this), + new BasicConditionTransformer(this), + new BasicExceptionTransformer(this), + new BasicRangeTransformer(this), + new AhegaoTransformer(this) + // + )) { + EventBus.register(o); + } + } + private void _verify() { /* Checking for errors */ LOGGER.post("Starting verification"); diff --git a/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/predicate/renderer/impl/IntegerBlockPredicateRenderer.java b/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/predicate/renderer/impl/IntegerBlockPredicateRenderer.java index 99e32d4a..bd0f90d7 100644 --- a/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/predicate/renderer/impl/IntegerBlockPredicateRenderer.java +++ b/dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/predicate/renderer/impl/IntegerBlockPredicateRenderer.java @@ -59,7 +59,7 @@ public IntegerBlockPredicateRenderer(Skidfuscator skidfuscator, List edge = new UnconditionalJumpEdge<>(basicBlock, target); basicBlock.add(new UnconditionalJumpStmt(target, edge)); @@ -897,6 +899,8 @@ void handle(final PostMethodTransformEvent event) { .forEach(stmt -> { final SkidBlock seededBlock = (SkidBlock) vertex; + final LinkedHashMap targets = new LinkedHashMap<>(); + for (Map.Entry entry : stmt.getTargets().entrySet()) { final int seed = entry.getKey(); final BasicBlock value = entry.getValue(); @@ -917,7 +921,9 @@ void handle(final PostMethodTransformEvent event) { localGetter, localSetter, methodNode.getBlockPredicate(seededBlock), - methodNode.getBlockPredicate(target) + methodNode.getBlockPredicate(target), + "Switch Entry [" + entry.getKey() + ", og:" + target.getDisplayName() + + ", redirected: " + basicBlock.getDisplayName() + ")" ); final UnconditionalJumpEdge edge = new UnconditionalJumpEdge<>(basicBlock, target); basicBlock.add(new UnconditionalJumpStmt(target, edge)); @@ -927,7 +933,7 @@ void handle(final PostMethodTransformEvent event) { basicBlock.cfg.addEdge(edge); // Replace successor - stmt.getTargets().replace(seed, basicBlock); + targets.put(seed, basicBlock); basicBlock.cfg.addEdge(new SwitchEdge<>(seededBlock, basicBlock, stmt.getOpcode())); if (DEBUG) { @@ -947,6 +953,8 @@ void handle(final PostMethodTransformEvent event) { } } + stmt.setTargets(targets); + if (stmt.getDefaultTarget() == null || stmt.getDefaultTarget() == vertex) return; @@ -964,7 +972,8 @@ void handle(final PostMethodTransformEvent event) { localGetter, localSetter, methodNode.getBlockPredicate(seededBlock), - methodNode.getBlockPredicate(target) + methodNode.getBlockPredicate(target), + "Switch Default" ); final UnconditionalJumpEdge edge = new UnconditionalJumpEdge<>(basicBlock, target); basicBlock.add(new UnconditionalJumpStmt(target, edge)); @@ -1040,7 +1049,8 @@ void handle(final PostMethodTransformEvent event) { localGetter, localSetter, methodNode.getBlockPredicate(internal), - methodNode.getBlockPredicate(handler) + methodNode.getBlockPredicate(handler), + "Exception Range " + Arrays.toString(blockRange.getTypes().toArray()) ); // Jump to handler @@ -1121,8 +1131,32 @@ void handle(final PostMethodTransformEvent event) { return; } + /** + * WIP + */ + private BasicBlock createRedirector(final BasicBlock block, + final BasicBlock targetBlock, + final PredicateFlowGetter getter, + final PredicateFlowSetter setter, + final int value, + final int target, + final String type + ) { + final BasicBlock redirector = new BasicBlock(block.cfg); + block.cfg.addVertex(redirector); + return null; + } + - private void addSeedLoader(final BasicBlock block, final BasicBlock targetBlock, final int index, final PredicateFlowGetter getter, final PredicateFlowSetter local, final int value, final int target) { + private void addSeedLoader(final BasicBlock block, + final BasicBlock targetBlock, + final int index, + final PredicateFlowGetter getter, + final PredicateFlowSetter local, + final int value, + final int target, + final String type + ) { final Expr load = NumberManager.encrypt( target, value, @@ -1138,7 +1172,12 @@ private void addSeedLoader(final BasicBlock block, final BasicBlock targetBlock, if (DEBUG) { final BasicBlock exception = Blocks.exception( block.cfg, - "Failed to match seed of value " + target + block.getDisplayName() + " --> " + + targetBlock.getDisplayName() + + " # Failed to match seed of type " + + type + + " and value " + + target ); final Stmt jumpStmt = new FakeConditionalJumpStmt( diff --git a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/SkidTest.java b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/SkidTest.java index b6c9ac9f..26e48664 100644 --- a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/SkidTest.java +++ b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/SkidTest.java @@ -10,6 +10,7 @@ import dev.skidfuscator.testclasses.TestRun; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mapleir.asm.ClassHelper; import org.mapleir.deob.PassGroup; @@ -74,7 +75,24 @@ public void receiveAndExecute(List> output) { final Class clazz = classLoader.loadClass(this.getMainClass().getName()); final TestRun run = (TestRun) clazz.newInstance(); run.run(); + + if (TestSkidfuscator.SKIP) { + TestSkidfuscator.SKIP = false; + Assertions.fail("Transformers are causing the issue!"); + } } catch (Throwable e) { + System.out.println("------"); + e.printStackTrace(); + System.out.println("------"); + + if (!TestSkidfuscator.SKIP) { + TestSkidfuscator.SKIP = true; + + test(); + } else { + TestSkidfuscator.SKIP = false; + } + try { skidfuscator.getJarContents().getClassContents().add( new JarClassData( @@ -120,7 +138,7 @@ public void receiveAndExecute(List> output) { ie.printStackTrace(); } - throw new IllegalStateException("Failed execution", e); + throw new IllegalStateException("Failed execution: " + e.getMessage(), e); } } diff --git a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/TestSkidfuscator.java b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/TestSkidfuscator.java index c7f281e9..9ad0f109 100644 --- a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/TestSkidfuscator.java +++ b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/core/TestSkidfuscator.java @@ -6,6 +6,7 @@ import dev.skidfuscator.obfuscator.creator.SkidApplicationClassSource; import dev.skidfuscator.obfuscator.event.EventBus; import dev.skidfuscator.obfuscator.phantom.jphantom.PhantomResolvingJarDumper; +import dev.skidfuscator.obfuscator.predicate.renderer.impl.IntegerBlockPredicateRenderer; import dev.skidfuscator.obfuscator.skidasm.SkidClassNode; import dev.skidfuscator.obfuscator.util.MiscUtil; import dev.skidfuscator.obfuscator.verifier.Verifier; @@ -45,8 +46,12 @@ public TestSkidfuscator(Class[] test, Consumer .build()); this.test = test; this.callback = callback; + + IntegerBlockPredicateRenderer.DEBUG = true; } + public static boolean SKIP = false; + @Override protected void _importExempt() { LOGGER.post("Ignoring exempts since we're testing..."); @@ -128,6 +133,14 @@ protected void _importClasspath() { LOGGER.log("Finished importing classpath!"); } + @Override + protected void _loadTransformer() { + if (SKIP) + return; + + super._loadTransformer(); + } + @Override protected void _dump() { final PhantomResolvingJarDumper resolver = new PhantomResolvingJarDumper( diff --git a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/test/exception/IntegerFormatExceptionTest.java b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/test/exception/IntegerFormatExceptionTest.java new file mode 100644 index 00000000..64c15551 --- /dev/null +++ b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/test/exception/IntegerFormatExceptionTest.java @@ -0,0 +1,19 @@ +package dev.skidfuscator.test.exception; + +import dev.skidfuscator.core.SkidTest; +import dev.skidfuscator.testclasses.TestRun; +import dev.skidfuscator.testclasses.exception.IntegerFormatExceptionTestClass; + +public class IntegerFormatExceptionTest extends SkidTest { + @Override + public Class getMainClass() { + return IntegerFormatExceptionTestClass.class; + } + + @Override + public Class[] getClasses() { + return new Class[]{ + IntegerFormatExceptionTestClass.class + }; + } +} diff --git a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/conditionals/Tableswitch.java b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/conditionals/Tableswitch.java index f2811b6a..b40c392f 100644 --- a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/conditionals/Tableswitch.java +++ b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/conditionals/Tableswitch.java @@ -1,15 +1,17 @@ package dev.skidfuscator.testclasses.conditionals; - import dev.skidfuscator.annotations.Exclude; import dev.skidfuscator.testclasses.TestRun; public class Tableswitch implements TestRun { @Override public void run() { + System.out.println("Beginning test!"); for (char i = 0; i < 16; i++) { + System.out.println("Running exec " + (int) i); assert exec(i) == exec_real(i) : "Failed equality check"; } + System.out.println("Ending test!"); } public int exec(char a) { diff --git a/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/exception/IntegerFormatExceptionTestClass.java b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/exception/IntegerFormatExceptionTestClass.java new file mode 100644 index 00000000..de3f1d16 --- /dev/null +++ b/dev.skidfuscator.obfuscator/src/test/java/dev/skidfuscator/testclasses/exception/IntegerFormatExceptionTestClass.java @@ -0,0 +1,18 @@ +package dev.skidfuscator.testclasses.exception; + +import dev.skidfuscator.testclasses.TestRun; +import org.junit.jupiter.api.Assertions; + +public class IntegerFormatExceptionTestClass implements TestRun { + @Override + public void run() { + try { + Integer.decode(":)"); + Assertions.fail(); + } catch (NumberFormatException e) { + return; + } catch (Exception e) { + Assertions.fail(); + } + } +}