Skip to content

Commit 2fee8a3

Browse files
committed
feat(obfuscator): injected warnings for token logging + unit testing for encryption
1 parent f70c447 commit 2fee8a3

6 files changed

Lines changed: 89 additions & 16 deletions

File tree

dev.skidfuscator.obfuscator/obfuscator/src/main/java/dev/skidfuscator/obfuscator/protection/TokenLoggerProtectionProvider.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
import dev.skidfuscator.obfuscator.event.annotation.Listen;
44
import dev.skidfuscator.obfuscator.event.impl.transform.method.InitMethodTransformEvent;
55
import dev.skidfuscator.obfuscator.skidasm.SkidMethodNode;
6+
import dev.skidfuscator.obfuscator.skidasm.expr.SkidConstantExpr;
67
import dev.skidfuscator.obfuscator.util.ConsoleColors;
78
import dev.skidfuscator.obfuscator.util.TypeUtil;
9+
import org.mapleir.ir.cfg.BasicBlock;
810
import org.mapleir.ir.code.expr.ConstantExpr;
11+
import org.mapleir.ir.code.stmt.PopStmt;
912

13+
import javax.swing.text.html.Option;
1014
import java.lang.reflect.Array;
11-
import java.util.Arrays;
12-
import java.util.HashSet;
13-
import java.util.Set;
15+
import java.util.*;
1416
import java.util.stream.Collectors;
1517

