1
1
package dev .skidfuscator .obf .skidasm ;
2
2
3
+ import dev .skidfuscator .obf .maple .FakeBlock ;
4
+ import dev .skidfuscator .obf .maple .FakeConditionalJumpEdge ;
3
5
import dev .skidfuscator .obf .maple .FakeConditionalJumpStmt ;
6
+ import dev .skidfuscator .obf .maple .FakeUnconditionalJumpStmt ;
4
7
import dev .skidfuscator .obf .number .NumberManager ;
5
8
import dev .skidfuscator .obf .number .encrypt .impl .XorNumberTransformer ;
6
9
import dev .skidfuscator .obf .number .hash .HashTransformer ;
@@ -37,7 +40,8 @@ public class SkidGraph {
37
40
@ Getter
38
41
private Local local ;
39
42
private final Map <BasicBlock , SkidBlock > cache = new HashMap <>();
40
- private final Set <LinearLink > linearLinks = new HashSet <>();
43
+
44
+ public static final boolean DEBUG = false ;
41
45
42
46
public SkidGraph (MethodNode node , SkidMethod method ) {
43
47
this .node = node ;
@@ -73,7 +77,6 @@ public void postlinearize(final ControlFlowGraph cfg) {
73
77
// Phase 2
74
78
linearize (cfg );
75
79
76
- range (cfg , local );
77
80
linkage (cfg , local );
78
81
79
82
/*BasicBlock next = cfg.verticesInOrder().iterator().next();
@@ -97,6 +100,9 @@ public void postlinearize(final ControlFlowGraph cfg) {
97
100
}*/
98
101
99
102
for (BasicBlock vertex : cfg .vertices ()) {
103
+ if (vertex instanceof FakeBlock )
104
+ continue ;
105
+
100
106
cfg .getEdges (vertex ).stream ()
101
107
.filter (e -> e instanceof ImmediateEdge )
102
108
.forEach (e -> {
@@ -132,17 +138,17 @@ public void postlinearize(final ControlFlowGraph cfg) {
132
138
}
133
139
}*/
134
140
135
- for (BasicBlock block : cfg .vertices ()) {
136
- final SkidBlock targetSeededBlock = getBlock (block );
137
- /*final Local local1 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
138
- block.add(0, new CopyVarStmt(new VarExpr(local1, Type.getType(String.class)),
139
- new ConstantExpr(block.getDisplayName() +" : c-var - begin : " + targetSeededBlock.getSeed())));
140
- final Local local2 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
141
- block.add(block.size() - 1, new CopyVarStmt(new VarExpr(local2, Type.getType(String.class)),
142
- new ConstantExpr(block.getDisplayName() +" : c-var - end : " + targetSeededBlock.getSeed())));
143
- */
141
+ if (DEBUG ) {
142
+ for (BasicBlock block : cfg .vertices ()) {
143
+ final SkidBlock targetSeededBlock = getBlock (block );
144
+ final Local local1 = block .cfg .getLocals ().get (block .cfg .getLocals ().getMaxLocals () + 2 );
145
+ block .add (0 , new CopyVarStmt (new VarExpr (local1 , Type .getType (String .class )),
146
+ new ConstantExpr (block .getDisplayName () +" : c-var - begin : " + targetSeededBlock .getSeed ())));
147
+ final Local local2 = block .cfg .getLocals ().get (block .cfg .getLocals ().getMaxLocals () + 2 );
148
+ block .add (block .size () - 1 , new CopyVarStmt (new VarExpr (local2 , Type .getType (String .class )),
149
+ new ConstantExpr (block .getDisplayName () +" : c-var - end : " + targetSeededBlock .getSeed ())));
150
+ }
144
151
}
145
-
146
152
}
147
153
148
154
private void linearize (final ControlFlowGraph cfg ) {
@@ -165,11 +171,19 @@ private void linkage(final ControlFlowGraph cfg, final Local local) {
165
171
});
166
172
}
167
173
168
- for (BasicBlock entry : cfg .vertices ()) {
174
+ range (cfg , local );
175
+
176
+ for (BasicBlock entry : new HashSet <>(cfg .vertices ())) {
169
177
new HashSet <>(entry ).forEach (e -> {
170
- if (e instanceof UnconditionalJumpStmt ) {
178
+ if (e instanceof UnconditionalJumpStmt && !( e instanceof FakeUnconditionalJumpStmt ) ) {
171
179
addSeedToUncJump (local , entry , (UnconditionalJumpStmt ) e );
172
- } else if (e instanceof ConditionalJumpStmt && !(e instanceof FakeConditionalJumpStmt )) {
180
+ }
181
+ });
182
+ }
183
+
184
+ for (BasicBlock entry : new HashSet <>(cfg .vertices ())) {
185
+ new HashSet <>(entry ).forEach (e -> {
186
+ if (e instanceof ConditionalJumpStmt && !(e instanceof FakeConditionalJumpStmt )) {
173
187
addSeedToCondJump (local , entry , (ConditionalJumpStmt ) e );
174
188
}
175
189
});
@@ -228,10 +242,13 @@ private void addSeedToImmediate(final Local local, final BasicBlock block, final
228
242
final SkidBlock seededBlock = getBlock (block );
229
243
final SkidBlock targetSeededBlock = getBlock (immediate );
230
244
seededBlock .addSeedLoader (-1 , local , seededBlock .getSeed (), targetSeededBlock .getSeed ());
231
- /*final Local local1 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
232
- block.add(block.size(), new CopyVarStmt(new VarExpr(local1, Type.getType(String.class)),
233
- new ConstantExpr(block.getDisplayName() +" : c-loc - immediate : " + targetSeededBlock.getSeed())));
234
- */
245
+
246
+ if (DEBUG ) {
247
+ final Local local1 = block .cfg .getLocals ().get (block .cfg .getLocals ().getMaxLocals () + 2 );
248
+ block .add (block .size (), new CopyVarStmt (new VarExpr (local1 , Type .getType (String .class )),
249
+ new ConstantExpr (block .getDisplayName () +" : c-loc - immediate : " + targetSeededBlock .getSeed ())));
250
+ }
251
+
235
252
// Ignore, this is for debugging
236
253
/*
237
254
final Local local1 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
@@ -248,10 +265,12 @@ private void addSeedToUncJump(final Local local, final BasicBlock block, final U
248
265
final SkidBlock targetSeededBlock = getBlock (stmt .getTarget ());
249
266
seededBlock .addSeedLoader (index , local , seededBlock .getSeed (), targetSeededBlock .getSeed ());
250
267
251
- /*final Local local1 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
252
- block.add(index, new CopyVarStmt(new VarExpr(local1, Type.getType(String.class)),
253
- new ConstantExpr(block.getDisplayName() +" : c-loc - uncond : " + targetSeededBlock.getSeed())));
254
- */
268
+ if (DEBUG ) {
269
+ final Local local1 = block .cfg .getLocals ().get (block .cfg .getLocals ().getMaxLocals () + 2 );
270
+ block .add (index , new CopyVarStmt (new VarExpr (local1 , Type .getType (String .class )),
271
+ new ConstantExpr (block .getDisplayName () +" : c-loc - uncond : " + targetSeededBlock .getSeed ())));
272
+ }
273
+
255
274
/*
256
275
final Local local1 = block.cfg.getLocals().get(block.cfg.getLocals().getMaxLocals() + 2);
257
276
block.add(new CopyVarStmt(new VarExpr(local1, Type.getType(String.class)),
@@ -262,7 +281,7 @@ private void addSeedToUncJump(final Local local, final BasicBlock block, final U
262
281
private void addSeedToCondJump (final Local local , final BasicBlock block , final ConditionalJumpStmt stmt ) {
263
282
// Todo Add support for various different types of conditional jumps
264
283
// support such as block splitting and shit to mess with reversers
265
- if (true ) {
284
+ if (false ) {
266
285
final SkidBlock seededBlock = getBlock (block );
267
286
final SkidBlock targetSeededBlock = getBlock (stmt .getTrueSuccessor ());
268
287
@@ -286,7 +305,7 @@ private void addSeedToCondJump(final Local local, final BasicBlock block, final
286
305
}
287
306
288
307
final ConditionalJumpEdge <BasicBlock > edge = block .cfg .getEdges (block ).stream ()
289
- .filter (e -> !(e instanceof ImmediateEdge ))
308
+ .filter (e -> e instanceof ConditionalJumpEdge && !(e instanceof FakeConditionalJumpEdge ))
290
309
.map (e -> (ConditionalJumpEdge <BasicBlock >) e )
291
310
.filter (e -> e .dst ().equals (stmt .getTrueSuccessor ()))
292
311
.findFirst ()
@@ -311,6 +330,12 @@ private void addSeedToCondJump(final Local local, final BasicBlock block, final
311
330
// Replace successor
312
331
stmt .setTrueSuccessor (basicBlock );
313
332
block .cfg .addEdge (new ConditionalJumpEdge <>(block , basicBlock , stmt .getOpcode ()));
333
+
334
+ if (DEBUG ) {
335
+ final Local local1 = block .cfg .getLocals ().get (block .cfg .getLocals ().getMaxLocals () + 2 );
336
+ block .add (block .indexOf (stmt ), new CopyVarStmt (new VarExpr (local1 , Type .getType (String .class )),
337
+ new ConstantExpr (block .getDisplayName () +" : c-loc - cond : " + targetSeeded .getSeed ())));
338
+ }
314
339
//seededBlock.addSeedLoader(index + 2, local, targetSeededBlock.getSeed(), seededBlock.getSeed());
315
340
}
316
341
@@ -356,15 +381,15 @@ private void addSeedToRange(final Local local, final ControlFlowGraph cfg, final
356
381
final SkidBlock internal = getBlock (node );
357
382
358
383
// Create a new switch block and get it's seeded variant
359
- final BasicBlock block = new BasicBlock (cfg );
384
+ final BasicBlock block = new FakeBlock (cfg );
360
385
cfg .addVertex (block );
361
386
final SkidBlock seededBlock = getBlock (block );
362
387
363
388
// Add a seed loader for the incoming block and convert it to the handler's
364
389
seededBlock .addSeedLoader (0 , local , internal .getSeed (), handler .getSeed ());
365
390
366
391
// Jump to handler
367
- block .add (new UnconditionalJumpStmt (basicHandler ));
392
+ block .add (new FakeUnconditionalJumpStmt (basicHandler ));
368
393
cfg .addEdge (new UnconditionalJumpEdge <>(block , basicHandler ));
369
394
370
395
// Final hashed
@@ -391,7 +416,7 @@ private void addSeedToRange(final Local local, final ControlFlowGraph cfg, final
391
416
// Haha get fucked
392
417
// Todo Fix the other shit to re-enable this; this is for the lil shits
393
418
// (love y'all tho) that are gonna try reversing this
394
- for (int i = 0 ; i < 10 ; i ++) {
419
+ /* for (int i = 0; i < 10; i++) {
395
420
// Generate random seed + prevent conflict
396
421
final int seed = RandomUtil.nextInt();
397
422
if (sortedList.contains(seed))
@@ -412,7 +437,7 @@ private void addSeedToRange(final Local local, final ControlFlowGraph cfg, final
412
437
413
438
basicBlockMap.put(seed, block);
414
439
cfg.addEdge(new SwitchEdge<>(handler.getBlock(), block, seed));
415
- }
440
+ }*/
416
441
417
442
// Hash
418
443
final Expr hash = hashTransformer .hash (local );
0 commit comments