Skip to content

Commit 4bb9d94

Browse files
committed
feat(obf): fixed exempts, merged enterprise fixes, improved speed
1 parent 8aebf83 commit 4bb9d94

17 files changed

Lines changed: 388 additions & 61 deletions

File tree

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import dev.skidfuscator.obfuscator.transform.impl.SwitchTransformer;
4444
import dev.skidfuscator.obfuscator.transform.impl.flow.*;
4545
import dev.skidfuscator.obfuscator.transform.impl.flow.condition.BasicConditionTransformer;
46-
import dev.skidfuscator.obfuscator.transform.impl.flow.driver.DriverTransformer;
4746
import dev.skidfuscator.obfuscator.transform.impl.flow.exception.BasicExceptionTransformer;
4847
import dev.skidfuscator.obfuscator.transform.impl.misc.AhegaoTransformer;
4948
import dev.skidfuscator.obfuscator.transform.impl.number.NumberTransformer;
@@ -74,8 +73,10 @@
7473
import org.piwik.java.tracking.PiwikRequest;
7574
import org.topdank.byteengineer.commons.data.JarClassData;
7675
import org.topdank.byteengineer.commons.data.JarContents;
76+
import org.topdank.byteengineer.commons.data.JarResource;
7777

7878
import java.io.File;
79+
import java.io.IOException;
7980
import java.net.URL;
8081
import java.nio.file.*;
8182
import java.util.*;
@@ -303,7 +304,7 @@ public void run() {
303304
System.out.println("┌────────────────────────────[ Results ]────────────────────────────┐");
304305

305306
for (Transformer transformer : transformers) {
306-
System.out.println("│ " + pad(transformer.getResult(), 130) + "│");
307+
System.out.println("│ " + pad(transformer.getResult().replace("Annotation", "@"), 130) + "│");
307308
}
308309
System.out.println("└───────────────────────────────────────────────────────────────────┘\n\n");
309310

@@ -345,8 +346,8 @@ public void run() {
345346
EventBus.end();
346347

347348
_cleanup();
348-
_dump();
349349

350+
_dump();
350351

351352
SkidProgressBar.RENDER_THREAD.shutdown();
352353
IntegerBlockPredicateRenderer.DEBUG = false;
@@ -632,7 +633,7 @@ protected List<Transformer> _loadTransformer() {
632633
public List<Transformer> getTransformers() {
633634
final List<Transformer> transformers = new ArrayList<>();
634635

635-
if (true) {
636+
if (false) {
636637
if (tsConfig.hasPath("stringEncryption.type")) {
637638
switch (tsConfig.getEnum(StringEncryptionType.class, "stringEncryption.type")) {
638639
case STANDARD: transformers.add(new StringTransformer(this)); break;
@@ -648,10 +649,6 @@ public List<Transformer> getTransformers() {
648649
new BasicConditionTransformer(this),
649650
new BasicExceptionTransformer(this),
650651
new BasicRangeTransformer(this),
651-
652-
// Patch
653-
new DriverTransformer(this),
654-
655652
/*
656653
new FlatteningFlowTransformer(this),*/
657654
new AhegaoTransformer(this)
@@ -688,7 +685,7 @@ private void _verify() {
688685
try {
689686
classSource.getClassTree().verify();
690687
} catch (Exception e) {
691-
LOGGER.warn("\n" +
688+
LOGGER.error("\n" +
692689
"-----------------------------------------------------\n"
693690
+ "/!\\ Skidfuscator failed to compute some libraries!\n"
694691
+ "It it advised to read https://github.com/terminalsin/skidfuscator-java-obfuscator/wiki/Libraries\n"
@@ -699,7 +696,7 @@ private void _verify() {
699696
: " " + e.getCause().getMessage() + "\n"
700697
)
701698
+ "-----------------------------------------------------\n"
702-
);
699+
, e);
703700

704701
if (!CLOUD)
705702
System.exit(1);
@@ -820,6 +817,9 @@ private void run(final String phaseName, final Caller caller) {
820817
exemptAnalysis.isExempt(
821818
(Class<? extends Transformer>) listenerClazz,
822819
e
820+
) || exemptAnalysis.isExempt(
821+
(Class<? extends Transformer>) listenerClazz,
822+
e.owner
823823
)
824824
);
825825
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/creator/SkidClassTree.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,25 @@ public SkidClassTree(ApplicationClassSource source, boolean allowPhantomClasses,
2020
this.skidfuscator = skidfuscator;
2121
}
2222

23+
@Override
24+
public void init() {
25+
for (ClassNode node : source.iterate()) {
26+
if (skidfuscator.getExemptAnalysis().isExempt(node))
27+
continue;
28+
29+
addVertex(node);
30+
}
31+
}
32+
2333
@Override
2434
public void verify() {
2535
try (final ProgressWrapper wrapper = ProgressUtil.progressCheck(
2636
source.size(),
2737
"Verified classpath for " + source.size() + " classes"
2838
)){
2939
for (ClassNode node : source.iterate()) {
30-
verifyVertex(node);
3140
wrapper.tick();
41+
verifyVertex(node);
3242
}
3343
}
3444
}
@@ -37,6 +47,29 @@ public void verify() {
3747
public void verifyVertex(ClassNode cn) {
3848
if (skidfuscator.getExemptAnalysis().isExempt(cn))
3949
return;
40-
super.verifyVertex(cn);
50+
51+
if(cn == null) {
52+
throw new IllegalStateException("Vertex is null!");
53+
}
54+
55+
if (!containsVertex(cn)) {
56+
addVertex(cn);
57+
}
58+
59+
if(cn != rootNode) {
60+
ClassNode sup = cn.node.superName != null
61+
? requestClass0(cn.node.superName, cn.getName())
62+
: rootNode;
63+
if(sup == null) {
64+
throw new IllegalStateException(String.format("No superclass %s for %s", cn.node.superName, cn.getName()));
65+
}
66+
67+
for (String s : cn.node.interfaces) {
68+
ClassNode iface = requestClass0(s, cn.getName());
69+
if(iface == null) {
70+
throw new IllegalStateException(String.format("No superinterface %s for %s", s, cn.getName()));
71+
}
72+
}
73+
}
4174
}
4275
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/creator/SkidFlowGraphDumper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,10 @@ private void fixRanges() {
13681368
range.getNodes().stream().filter(BasicBlock::isEmpty).forEach(e -> {
13691369
e.add(new NopStmt());
13701370
});
1371+
1372+
if (range.getNodes().isEmpty()) {
1373+
cfg.removeRange(range);
1374+
}
13711375
}
13721376
}
13731377

@@ -1629,7 +1633,7 @@ private void dumpRange(ExceptionRange<BasicBlock> er) {
16291633
BasicBlock nextBlock = range.get(rangeIdx + 1);
16301634
int nextOrderIdx = order.indexOf(nextBlock);
16311635
if (nextOrderIdx - orderIdx > 1) { // blocks in-between, end the handler and begin anew
1632-
System.err.println("\r\n[warn] Had to split up a range: " + m + "\n");
1636+
Skidfuscator.LOGGER.post("\r\n[warn] Had to split up a range: " + m + "\n");
16331637
Label end = getLabel(order.get(orderIdx + 1));
16341638
assert start != end : "Label assigned is semantically identical.";
16351639
m.node.visitTryCatchBlock(start, end, handler, type.getInternalName());

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/hierarchy/SkidHierarchy.java

Lines changed: 81 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
import org.mapleir.ir.code.expr.invoke.*;
1919
import org.objectweb.asm.*;
2020
import org.objectweb.asm.commons.JSRInlinerAdapter;
21-
import org.objectweb.asm.tree.AnnotationNode;
22-
import org.objectweb.asm.tree.TypeAnnotationNode;
21+
import org.objectweb.asm.tree.*;
2322

2423
import java.util.*;
2524
import java.util.concurrent.ConcurrentHashMap;
@@ -103,6 +102,7 @@ public int compare(MethodNode o1, MethodNode o2) {
103102
return args1.size() - args2.size();
104103
}
105104
}).forEach(method -> {
105+
skidfuscator.getIrFactory().getFor(method);
106106
getGroup(skidfuscator, method);
107107

108108
if (method.node.visibleAnnotations != null) {
@@ -243,17 +243,93 @@ public void recacheInvokes() {
243243
}
244244

245245
private void setupInvoke() {
246+
final List<ClassNode> nodes = skidfuscator
247+
.getClassSource()
248+
.getClassTree()
249+
.vertices()
250+
.stream()
251+
.filter(e -> {
252+
return skidfuscator.getClassSource().isApplicationClass(e.getName());
253+
})
254+
.collect(Collectors.toList());
246255
try (ProgressWrapper invocationBar = ProgressUtil.progressCheck(
247256
nodes.size(),
248257
"Resolved invocation path for " + nodes.size() + " nodes"
249258
)) {
250259
nodes.forEach(c -> {
251260
for (MethodNode method : c.getMethods()) {
261+
final SkidControlFlowGraph cfg = (SkidControlFlowGraph) skidfuscator.getIrFactory().getUnsafe(method);
262+
if (cfg == null) {
263+
for (SkidMethodNode skidMethod : methods) {
264+
for (AbstractInsnNode instruction : skidMethod.node.instructions) {
252265

253-
final SkidControlFlowGraph cfg = skidfuscator.getIrFactory().getFor(method);
266+
final ClassMethodHash target;
267+
final SkidInvocation skidInvocation;
254268

255-
if (cfg == null) {
256-
System.err.println("Failed to compute CFG for method " + method.toString());
269+
if (instruction instanceof InvokeDynamicInsnNode) {
270+
final InvokeDynamicInsnNode e = (InvokeDynamicInsnNode) instruction;
271+
272+
if (!e.bsm.getOwner().equals("java/lang/invoke/LambdaMetafactory")
273+
|| !e.bsm.getName().equals("metafactory")) {
274+
return;
275+
//throw new IllegalStateException("Invalid invoke dynamic!");
276+
}
277+
278+
assert (e.bsmArgs.length == 3 && e.bsmArgs[1] instanceof Handle);
279+
final Handle boundFunc = (Handle) e.bsmArgs[1];
280+
281+
// Patch for implicit funtions
282+
// TODO: Fix this
283+
if (boundFunc.getName().startsWith("lambda$new$")) {
284+
final String returnType = Type.getReturnType(e.desc).getClassName().replace(".", "/");
285+
//System.out.println("Attempting to locate " + returnType);
286+
final ClassNode targetClass = skidfuscator.getClassSource().findClassNode(returnType);
287+
288+
if (!(targetClass instanceof SkidClassNode))
289+
return;
290+
291+
assert targetClass.getMethods().size() == 1 : "Implicit Function must be single method!";
292+
final SkidMethodNode methodNode = (SkidMethodNode) targetClass.getMethods().get(0);
293+
294+
methodNode.getGroup().setImplicitFunction(true);
295+
//System.out.println("Found implicit function: " + methodNode.toString());
296+
return;
297+
}
298+
299+
target = new ClassMethodHash(boundFunc.getName(), boundFunc.getDesc(), boundFunc.getOwner());
300+
skidInvocation = new SkidInvocation(
301+
method,
302+
e
303+
);
304+
} else if (instruction instanceof MethodInsnNode) {
305+
final MethodInsnNode e = (MethodInsnNode) instruction;
306+
target = new ClassMethodHash(e.name, e.desc, e.owner);
307+
skidInvocation = new SkidInvocation(
308+
method,
309+
e
310+
);
311+
} else {
312+
continue;
313+
}
314+
315+
final SkidGroup targetGroup = hashToGroupMap.get(target);
316+
317+
if (targetGroup != null) {
318+
targetGroup.getInvokers().add(skidInvocation);
319+
}
320+
321+
final MethodNode targetMethod = hashToMethodMap.get(target);
322+
if (targetMethod != null) {
323+
if (targetMethod instanceof SkidMethodNode) {
324+
((SkidMethodNode) targetMethod).addInvocation(skidInvocation);
325+
}
326+
327+
methodToInvocationsMap.computeIfAbsent(targetMethod, e -> {
328+
return new ArrayList<>(Collections.singleton(skidInvocation));
329+
});
330+
}
331+
}
332+
}
257333
continue;
258334
}
259335

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/phantom/jphantom/PhantomJarDownloader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void download() throws IOException {
104104
try {
105105
cn = factory.create(db, name);
106106

107-
if (skidfuscator.getExemptAnalysis().isExempt(cn)) {
107+
if (false && skidfuscator.getExemptAnalysis().isExempt(cn)) {
108108
phantomContents.getClassContents().add(new JarClassData(
109109
name,
110110
db,

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/phantom/jphantom/PhantomResolvingJarDumper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ public void dump(File file) throws IOException {
7373
throw e;
7474
}
7575

76-
contents.getClassContents().remove(cn);
76+
//contents.getClassContents().remove(cn);
7777
jos.flush();
7878
progressBar.tick();
7979
}
8080

8181
for (JarResource res : new LinkedList<>(contents.getResourceContents())) {
8282
resourcesDumped += dumpResource(jos, res.getName(), res.getData());
8383

84-
contents.getResourceContents().remove(res);
84+
//contents.getResourceContents().remove(res);
8585
progressBar.tick();
8686
}
8787
}

0 commit comments

Comments
 (0)