Skip to content

Commit 5709527

Browse files
committed
Merge branch 'dev'
2 parents 9f844a5 + 039c925 commit 5709527

24 files changed

Lines changed: 691 additions & 77 deletions
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<parent>
4+
<artifactId>SkidfuscatorV2</artifactId>
5+
<groupId>dev.skidfuscator.obf</groupId>
6+
<version>1.0-SNAPSHOT</version>
7+
</parent>
8+
<modelVersion>4.0.0</modelVersion>
9+
<artifactId>dev.skidfuscator.obfuscator</artifactId>
10+
<name>Obfuscator</name>
11+
<build>
12+
<plugins>
13+
<plugin>
14+
<artifactId>maven-shade-plugin</artifactId>
15+
<version>3.0.0</version>
16+
<executions>
17+
<execution>
18+
<phase>package</phase>
19+
<goals>
20+
<goal>shade</goal>
21+
</goals>
22+
<configuration>
23+
<transformers>
24+
<transformer>
25+
<manifestEntries>
26+
<Main-Class>dev.skidfuscator.obf.Bootstrapper</Main-Class>
27+
</manifestEntries>
28+
</transformer>
29+
</transformers>
30+
</configuration>
31+
</execution>
32+
</executions>
33+
</plugin>
34+
</plugins>
35+
</build>
36+
<dependencies>
37+
<dependency>
38+
<groupId>org.projectlombok</groupId>
39+
<artifactId>lombok</artifactId>
40+
<version>1.18.16</version>
41+
<scope>provided</scope>
42+
</dependency>
43+
</dependencies>
44+
<properties>
45+
<java.version>1.8</java.version>
46+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
47+
<maven.compiler.source>1.8</maven.compiler.source>
48+
<maven.compiler.target>1.8</maven.compiler.target>
49+
</properties>
50+
</project>
51+

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/SkidMethodRenderer.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.collect.Streams;
44
import dev.skidfuscator.obf.init.SkidSession;
55
import dev.skidfuscator.obf.transform.impl.fixer.ExceptionFixerPass;
6+
import dev.skidfuscator.obf.transform.impl.fixer.SwitchFixerPass;
67
import dev.skidfuscator.obf.transform.impl.flow.*;
78
import dev.skidfuscator.obf.utils.TimedLogger;
89
import dev.skidfuscator.obf.yggdrasil.caller.CallerType;
@@ -40,15 +41,16 @@ public void render(final SkidSession skidSession) {
4041
}
4142
logger.log("Finished initial load");
4243
logger.post("Beginning method load...");
43-
for (MethodNode methodNode : methodNodes) {
44+
45+
methodNodes.stream().parallel().forEach(methodNode -> {
4446
final Set<MethodNode> hierarchy = skidSession.getCxt().getInvocationResolver()
4547
.getHierarchyMethodChain(methodNode.owner, methodNode.getName(), methodNode.getDesc(), true);
4648

4749
hierarchy.add(methodNode);
4850

4951
if (hierarchy.isEmpty()) {
5052
System.out.println("/!\\ Method " + methodNode.getDisplayName() + " is empty!");
51-
continue;
53+
return;
5254
}
5355

5456
SkidMethod method = null;
@@ -66,7 +68,7 @@ public void render(final SkidSession skidSession) {
6668
if (!contains || OpcodeUtil.isSynthetic(methodNode)) {
6769
type = CallerType.LIBRARY;
6870
} else {
69-
final boolean entry = hierarchy.stream().anyMatch(e -> skidSession.getEntryPoints().contains(e));
71+
final boolean entry = methodNode.getName().equals("<init>") || hierarchy.stream().anyMatch(e -> skidSession.getEntryPoints().contains(e));
7072

7173
type = entry ? CallerType.ENTRY : CallerType.APPLICATION;
7274
}
@@ -75,7 +77,7 @@ public void render(final SkidSession skidSession) {
7577
}
7678

7779
skidMethodMap.put(methodNode, method);
78-
}
80+
});
7981

8082
logger.log("Finished loading " + skidMethodMap.size() + " methods");
8183
logger.post("Beginning method mapping...");
@@ -142,9 +144,16 @@ public void render(final SkidSession skidSession) {
142144
};
143145

144146
final FlowPass[] fixers = new FlowPass[] {
145-
new ExceptionFixerPass()
147+
new ExceptionFixerPass(),
148+
new SwitchFixerPass()
146149
};
147150

151+
skidMethods.forEach(e -> {
152+
for (FlowPass flowPass : fixers) {
153+
flowPass.pass(skidSession, e);
154+
}
155+
});
156+
148157
// Fix retarded exceptions
149158
skidMethods.forEach(e -> e.renderPrivate(skidSession));
150159
skidMethods.forEach(e -> {
@@ -177,11 +186,7 @@ public void render(final SkidSession skidSession) {
177186
}
178187
});
179188

180-
skidMethods.forEach(e -> {
181-
for (FlowPass flowPass : fixers) {
182-
flowPass.pass(skidSession, e);
183-
}
184-
});
189+
185190

186191
skidMethods.forEach(e -> e.renderPublic(skidSession));
187192
logger.log("[*] Finished Gen3 flow obfuscation");

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/init/DefaultInitHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import dev.skidfuscator.obf.SkidMethodRenderer;
44
import dev.skidfuscator.obf.utils.MapleJarUtil;
55
import dev.skidfuscator.obf.yggdrasil.EntryPoint;
6-
import dev.skidfuscator.obf.yggdrasil.app.ApplicationEntryPoint;
6+
import dev.skidfuscator.obf.yggdrasil.app.MapleEntryPoint;
77
import lombok.SneakyThrows;
88
import org.mapleir.app.service.ApplicationClassSource;
99
import org.mapleir.app.service.LibraryClassSource;
@@ -67,7 +67,7 @@ public SkidSession init(final File jar, final File output) {
6767

6868
}
6969

70-
final EntryPoint entryPoint = new ApplicationEntryPoint();
70+
final EntryPoint entryPoint = new MapleEntryPoint();
7171

7272
session.addEntryPoints(entryPoint.getEntryPoints(
7373
session,

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/init/SkidSession.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class SkidSession {
3939
private final SingleJarDownloader<ClassNode> jarDownloader;
4040
private final IRCache irFactory;
4141
private final AnalysisContext cxt;
42-
private final MethodInvokerResolver methodInvokerResolver;
42+
//private final MethodInvokerResolver methodInvokerResolver;
4343

4444
private final File outputFile;
4545
private final List<PassGroup> passes = new ArrayList<>();
@@ -74,7 +74,7 @@ public SkidSession(ApplicationClassSource classSource, SingleJarDownloader<Class
7474
;
7575
});
7676
});
77-
this.methodInvokerResolver = new DefaultMethodInvokerResolver(this);
77+
//this.methodInvokerResolver = new DefaultMethodInvokerResolver(this);
7878
}
7979

