Skip to content

Commit b0950d2

Browse files
committed
Fixed a lotta stuff
1 parent de02398 commit b0950d2

7 files changed

Lines changed: 154 additions & 13 deletions

File tree

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.collect.Streams;
44
import dev.skidfuscator.obf.init.SkidSession;
5+
import dev.skidfuscator.obf.maple.FakeConditionalJumpStmt;
56
import dev.skidfuscator.obf.skidasm.NoNoSkidMethod;
67
import dev.skidfuscator.obf.skidasm.v2.SStorage;
78
import dev.skidfuscator.obf.transform.impl.ProjectPass;
@@ -181,10 +182,11 @@ public void render(final SkidSession skidSession) {
181182
logger.post("[*] Gen3 Flow... Beginning obfuscation...");
182183
final FlowPass[] flowPasses = new FlowPass[]{
183184
//new NumberMutatorPass(),
184-
//new SwitchMutatorPass(),
185+
new SwitchMutatorPass(),
186+
//new ConditionV2MutatorPass(),
185187
//new ConditionMutatorPass(),
186-
//new FakeExceptionJumpFlowPass(),
187-
//new FakeJumpFlowPass(),
188+
new FakeExceptionJumpFlowPass(),
189+
new FakeJumpFlowPass(),
188190
new SeedFlowPass(),
189191
};
190192

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/skidasm/SkidGraph.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ public void postlinearize(final ControlFlowGraph cfg) {
7373
// Phase 2
7474
linearize(cfg);
7575

76-
range(cfg, local);
7776
linkage(cfg, local);
7877

7978
/*BasicBlock next = cfg.verticesInOrder().iterator().next();
@@ -165,11 +164,19 @@ private void linkage(final ControlFlowGraph cfg, final Local local) {
165164
});
166165
}
167166

167+
range(cfg, local);
168+
168169
for (BasicBlock entry : cfg.vertices()) {
169170
new HashSet<>(entry).forEach(e -> {
170171
if (e instanceof UnconditionalJumpStmt) {
171172
addSeedToUncJump(local, entry, (UnconditionalJumpStmt) e);
172-
} else if (e instanceof ConditionalJumpStmt && !(e instanceof FakeConditionalJumpStmt)) {
173+
}
174+
});
175+
}
176+
177+
for (BasicBlock entry : new HashSet<>(cfg.vertices())) {
178+
new HashSet<>(entry).forEach(e -> {
179+
if (e instanceof ConditionalJumpStmt && !(e instanceof FakeConditionalJumpStmt)) {
173180
addSeedToCondJump(local, entry, (ConditionalJumpStmt) e);
174181
}
175182
});
@@ -262,7 +269,7 @@ private void addSeedToUncJump(final Local local, final BasicBlock block, final U
262269
private void addSeedToCondJump(final Local local, final BasicBlock block, final ConditionalJumpStmt stmt) {
263270
// Todo Add support for various different types of conditional jumps
264271
// support such as block splitting and shit to mess with reversers
265-
if (true) {
272+
if (false) {
266273
final SkidBlock seededBlock = getBlock(block);
267274
final SkidBlock targetSeededBlock = getBlock(stmt.getTrueSuccessor());
268275

@@ -286,7 +293,7 @@ private void addSeedToCondJump(final Local local, final BasicBlock block, final
286293
}
287294

288295
final ConditionalJumpEdge<BasicBlock> edge = block.cfg.getEdges(block).stream()
289-
.filter(e -> !(e instanceof ImmediateEdge))
296+
.filter(e -> e instanceof ConditionalJumpEdge)
290297
.map(e -> (ConditionalJumpEdge<BasicBlock>) e)
291298
.filter(e -> e.dst().equals(stmt.getTrueSuccessor()))
292299
.findFirst()
@@ -391,7 +398,7 @@ private void addSeedToRange(final Local local, final ControlFlowGraph cfg, final
391398
// Haha get fucked
392399
// Todo Fix the other shit to re-enable this; this is for the lil shits
393400
// (love y'all tho) that are gonna try reversing this
394-
for (int i = 0; i < 10; i++) {
401+
/*for (int i = 0; i < 10; i++) {
395402
// Generate random seed + prevent conflict
396403
final int seed = RandomUtil.nextInt();
397404
if (sortedList.contains(seed))
@@ -412,7 +419,7 @@ private void addSeedToRange(final Local local, final ControlFlowGraph cfg, final
412419
413420
basicBlockMap.put(seed, block);
414421
cfg.addEdge(new SwitchEdge<>(handler.getBlock(), block, seed));
415-
}
422+
}*/
416423

417424
// Hash
418425
final Expr hash = hashTransformer.hash(local);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.skidfuscator.obf.transform.impl.fixer;
2+
3+
import dev.skidfuscator.obf.init.SkidSession;
4+
import dev.skidfuscator.obf.skidasm.SkidGraph;
5+
import dev.skidfuscator.obf.skidasm.SkidMethod;
6+
import dev.skidfuscator.obf.transform.impl.flow.FlowPass;
7+
import org.mapleir.flowgraph.edges.DefaultSwitchEdge;
8+
import org.mapleir.flowgraph.edges.UnconditionalJumpEdge;
9+
import org.mapleir.ir.cfg.BasicBlock;
10+
import org.mapleir.ir.cfg.ControlFlowGraph;
11+
import org.mapleir.ir.code.Stmt;
12+
import org.mapleir.ir.code.stmt.SwitchStmt;
13+
import org.mapleir.ir.code.stmt.UnconditionalJumpStmt;
14+
15+
import java.util.HashSet;
16+
17+
public class ReturnFixerPass implements FlowPass {
18+
@Override
19+
public void pass(SkidSession session, SkidMethod method) {
20+
for (SkidGraph methodNode : method.getMethodNodes()) {
21+
final ControlFlowGraph cfg = session.getCxt().getIRCache().get(methodNode.getNode());
22+
23+
if (cfg == null)
24+
continue;
25+
26+
27+
}
28+
}
29+
30+
@Override
31+
public String getName() {
32+
return "Switch Fixer";
33+
}
34+
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/transform/impl/flow/ConditionMutatorPass.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.skidfuscator.obf.init.SkidSession;
44
import dev.skidfuscator.obf.maple.FakeArithmeticExpr;
5+
import dev.skidfuscator.obf.maple.FakeConditionalJumpStmt;
56
import dev.skidfuscator.obf.number.NumberManager;
67
import dev.skidfuscator.obf.number.hash.HashTransformer;
78
import dev.skidfuscator.obf.number.hash.SkiddedHash;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package dev.skidfuscator.obf.transform.impl.flow;
2+
3+
import dev.skidfuscator.obf.init.SkidSession;
4+
import dev.skidfuscator.obf.maple.FakeConditionalJumpStmt;
5+
import dev.skidfuscator.obf.number.NumberManager;
6+
import dev.skidfuscator.obf.number.hash.HashTransformer;
7+
import dev.skidfuscator.obf.number.hash.SkiddedHash;
8+
import dev.skidfuscator.obf.number.hash.impl.BitwiseHashTransformer;
9+
import dev.skidfuscator.obf.skidasm.SkidBlock;
10+
import dev.skidfuscator.obf.skidasm.SkidGraph;
11+
import dev.skidfuscator.obf.skidasm.SkidMethod;
12+
import dev.skidfuscator.obf.utils.Blocks;
13+
import org.mapleir.X;
14+
import org.mapleir.flowgraph.edges.ConditionalJumpEdge;
15+
import org.mapleir.flowgraph.edges.UnconditionalJumpEdge;
16+
import org.mapleir.ir.cfg.BasicBlock;
17+
import org.mapleir.ir.cfg.ControlFlowGraph;
18+
import org.mapleir.ir.code.Expr;
19+
import org.mapleir.ir.code.Stmt;
20+
import org.mapleir.ir.code.expr.ComparisonExpr;
21+
import org.mapleir.ir.code.expr.ConstantExpr;
22+
import org.mapleir.ir.code.expr.VarExpr;
23+
import org.mapleir.ir.code.stmt.ConditionalJumpStmt;
24+
import org.mapleir.ir.code.stmt.UnconditionalJumpStmt;
25+
import org.objectweb.asm.Type;
26+
27+
import java.util.HashSet;
28+
29+
public class ConditionV2MutatorPass implements FlowPass {
30+
@Override
31+
public void pass(SkidSession session, SkidMethod method) {
32+
for (SkidGraph methodNode : method.getMethodNodes()) {
33+
if (methodNode.getNode().isAbstract() || methodNode.isInit())
34+
continue;
35+
36+
final ControlFlowGraph cfg = session.getCxt().getIRCache().get(methodNode.getNode());
37+
38+
if (cfg == null)
39+
continue;
40+
41+
for (BasicBlock parent : new HashSet<>(cfg.vertices())) {
42+
if (parent.size() == 0)
43+
continue;
44+
45+
for (Stmt stmt : new HashSet<>(parent)) {
46+
if (!(stmt instanceof ConditionalJumpStmt)) {
47+
continue;
48+
}
49+
50+
final ConditionalJumpStmt jumpStmt = (ConditionalJumpStmt) stmt;
51+
52+
if (!jumpStmt.getComparisonType().equals(ConditionalJumpStmt.ComparisonType.EQ))
53+
continue;
54+
55+
final SkidBlock mutatedBlock = methodNode.getBlock(parent);
56+
57+
final Expr right = jumpStmt.getRight();
58+
final Expr left = jumpStmt.getLeft();
59+
60+
if (right == null || left == null)
61+
continue;
62+
63+
right.unlink();
64+
left.unlink();
65+
66+
final ComparisonExpr real_expr = new ComparisonExpr(left, right, ComparisonExpr.ValueComparisonType.CMP);
67+
68+
final SkiddedHash hash = NumberManager.hash(mutatedBlock.getSeed(), methodNode.getLocal());
69+
final ComparisonExpr fake_expr = new ComparisonExpr(hash.getExpr(), new ConstantExpr(hash.getHash()), ComparisonExpr.ValueComparisonType.CMP);
70+
71+
final FakeConditionalJumpStmt conditionalJumpStmt = new FakeConditionalJumpStmt(real_expr, fake_expr, jumpStmt.getTrueSuccessor(), ConditionalJumpStmt.ComparisonType.EQ);
72+
parent.set(parent.indexOf(stmt), conditionalJumpStmt);
73+
}
74+
}
75+
76+
}
77+
}
78+
79+
@Override
80+
public String getName() {
81+
return "Condition Mutator";
82+
}
83+
}

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/transform/impl/flow/FakeExceptionJumpFlowPass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void pass(SkidSession session, SkidMethod method) {
6666
final BasicBlock fuckup = Blocks.exception(cfg);
6767

6868
// Todo change blocks to be skiddedblocks to add method to directly add these
69-
final FakeConditionalJumpStmt jump_stmt = new FakeConditionalJumpStmt(hash.getExpr(), var_const, fuckup, ConditionalJumpStmt.ComparisonType.NE);
69+
final ConditionalJumpStmt jump_stmt = new ConditionalJumpStmt(hash.getExpr(), var_const, fuckup, ConditionalJumpStmt.ComparisonType.NE);
7070
final ConditionalJumpEdge<BasicBlock> jump_edge = new ConditionalJumpEdge<>(entry, fuckup, jump_stmt.getOpcode());
7171

7272
if (entry.get(entry.size() - 1) instanceof UnconditionalJumpStmt)

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obf/transform/impl/kappa/AhegaoPass.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.mapleir.asm.ClassNode;
77
import org.mapleir.asm.FieldNode;
88
import org.mapleir.asm.MethodNode;
9+
import org.mapleir.flowgraph.edges.AbstractFlowEdge;
910
import org.mapleir.ir.TypeUtils;
1011
import org.mapleir.ir.cfg.BasicBlock;
1112
import org.mapleir.ir.cfg.ControlFlowGraph;
@@ -17,6 +18,7 @@
1718
import org.mapleir.ir.code.stmt.ArrayStoreStmt;
1819
import org.mapleir.ir.code.stmt.FieldStoreStmt;
1920
import org.mapleir.ir.code.stmt.PopStmt;
21+
import org.mapleir.ir.code.stmt.ReturnStmt;
2022
import org.mapleir.ir.locals.Local;
2123
import org.objectweb.asm.Opcodes;
2224
import org.objectweb.asm.Type;
@@ -35,13 +37,17 @@ public class AhegaoPass implements ProjectPass {
3537
@Override
3638
public void pass(SkidSession session) {
3739
for (ClassNode classNode : session.getClassSource().iterate()) {
40+
if (classNode.isEnum() || (classNode.node.access & Opcodes.ACC_INTERFACE) != 0)
41+
continue;
42+
3843
final org.objectweb.asm.tree.FieldNode fieldNode = new org.objectweb.asm.tree.FieldNode(
3944
Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
4045
"nothing_to_see_here",
4146
"[Ljava/lang/String;",
4247
null,
4348
null
4449
);
50+
4551
final FieldNode mapleNode = new FieldNode(fieldNode, classNode);
4652
classNode.getFields().add(mapleNode);
4753
classNode.node.fields.add(fieldNode);
@@ -104,17 +110,25 @@ public void pass(SkidSession session) {
104110

105111
Stmt stmt = stack.pop();
106112

107-
if (cfg.getEntries().isEmpty()) {
108-
cfg.addVertex(new BasicBlock(cfg));
113+
if (cfg.vertices().isEmpty()) {
114+
final BasicBlock block = new BasicBlock(cfg);
115+
cfg.addVertex(block);
116+
cfg.getEntries().add(block);
117+
block.add(new ReturnStmt());
118+
}
119+
120+
// Todo Find the source of this issue. No idea why it's ignoring returns
121+
if (!cfg.allExprStream().findAny().isPresent()) {
122+
cfg.getEntries().iterator().next().add(new ReturnStmt());
109123
}
110124

111125
while (stmt != null) {
112126
cfg.getEntries().iterator().next().add(0, stmt);
113-
114127
if (stack.isEmpty())
115128
break;
116129
stmt = stack.pop();
117130
}
131+
118132
}
119133
}
120134

0 commit comments

Comments
 (0)