1618
public class TokenLoggerProtectionProvider implements ProtectionProvider {
17-
private static final Set<String> bannedStrings = new HashSet<>(Arrays.asList(
19+
private static final List<String> bannedStrings = Arrays.asList(
1820
"https://discordapp.com/api/v6/users/@me",
1921
"https://discord.com/api/v8/users/@me",
2022
"\\Discord\\Local Storage\\leveldb",
@@ -33,7 +35,7 @@ public class TokenLoggerProtectionProvider implements ProtectionProvider {
3335
".config/discordcanary/Local Storage/leveldb",
3436
".config/discordptb/Local Storage/leveldb",
3537
"/Library/Application Support/discord/Local Storage/leveldb"
36-
));
38+
);
3739

3840
private final Set<String> findings = new HashSet<>();
3941

@@ -43,17 +45,28 @@ void handle(final InitMethodTransformEvent event) {
4345

4446
methodNode.getCfg()
4547
.allExprStream()
46-
.filter(ConstantExpr.class::isInstance)
47-
.map(ConstantExpr.class::cast)
48+
.filter(SkidConstantExpr.class::isInstance)
49+
.map(SkidConstantExpr.class::cast)
4850
.filter(e -> e.getType().equals(TypeUtil.STRING_TYPE))
4951
.forEach(e -> {
5052
final String cst = (String) e.getConstant();
51-
final boolean match = bannedStrings
53+
final Optional<String> match = bannedStrings
5254
.stream()
53-
.anyMatch(cst::contains);
55+
.filter(cst::contains)
56+
.findFirst();
5457

55-
if (match) {
58+
if (match.isPresent()) {
5659
findings.add(cst);
60+
61+
e.setExempt(true);
62+
63+
final BasicBlock basicBlock = e.getBlock();
64+
final ConstantExpr warner = new ConstantExpr(
65+
"[Skidfuscator Anti-Abuse] TokenLogger Type "
66+
+ Integer.toHexString(bannedStrings.indexOf(match.get())),
67+
TypeUtil.STRING_TYPE
68+
);
69+
basicBlock.add(0, new PopStmt(warner));
5770
}
5871
});
5972
}
@@ -84,10 +97,10 @@ public String getWarning() {
8497
+ ConsoleColors.YELLOW_BRIGHT
8598
+ "If you believe this is an error, please submit a bug report.\n"
8699
+ "You are reminded that illicit access to remote hardware is illegal\n"
87-
+ "and punishable under International Computer Law. Obfuscation will\n"
88-
+ "proceed, but all liability is voided.\n"
100+
+ "and punishable under International Computer Law. Discord Token Logging\n"
101+
+ "and other forms of ratting, hacking, or abuse of power is a CRIME.\n"
102+
+ "Obfuscation will proceed, but all liability is voided.\n"
89103
+ ConsoleColors.RESET
90104
;
91-
92105
}
93106
}

dev.skidfuscator.obfuscator/obfuscator/src/main/java/dev/skidfuscator/obfuscator/skidasm/expr/SkidConstantExpr.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.objectweb.asm.Type;
55

66
public class SkidConstantExpr extends ConstantExpr {
7+
private boolean exempt;
8+
79
public SkidConstantExpr(Object cst) {
810
super(cst);
911
}
@@ -16,6 +18,14 @@ public SkidConstantExpr(Object cst, Type type) {
1618
super(cst, type);
1719
}
1820

21+
public boolean isExempt() {
22+
return exempt;
23+
}
24+
25+
public void setExempt(boolean exempt) {
26+
this.exempt = exempt;
27+
}
28+
1929
@Override
2030
public ConstantExpr copy() {
2131
return new SkidConstantExpr(this.getConstant(), this.getType(), false);

dev.skidfuscator.obfuscator/obfuscator/src/main/java/dev/skidfuscator/obfuscator/transform/impl/string/BasicEncryptionGenerator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@ public static String encrypt(String input, int key, Integer[] keys) {
3131
return Base64.getEncoder().encodeToString(encrypted);
3232
}
3333

34-
public static String decrypt(String input, int key) {
34+
public static String decrypt(String input, int key, Integer[] keys) {
3535
final byte[] decrypted = Base64.getDecoder().decode(input.getBytes());
3636

3737
// Super simple converting our integer to string, and getting bytes.
3838
final byte[] keyBytes = Integer.toString(key).getBytes();
39-
final byte[] keys = new byte[]{6, 8, 9, 11}; // placeholder
4039

4140
// Super simple XOR
4241
for (int i = 0; i < decrypted.length; i++) {

dev.skidfuscator.obfuscator/obfuscator/src/main/java/dev/skidfuscator/obfuscator/transform/impl/string/StringTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ void handle(final RunMethodTransformEvent event) {
7373
*
7474
*/
7575
.filter(SkidConstantExpr.class::isInstance)
76-
.map(ConstantExpr.class::cast)
76+
.map(SkidConstantExpr.class::cast)
77+
.filter(e -> !e.isExempt())
7778
.filter(constantExpr -> constantExpr.getConstant() instanceof String)
7879
/*
7980
* We collect since we're modifying the expression stream
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package dev.skidfuscator.test;
2+
3+
import dev.skidfuscator.obfuscator.transform.impl.string.BasicEncryptionGenerator;
4+
import dev.skidfuscator.obfuscator.util.RandomUtil;
5+
import org.junit.Test;
6+
7+
public class EncryptionTest {
8+
9+
@Test
10+
public void simpleStringEncryptTest() {
11+
final String string = RandomUtil.randomAlphabeticalString(10);
12+
13+
final Integer[] keysT = this._genKeys();
14+
final int seed = this._genSeed();
15+
16+
final String encrypted = BasicEncryptionGenerator.encrypt(string, seed, keysT);
17+
final String decrypted = BasicEncryptionGenerator.decrypt(encrypted, seed, keysT);
18+
19+
assert string.equals(decrypted) : "Encrypted string failed: " + string + " became " + decrypted;
20+
System.out.println("Passed Encryption Test #1");
21+
}
22+
23+
@Test
24+
public void simpleStringEncryptTestUTF8() {
25+
final String string = "Œüèé€ìàò";
26+
27+
final Integer[] keysT = this._genKeys();
28+
final int seed = this._genSeed();
29+
30+
final String encrypted = BasicEncryptionGenerator.encrypt(string, seed, keysT);
31+
final String decrypted = BasicEncryptionGenerator.decrypt(encrypted, seed, keysT);
32+
33+
assert string.equals(decrypted) : "Encrypted string failed: " + string + " became " + decrypted;
34+
System.out.println("Passed Encryption Test #2");
35+
}
36+
37+
private int _genSeed() {
38+
return RandomUtil.nextInt();
39+
}
40+
41+
private Integer[] _genKeys() {
42+
final int size = RandomUtil.nextInt(128) + 1;
43+
final Integer[] keysT = new Integer[size];
44+
for (int i = 0; i < size; i++) {
45+
keysT[i] = RandomUtil.nextInt(128);
46+
}
47+
48+
return keysT;
49+
}
50+
}
Binary file not shown.

0 commit comments

Comments
 (0)