Skip to content

Commit

Permalink
Many fixes + beginning works on ghost mapping mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
terminalsin committed May 21, 2022
1 parent 4f1f59e commit 4e5a488
Show file tree
Hide file tree
Showing 27 changed files with 237 additions and 51 deletions.
1 change: 1 addition & 0 deletions docs/bug-naturalisation-pass.drawio.drawio
@@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2022-05-21T13:18:04.278Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36" etag="Oi3irG9dJ9Qzta5kf0T0" version="18.0.1" type="device"><diagram id="IGXKT6YkwEFYN9pUYwX3" name="Page-1">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</diagram></mxfile>
Expand Up @@ -155,6 +155,19 @@ class MergePair {
continue;
}
Set<FlowEdge<BasicBlock>> inSuccs = in.cfg.getSuccessors(e -> !(e instanceof TryCatchEdge), in);
/*
* In a nutshell, to be able to properly merge two blocks, we're looking for this
* exact scenario:
*
* B.. B..
* \ / <-- No matters. We don't really care
* BX1 (in)
* | <-- CRITICAL! Must only be ONE edge which is a successor and
* v only one reverse edge for the successor
* BX2 (b)
* / \ <-- We don't really care from here on out
* B.. B.;
*/
if(inSuccs.size() != 1 || builder.graph.getReverseEdges(b).size() != 1) {
continue;
}
Expand Down
Expand Up @@ -24,6 +24,7 @@
import org.mapleir.ir.codegen.ControlFlowGraphDumper;
import org.mapleir.asm.ClassNode;
import org.mapleir.asm.MethodNode;
import org.topdank.byteengineer.commons.data.JarClassData;
import org.topdank.byteengineer.commons.data.JarInfo;
import org.topdank.byteio.in.SingleJarDownloader;

Expand All @@ -34,6 +35,7 @@
import java.util.*;
import java.util.Map.Entry;
import java.util.jar.JarOutputStream;
import java.util.stream.Collectors;