8080
public void addPass(PassGroup pass) {

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/maple/FakeArithmeticExpr.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.mapleir.ir.code.expr.ArithmeticExpr;
55

66
public class FakeArithmeticExpr extends ArithmeticExpr {
7-
public FakeArithmeticExpr(Expr right, Expr left, Operator operator) {
8-
super(left, right, operator);
7+
public FakeArithmeticExpr(Expr left, Expr right, Operator operator) {
8+
super(right, left, operator);
99
}
1010
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/number/NumberManager.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package dev.skidfuscator.obf.number;
22

33
import dev.skidfuscator.obf.number.encrypt.NumberTransformer;
4+
import dev.skidfuscator.obf.number.encrypt.impl.DebugNumberTransformer;
45
import dev.skidfuscator.obf.number.encrypt.impl.RandomShiftNumberTransformer;
56
import dev.skidfuscator.obf.number.encrypt.impl.XorNumberTransformer;
67
import dev.skidfuscator.obf.number.hash.HashTransformer;
78
import dev.skidfuscator.obf.number.hash.SkiddedHash;
89
import dev.skidfuscator.obf.number.hash.impl.BitwiseHashTransformer;
10+
import dev.skidfuscator.obf.number.hash.impl.IntelliJHashTransformer;
11+
import dev.skidfuscator.obf.number.hash.impl.LegacyHashTransformer;
912
import dev.skidfuscator.obf.utils.RandomUtil;
1013
import org.mapleir.ir.code.Expr;
1114
import org.mapleir.ir.locals.Local;
@@ -17,21 +20,24 @@
1720
*/
1821
public class NumberManager {
1922
private static final NumberTransformer[] TRANSFORMERS = {
23+
//new DebugNumberTransformer(),
2024
new XorNumberTransformer(),
2125
new RandomShiftNumberTransformer()
2226
};
2327

2428
private static final HashTransformer[] HASHER = {
25-
new BitwiseHashTransformer()
29+
new BitwiseHashTransformer(),
30+
new IntelliJHashTransformer(),
31+
new LegacyHashTransformer()
2632
};
2733

28-
public static Expr encrypt(final Number outcome, final Number starting, final Local startingExpr) {
34+
public static Expr encrypt(final int outcome, final int starting, final Local startingExpr) {
2935
// Todo add more transformers + randomization
3036
return TRANSFORMERS[RandomUtil.nextInt(TRANSFORMERS.length)].getNumber(outcome, starting, startingExpr);
3137
}
3238

3339
public static SkiddedHash hash(final int starting, final Local local) {
3440
// Todo add more transformers + randomization
35-
return HASHER[0].hash(starting, local);
41+
return HASHER[RandomUtil.nextInt(HASHER.length)].hash(starting, local);
3642
}
3743
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/number/encrypt/NumberTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
import org.mapleir.ir.locals.Local;
55

66
public interface NumberTransformer {
7-
Expr getNumber(final Number outcome, final Number starting, final Local startingExpr);
7+
Expr getNumber(final int outcome, final int starting, final Local startingExpr);
88
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.skidfuscator.obf.number.encrypt.impl;
2+
3+
import dev.skidfuscator.obf.maple.FakeArithmeticExpr;
4+
import dev.skidfuscator.obf.number.encrypt.NumberTransformer;
5+
import org.mapleir.ir.code.Expr;
6+
import org.mapleir.ir.code.expr.ArithmeticExpr;
7+
import org.mapleir.ir.code.expr.ConstantExpr;
8+
import org.mapleir.ir.code.expr.VarExpr;
9+
import org.mapleir.ir.locals.Local;
10+
import org.objectweb.asm.Type;
11+
12+
/**
13+
* @author Ghast
14+
* @since 09/03/2021
15+
* SkidfuscatorV2 © 2021
16+
*/
17+
public class DebugNumberTransformer implements NumberTransformer {
18+
@Override
19+
public Expr getNumber(final int outcome, final int starting, final Local startingExpr) {
20+
return new ConstantExpr(outcome);
21+
}
22+
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/number/encrypt/impl/RandomShiftNumberTransformer.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@
1212

1313
public class RandomShiftNumberTransformer implements NumberTransformer {
1414
@Override
15-
public Expr getNumber(Number outcome, Number starting, Local startingExpr) {
15+
public Expr getNumber(int outcome, int starting, Local startingExpr) {
1616
Expr expr = new VarExpr(startingExpr, Type.INT_TYPE);
17-
int firstSeed = starting.intValue();
17+
int firstSeed = starting;
1818

1919
boolean switcher = false;
2020

2121
for (int i = 0; i < RandomUtil.nextInt(4); i++) {
2222
switch (RandomUtil.nextInt(3)) {
2323
case 0: {
2424
if (switcher) {
25-
firstSeed = firstSeed >> starting.intValue();
25+
firstSeed = firstSeed >> starting;
2626
expr = new FakeArithmeticExpr(expr, new VarExpr(startingExpr, Type.INT_TYPE), ArithmeticExpr.Operator.SHR);
2727
} else {
2828
final byte seed = (byte) (RandomUtil.nextInt(127) + 1);
@@ -34,7 +34,7 @@ public Expr getNumber(Number outcome, Number starting, Local startingExpr) {
3434
}
3535
case 1: {
3636
if (switcher) {
37-
firstSeed = firstSeed << starting.intValue();
37+
firstSeed = firstSeed << starting;
3838
expr = new FakeArithmeticExpr(expr, new VarExpr(startingExpr, Type.INT_TYPE), ArithmeticExpr.Operator.SHL);
3939
} else {
4040
final byte seed = (byte) (RandomUtil.nextInt(127) + 1);
@@ -45,7 +45,7 @@ public Expr getNumber(Number outcome, Number starting, Local startingExpr) {
4545
}
4646
case 2: {
4747
if (switcher) {
48-
firstSeed = firstSeed & starting.intValue();
48+
firstSeed = firstSeed & starting;
4949
expr = new FakeArithmeticExpr(expr, new VarExpr(startingExpr, Type.INT_TYPE), ArithmeticExpr.Operator.AND);
5050
} else {
5151
final byte seed = (byte) (RandomUtil.nextInt(254) + 1);
@@ -59,7 +59,7 @@ public Expr getNumber(Number outcome, Number starting, Local startingExpr) {
5959
switcher = !switcher;
6060
}
6161

62-
int xor = outcome.intValue() ^ firstSeed;
62+
int xor = outcome ^ firstSeed;
6363
expr = new FakeArithmeticExpr(new ConstantExpr(xor, Type.INT_TYPE), expr, ArithmeticExpr.Operator.XOR);
6464

6565
return expr;

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/number/encrypt/impl/XorNumberTransformer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
*/
1717
public class XorNumberTransformer implements NumberTransformer {
1818
@Override
19-
public Expr getNumber(final Number outcome, final Number starting, final Local startingExpr) {
20-
final int xored = outcome.intValue() ^ starting.intValue();
19+
public Expr getNumber(final int outcome, final int starting, final Local startingExpr) {
20+
final int xored = outcome ^ starting;
2121
final Expr allocExpr = new ConstantExpr(xored);
2222
return new FakeArithmeticExpr(allocExpr, new VarExpr(startingExpr, Type.INT_TYPE), ArithmeticExpr.Operator.XOR);
2323
}

0 commit comments

Comments
 (0)