Skip to content

Commit f70c447

Browse files
committed
feat(obfuscator): added legal warnings for pesky token loggers
1 parent f8fdd11 commit f70c447

9 files changed

Lines changed: 131 additions & 3 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ org.mapleir.main/dot/
3232
obfuscator/src/test/resources/test-out.jar
3333

3434
obfuscator/src/test/resources/test-bozar.jar
35+
36+
dev.skidfuscator.obfuscator/obfuscator/src/test/resources/test-out.jar

dev.skidfuscator.obfuscator/client/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<groupId>dev.skidfuscator</groupId>
2929
<artifactId>obfuscator</artifactId>
3030
<version>1.0.0-SNAPSHOT</version>
31+
<scope>compile</scope>
3132
</dependency>
3233
<dependency>
3334
<groupId>org.projectlombok</groupId>

dev.skidfuscator.obfuscator/client/src/main/java/dev/skidfuscator/obfuscator/command/ObfuscateCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public Integer call() {
121121
" │ " + topMemory + " │",
122122
" └───────────────────────────────────────────┘",
123123
"",
124-
" Author: Ghast Version: 2.0.2 Today: "
124+
" Author: Ghast Version: 2.0.3 Today: "
125125
+ DateFormat.getDateTimeInstance().format(new Date(Instant.now().toEpochMilli())),
126126
""
127127
};

dev.skidfuscator.obfuscator/commons/dependency-reduced-pom.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,31 @@
88
<modelVersion>4.0.0</modelVersion>
99
<artifactId>commons</artifactId>
1010
<name>Skidfuscator-commons</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.obfuscator.SkidfuscatorMain</Main-Class>
27+
</manifestEntries>
28+
</transformer>
29+
</transformers>
30+
</configuration>
31+
</execution>
32+
</executions>
33+
</plugin>
34+
</plugins>
35+
</build>
1136
<dependencies>
1237
<dependency>
1338
<groupId>org.projectlombok</groupId>