public class Boot {

Expand Down Expand Up @@ -63,7 +65,10 @@ public static void main(String[] args) throws Exception {
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(f));
dl.download();
String appName = f.getName().substring(0, f.getName().length() - 4);
ApplicationClassSource app = new ApplicationClassSource(appName, dl.getJarContents().getClassContents());
ApplicationClassSource app = new ApplicationClassSource(
appName,
dl.getJarContents().getClassContents().stream().map(JarClassData::getClassNode).collect(Collectors.toList())
);
//
// ApplicationClassSource app = new ApplicationClassSource("test", ClassHelper.parseClasses(CGExample.class));
// app.addLibraries(new InstalledRuntimeClassSource(app));
Expand Down
Expand Up @@ -24,13 +24,15 @@
import org.mapleir.ir.codegen.ControlFlowGraphDumper;
import org.mapleir.asm.ClassNode;
import org.mapleir.asm.MethodNode;
import org.topdank.byteengineer.commons.data.JarClassData;
import org.topdank.byteengineer.commons.data.JarInfo;
import org.topdank.byteio.in.SingleJarDownloader;

import java.io.*;
import java.util.*;
import java.util.Map.Entry;
import java.util.jar.JarOutputStream;
import java.util.stream.Collectors;

public class Boot2 {

Expand Down Expand Up @@ -58,7 +60,10 @@ public static void main(String[] args) throws Exception {
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(f));
dl.download();
String appName = f.getName().substring(0, f.getName().length() - 4);
ApplicationClassSource app = new ApplicationClassSource(appName, dl.getJarContents().getClassContents());
ApplicationClassSource app = new ApplicationClassSource(
appName,
dl.getJarContents().getClassContents().stream().map(JarClassData::getClassNode).collect(Collectors.toList())
);
//
// ApplicationClassSource app = new ApplicationClassSource("test", ClassHelper.parseClasses(CGExample.class));
// app.addLibraries(new InstalledRuntimeClassSource(app));
Expand Down
Expand Up @@ -21,13 +21,15 @@
import org.mapleir.stdlib.util.JavaDescUse;
import org.mapleir.asm.ClassNode;
import org.mapleir.asm.MethodNode;
import org.topdank.byteengineer.commons.data.JarClassData;
import org.topdank.byteengineer.commons.data.JarInfo;
import org.topdank.byteio.in.SingleJarDownloader;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class DataFlowDemoBoot {

Expand Down Expand Up @@ -58,7 +60,10 @@ public static void main(String[] args) throws Exception {
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(f));
dl.download();
String appName = f.getName().substring(0, f.getName().length() - 4);
ApplicationClassSource app = new ApplicationClassSource(appName, dl.getJarContents().getClassContents());
ApplicationClassSource app = new ApplicationClassSource(
appName,
dl.getJarContents().getClassContents().stream().map(JarClassData::getClassNode).collect(Collectors.toList())
);
//
// ApplicationClassSource app = new ApplicationClassSource("test", ClassHelper.parseClasses(CGExample.class));
// app.addLibraries(new InstalledcoRuntimeClassSource(app));
Expand Down
Expand Up @@ -10,8 +10,8 @@
import java.util.List;
import java.util.Map;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.*;
import org.objectweb.asm.commons.JSRInlinerAdapter;

/**
* @author Bibl (don't ban me pls)
Expand Down Expand Up @@ -41,7 +41,13 @@ public static ClassNode create(byte[] bytes) {
public static ClassNode create(byte[] bytes, int flags) {
ClassReader reader = new ClassReader(bytes);
org.objectweb.asm.tree.ClassNode node = new org.objectweb.asm.tree.ClassNode();
reader.accept(node, flags);
ClassVisitor visitor = new ClassVisitor(Opcodes.ASM9, node) {
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
return new JSRInlinerAdapter(super.visitMethod(access, name, desc, signature, exceptions), access, name, desc, signature, exceptions);
}
};

reader.accept(visitor, flags);
return new ClassNode(node);
}

Expand Down
12 changes: 12 additions & 0 deletions obfuscator/dependency-reduced-pom.xml
Expand Up @@ -46,6 +46,18 @@
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.xxDark</groupId>
<artifactId>SSVM</artifactId>
<version>1.7.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>CAFED00D</artifactId>
<groupId>com.github.Col-E</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<properties>
<jline.version>3.21.0</jline.version>
Expand Down
6 changes: 6 additions & 0 deletions obfuscator/pom.xml
Expand Up @@ -112,6 +112,12 @@
<artifactId>jline</artifactId>
<version>${jline.version}</version>
</dependency>
<dependency>
<groupId>com.github.xxDark</groupId>
<artifactId>SSVM</artifactId>
<version>1.7.1</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Expand Up @@ -19,7 +19,7 @@
import dev.skidfuscator.obfuscator.hierarchy.Hierarchy;
import dev.skidfuscator.obfuscator.hierarchy.SkidHierarchy;
import dev.skidfuscator.obfuscator.order.OrderAnalysis;
import dev.skidfuscator.obfuscator.phantom.PhantomJarDownloader;
import dev.skidfuscator.obfuscator.phantom.jphantom.PhantomJarDownloader;
import dev.skidfuscator.obfuscator.predicate.PredicateAnalysis;
import dev.skidfuscator.obfuscator.predicate.SimplePredicateAnalysis;
import dev.skidfuscator.obfuscator.predicate.factory.PredicateFactory;
Expand All @@ -38,7 +38,6 @@
import dev.skidfuscator.obfuscator.transform.impl.SwitchTransformer;
import dev.skidfuscator.obfuscator.transform.impl.flow.BasicConditionTransformer;
import dev.skidfuscator.obfuscator.transform.impl.flow.BasicExceptionTransformer;
import dev.skidfuscator.obfuscator.transform.impl.flow.FlatteningFlowTransformer;
import dev.skidfuscator.obfuscator.transform.impl.misc.AhegaoTransformer;
import dev.skidfuscator.obfuscator.transform.impl.number.NumberTransformer;
import dev.skidfuscator.obfuscator.transform.impl.string.StringTransformer;
Expand All @@ -61,7 +60,6 @@
import org.mapleir.deob.PassGroup;
import org.mapleir.deob.dataflow.LiveDataFlowAnalysisImpl;
import org.mapleir.ir.cfg.ControlFlowGraph;
import org.objectweb.asm.Opcodes;
import org.topdank.byteengineer.commons.data.JarClassData;
import org.topdank.byteio.in.AbstractJarDownloader;
import org.topdank.byteio.in.SingleJarDownloader;
Expand All @@ -71,14 +69,8 @@
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Getter
public class Skidfuscator {
Expand Down Expand Up @@ -267,20 +259,8 @@ public ClassOpaquePredicate build(SkidClassNode skidClassNode) {
}

}

LOGGER.log("Finished importing the JVM!");

if (session.getLibs() != null) {
final ClassNode classNode = classSource.findClassNode("org/json/simple/parser/ParseException");
if (classNode == null) {
System.err.println("HAHAHHAHAHAH");
for (ClassNode vertex : classSource.iterateWithLibraries()) {
if (classSource.isLibraryClass(vertex.getName()) && vertex.getName().contains("org") && !vertex.getName().contains("sun"))
System.out.println(vertex.getDisplayName());
}
}
}

/* Resolve context */
LOGGER.post("Resolving basic context...");
this.cxt = new BasicAnalysisContext.BasicContextBuilder()
Expand Down Expand Up @@ -311,7 +291,7 @@ public ClassOpaquePredicate build(SkidClassNode skidClassNode) {
*/
for (Listener o : Arrays.asList(
new StringTransformer(this),
new NegationTransformer(this),
//new NegationTransformer(this),
//new FlatteningFlowTransformer(this),
new NumberTransformer(this),
new SwitchTransformer(this),
Expand Down Expand Up @@ -343,7 +323,9 @@ public ClassOpaquePredicate build(SkidClassNode skidClassNode) {
cfg.verify();
(new SkidFlowGraphDumper(this, cfg, mn)).dump();
} catch (Exception ex){
if (ex instanceof IllegalStateException)
if (ex instanceof IllegalStateException) {
throw ex;
}
ex.printStackTrace();
}
progressBar.step();
Expand Down
Expand Up @@ -7,7 +7,7 @@
import org.mapleir.ir.algorithms.LocalsReallocator;
import org.mapleir.ir.cfg.ControlFlowGraph;
import org.mapleir.ir.cfg.SSAFactory;
import org.mapleir.ir.cfg.builder.ControlFlowGraphBuilder;
import org.mapleir.ir.cfg.builder.*;

public class SkidFlowGraphBuilder extends ControlFlowGraphBuilder {

Expand All @@ -23,6 +23,16 @@ public SkidFlowGraphBuilder(MethodNode method, SSAFactory SSAFactory, boolean op
super(method, SSAFactory, optimise);
}

@Override
protected BuilderPass[] resolvePasses() {
return new BuilderPass[] {
new GenerationPass(this),
new DeadBlocksPass(this),
//new NaturalisationPass(this),
new SSAGenPass(this, false),
};
}

public static ControlFlowGraph build(final Skidfuscator skidfuscator, final MethodNode method) {
ControlFlowGraphBuilder builder = new SkidFlowGraphBuilder(method, SkidBlockFactory.v(skidfuscator));
final ControlFlowGraph cfg = builder.buildImpl();
Expand Down
Expand Up @@ -9,7 +9,10 @@
import org.mapleir.asm.MethodNode;
import org.mapleir.ir.cfg.ControlFlowGraph;
import org.mapleir.ir.code.expr.invoke.*;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.JSRInlinerAdapter;
import org.objectweb.asm.tree.AnnotationNode;

import java.util.*;
Expand Down Expand Up @@ -132,7 +135,9 @@ public void cache() {
this.annotations = new HashMap<>();

try (ProgressBar progressBar = ProgressUtil.progress(skidfuscator.getClassSource().size())){
nodes = skidfuscator.getClassSource().getClassTree().vertices().parallelStream()
nodes = skidfuscator.getClassSource().getClassTree()
.vertices()
.parallelStream()
.filter(e -> {
progressBar.step();
return skidfuscator.getClassSource().isApplicationClass(e.getName());
Expand Down Expand Up @@ -167,9 +172,6 @@ public void recacheInvokes() {
private void setupInvoke() {
try (ProgressBar invocationBar = ProgressUtil.progress(nodes.size())) {
nodes.forEach(c -> {
if (c.isAnnoyingVersion())
return;

for (MethodNode method : c.getMethods()) {
final ControlFlowGraph cfg = skidfuscator.getCxt().getIRCache().getFor(method);

Expand Down

This file was deleted.

@@ -0,0 +1,16 @@
package dev.skidfuscator.obfuscator.phantom.jghost;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Ghost {
private static final Gson GSON = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.disableHtmlEscaping()
.create();

public static Gson gson() {
return GSON;
}
}
@@ -0,0 +1,5 @@
package dev.skidfuscator.obfuscator.phantom.jghost;

public class GhostReader {

}
@@ -0,0 +1,7 @@
package dev.skidfuscator.obfuscator.phantom.jghost.tree;

import org.mapleir.asm.ClassNode;

public class GhostClassNode extends ClassNode {

}
@@ -0,0 +1,10 @@
package dev.skidfuscator.obfuscator.phantom.jghost.tree;

import org.mapleir.asm.ClassNode;
import org.mapleir.asm.MethodNode;

public class GhostMethodNode extends MethodNode {
public GhostMethodNode(org.objectweb.asm.tree.MethodNode node, ClassNode owner) {
super(node, owner);
}
}
@@ -1,4 +1,4 @@
package dev.skidfuscator.obfuscator.phantom;
package dev.skidfuscator.obfuscator.phantom.jphantom;

import ch.qos.logback.classic.Level;
import com.google.common.io.ByteStreams;
Expand Down
@@ -0,0 +1,5 @@
package dev.skidfuscator.obfuscator.phantom.jphantom;

public class PhantomManager {

}
@@ -1,4 +1,4 @@
package dev.skidfuscator.obfuscator.phantom;
package dev.skidfuscator.obfuscator.phantom.jphantom;

import com.google.common.collect.Lists;
import dev.skidfuscator.obfuscator.Skidfuscator;
Expand Down
Expand Up @@ -94,7 +94,7 @@ void handle(final RunMethodTransformEvent event) {
//constantExpr.setConstant(xored);
parent.overwrite(constantExpr, modified);

if (IntegerBlockPredicateRenderer.DEBUG && false) {
if (IntegerBlockPredicateRenderer.DEBUG) {
final Local local1 = cfg.getLocals().get(cfg.getLocals().getMaxLocals() + 2);
vertex.add(
vertex.indexOf(stmt) + 1,
Expand Down
Expand Up @@ -2,6 +2,7 @@

import dev.skidfuscator.obfuscator.util.misc.Pair;
import org.objectweb.asm.*;
import org.objectweb.asm.commons.JSRInlinerAdapter;
import org.objectweb.asm.tree.*;

import java.io.IOException;
Expand Down Expand Up @@ -418,5 +419,4 @@ public static boolean isValidClass(byte[] value) {
return false;
}
}

}

0 comments on commit 4e5a488

Please sign in to comment.