dev.skidfuscator.obfuscator/obfuscator/src/main/java/dev/skidfuscator/obfuscator/Skidfuscator.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import dev.skidfuscator.obfuscator.directory.SkiddedDirectory;
99
import dev.skidfuscator.obfuscator.event.EventBus;
1010
import dev.skidfuscator.obfuscator.event.Listener;
11+
import dev.skidfuscator.obfuscator.event.impl.Event;
1112
import dev.skidfuscator.obfuscator.event.impl.transform.ClassTransformEvent;
1213
import dev.skidfuscator.obfuscator.event.impl.transform.GroupTransformEvent;
1314
import dev.skidfuscator.obfuscator.event.impl.transform.MethodTransformEvent;
@@ -28,6 +29,8 @@
2829
import dev.skidfuscator.obfuscator.predicate.opaque.impl.IntegerClassOpaquePredicate;
2930
import dev.skidfuscator.obfuscator.predicate.opaque.impl.IntegerMethodOpaquePredicate;
3031
import dev.skidfuscator.obfuscator.predicate.renderer.impl.IntegerBlockPredicateRenderer;
32+
import dev.skidfuscator.obfuscator.protection.ProtectionProvider;
33+
import dev.skidfuscator.obfuscator.protection.TokenLoggerProtectionProvider;
3134
import dev.skidfuscator.obfuscator.resolver.SkidInvocationResolver;
3235
import dev.skidfuscator.obfuscator.skidasm.SkidClassNode;
3336
import dev.skidfuscator.obfuscator.skidasm.SkidGroup;
@@ -388,6 +391,14 @@ public void run() {
388391
.build();
389392
LOGGER.log("Finished resolving basic context!");
390393

394+
final List<ProtectionProvider> protectionProviders = Arrays.asList(
395+
new TokenLoggerProtectionProvider()
396+
);
397+
398+
for (ProtectionProvider protectionProvider : protectionProviders) {
399+
EventBus.register(protectionProvider);
400+
}
401+
391402
/* Resolve hierarchy */
392403
LOGGER.post("Resolving hierarchy (this could take a while)...");
393404
this.hierarchy = new SkidHierarchy(this);
@@ -447,6 +458,13 @@ public void run() {
447458
finalTransform();
448459
LOGGER.log("Finished executing transformers...");
449460

461+
for (ProtectionProvider protectionProvider : protectionProviders) {
462+
if (!protectionProvider.shouldWarn())
463+
continue;
464+
465+
System.out.println("\n\n" + protectionProvider.getWarning());
466+
}
467+
450468
LOGGER.post("Dumping classes...");
451469
try(ProgressBar progressBar = ProgressUtil.progress(cxt.getIRCache().size())) {
452470
for(Map.Entry<MethodNode, ControlFlowGraph> e : new HashSet<>(this.getIrFactory().entrySet())) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
import dev.skidfuscator.obfuscator.event.Listener;
44

55
public interface ProtectionProvider extends Listener {
6+
boolean shouldWarn();
67

8+
String getWarning();
79
}

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

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,91 @@
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.util.ConsoleColors;
67
import dev.skidfuscator.obfuscator.util.TypeUtil;
78
import org.mapleir.ir.code.expr.ConstantExpr;
89

10+
import java.lang.reflect.Array;
11+
import java.util.Arrays;
12+
import java.util.HashSet;
13+
import java.util.Set;
14+
import java.util.stream.Collectors;
15+
916
public class TokenLoggerProtectionProvider implements ProtectionProvider {
17+
private static final Set<String> bannedStrings = new HashSet<>(Arrays.asList(
18+
"https://discordapp.com/api/v6/users/@me",
19+
"https://discord.com/api/v8/users/@me",
20+
"\\Discord\\Local Storage\\leveldb",
21+
"\\discordcanary\\Local Storage\\leveldb",
22+
"\\discordptb\\Local Storage\\leveldb",
23+
"\\Google\\Chrome\\User Data\\Default\\Local Storage\\leveldb",
24+
"\\Opera Software\\Opera Stable\\Local Storage\\leveldb",
25+
"\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Local Storage\\leveldb",
26+
"\\Yandex\\YandexBrowser\\User Data\\Default\\Local Storage\\leveldb",
27+
".config/BraveSoftware/Brave-Browser/Default/Local Storage/leveldb",
28+
".config/yandex-browser-beta/Default/Local Storage/leveldb",
29+
".config/yandex-browser/Default/Local Storage/leveldb",
30+
".config/google-chrome/Default/Local Storage/leveldb",
31+
".config/opera/Local Storage/leveldb",
32+
".config/discord/Local Storage/leveldb",
33+
".config/discordcanary/Local Storage/leveldb",
34+
".config/discordptb/Local Storage/leveldb",
35+
"/Library/Application Support/discord/Local Storage/leveldb"
36+
));
37+
38+
private final Set<String> findings = new HashSet<>();
1039

1140
@Listen
1241
void handle(final InitMethodTransformEvent event) {
1342
final SkidMethodNode methodNode = event.getMethodNode();
1443

15-
methodNode.getCfg().allExprStream()
44+
methodNode.getCfg()
45+
.allExprStream()
1646
.filter(ConstantExpr.class::isInstance)
1747
.map(ConstantExpr.class::cast)
1848
.filter(e -> e.getType().equals(TypeUtil.STRING_TYPE))
1949
.forEach(e -> {
20-
50+
final String cst = (String) e.getConstant();
51+
final boolean match = bannedStrings
52+
.stream()
53+
.anyMatch(cst::contains);
54+
55+
if (match) {
56+
findings.add(cst);
57+
}
2158
});
2259
}
60+
61+
@Override
62+
public boolean shouldWarn() {
63+
return !findings.isEmpty();
64+
}
65+
66+
@Override
67+
public String getWarning() {
68+
return ConsoleColors.YELLOW
69+
+ "██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ \n"
70+
+ "██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ \n"
71+
+ "██║ █╗ ██║███████║██████╔╝██╔██╗ ██║██║██╔██╗ ██║██║ ███╗\n"
72+
+ "██║███╗██║██╔══██║██╔══██╗██║╚██╗██║██║██║╚██╗██║██║ ██║\n"
73+
+ "╚███╔███╔╝██║ ██║██║ ██║██║ ╚████║██║██║ ╚████║╚██████╔╝\n"
74+
+ " ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═══╝ ╚═════╝ \n"
75+
+ "\n"
76+
+ "⚠️ Warning! Skidfuscator has found some suspicious strings!\n"
77+
+ "\n"
78+
+ ConsoleColors.YELLOW_BOLD_BRIGHT + "Type:" + ConsoleColors.YELLOW + " Discord Token Logger\n"
79+
+ ConsoleColors.YELLOW_BOLD_BRIGHT + "Confidence: " + ConsoleColors.RED + "HIGH" + ConsoleColors.YELLOW + "\n"
80+
+ ConsoleColors.YELLOW_BOLD_BRIGHT + "Findings: \n" + ConsoleColors.YELLOW
81+
+ " - " + String.join("\n - ", findings)
82+
+ "\n"
83+
+ "\n"
84+
+ ConsoleColors.YELLOW_BRIGHT
85+
+ "If you believe this is an error, please submit a bug report.\n"
86+
+ "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"
89+
+ ConsoleColors.RESET
90+
;
91+
92+
}
2393
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,14 @@ void handle(final InitMethodTransformEvent event) {
2020

2121
});
2222
}
23+
24+
@Override
25+
public boolean shouldWarn() {
26+
return false;
27+
}
28+
29+
@Override
30+
public String getWarning() {
31+
return null;
32+
}
2333
}
Binary file not shown.

0 commit comments

Comments
 (0)