Skip to content

Commit d4575c8

Browse files
committed
E
1 parent c532343 commit d4575c8

8 files changed

Lines changed: 84 additions & 18 deletions

File tree

maple-ir/org.mapleir.ir/src/main/java/org/mapleir/ir/TypeUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private static Set<Type> __getIntrinsicErrors() {
3535
public static final Type CLONEABLE_TYPE = Type.getType(Cloneable.class);
3636
public static final Type SERIALIZABLE_TYPE = Type.getType(Serializable.class);
3737
public static final Type THROWABLE = Type.getType(Throwable.class);
38-
public static final Type NULL_TYPE = Type.getType(Null.class);
38+
public static final Type NULL_TYPE = OBJECT_TYPE;
3939
public static final Type UNDEFINED_TYPE = Type.getType(Undefined.class);
4040

4141

maple-ir/org.mapleir.ir/src/main/java/org/mapleir/ir/cfg/builder/GenerationPass.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,11 @@ protected void process(LabelNode label) {
313313
break;
314314
} else if (type == FRAME) {
315315
final FrameNode frameNode = (FrameNode) ain;
316-
_frame(frameNode.type, frameNode.stack.toArray(), stacks.toArray());
316+
_frame(
317+
frameNode.type,
318+
frameNode.local == null ? new Object[0] : frameNode.local.toArray(),
319+
frameNode.stack == null ? new Object[0] : frameNode.stack.toArray()
320+
);
317321
break;
318322
}
319323
}
@@ -778,14 +782,23 @@ protected void _monitor(MonitorMode mode) {
778782

779783
protected void _arithmetic(Operator op) {
780784
save_stack(false);
781-
Expr e = builder.factory.arithmetic_expr()
782-
.right(pop())
783-
.left(pop())
784-
.operator(op)
785-
.build();
786-
int index = currentStack.height();
787-
Type type = assign_stack(index, e);
788-
push(load_stack(index, type));
785+
786+
try {
787+
Expr e = builder.factory.arithmetic_expr()
788+
.right(pop())
789+
.left(pop())
790+
.operator(op)
791+
.build();
792+
int index = currentStack.height();
793+
Type type = assign_stack(index, e);
794+
push(load_stack(index, type));
795+
} catch (Throwable e) {
796+
throw new IllegalStateException(
797+
"Failed on " + builder.method.getOwner() + "#" + builder.method.getName(),
798+
e
799+
);
800+
}
801+
789802
}
790803

791804
protected void _neg() {
@@ -1360,7 +1373,7 @@ protected void _store(int index, Type type) {
13601373
protected void _load(int index, Type type) {
13611374
if (!builder.method.isStatic() && index == 0) {
13621375
type = builder.method.getOwnerType();
1363-
} else {
1376+
} /*else {
13641377
int argumentsSize = Type.getArgumentsAndReturnSizes(builder.method.getDesc()) >> 2;
13651378
if (index < argumentsSize) {
13661379
final Type[] args = Type.getArgumentTypes(builder.method.getDesc());
@@ -1377,7 +1390,7 @@ protected void _load(int index, Type type) {
13771390
}
13781391
}
13791392
}
1380-
}
1393+
}*/
13811394

13821395
VarExpr e = _var_expr(index, type, false);
13831396
// assign_stack(currentStack.height(), e);

maple-ir/org.mapleir.ir/src/main/java/org/mapleir/ir/code/expr/ArithmeticExpr.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,15 @@ public Type getType() {
143143
if (operator == Operator.SHL || operator == Operator.SHR) {
144144
return TypeUtils.resolveUnaryOpType(left.getType());
145145
} else {
146-
return TypeUtils.resolveBinOpType(left.getType(), right.getType());
146+
try {
147+
return TypeUtils.resolveBinOpType(left.getType(), right.getType());
148+
} catch (IllegalStateException e) {
149+
throw new IllegalStateException(
150+
"Failed type merge: " + left + " vs " + right
151+
+ " (typeLeft: " + left.getType() + " typeRight: " + right.getType() + ") op " + operator
152+
+ " block: " + getBlock(), e
153+
);
154+
}
147155
}
148156
}
149157

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ public void run() {
339339
if (!session.isJmod()) {
340340
LOGGER.post("↳ Trying to download " + session.getRuntime().toString());
341341
final SingleJarDownloader<ClassNode> libs = MapleJarUtil.importJar(
342-
session.getRuntime()
342+
session.getRuntime(),
343+
this
343344
);
344345
this.classSource.addLibraries((jvmClassSource = new LibraryClassSource(
345346
new ApplicationClassSource(

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.skidfuscator.obfuscator.creator;
22

33
import dev.skidfuscator.obfuscator.Skidfuscator;
4+
import dev.skidfuscator.obfuscator.creator.pass.SkidLocalsReallocator;
45
import dev.skidfuscator.obfuscator.skidasm.cfg.SkidBlockFactory;
56
import org.mapleir.asm.MethodNode;
67
import org.mapleir.ir.algorithms.BoissinotDestructor;
@@ -38,7 +39,7 @@ public static ControlFlowGraph build(final Skidfuscator skidfuscator, final Meth
3839
ControlFlowGraphBuilder builder = new SkidFlowGraphBuilder(method, SkidBlockFactory.v(skidfuscator));
3940
final ControlFlowGraph cfg = builder.buildImpl();
4041
BoissinotDestructor.leaveSSA(cfg);
41-
LocalsReallocator.realloc(cfg);
42+
SkidLocalsReallocator.realloc(skidfuscator, cfg);
4243

4344
return cfg;
4445
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.skidfuscator.obfuscator.creator;
2+
3+
import dev.skidfuscator.obfuscator.Skidfuscator;
4+
import dev.skidfuscator.obfuscator.skidasm.SkidClassNode;
5+
import org.mapleir.asm.ClassNode;
6+
import org.objectweb.asm.ClassReader;
7+
import org.objectweb.asm.commons.JSRInlinerAdapter;
8+
import org.topdank.byteengineer.commons.asm.DefaultASMFactory;
9+
10+
public class SkidLibASMFactory extends DefaultASMFactory {
11+
private final Skidfuscator skidfuscator;
12+
13+
public SkidLibASMFactory(Skidfuscator skidfuscator) {
14+
this.skidfuscator = skidfuscator;
15+
}
16+
17+
@Override
18+
public ClassNode create(byte[] bytes, String name) {
19+
final ClassReader reader = new ClassReader(bytes);
20+
final org.objectweb.asm.tree.ClassNode node = new org.objectweb.asm.tree.ClassNode();
21+
reader.accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES | ClassReader.SKIP_CODE);
22+
23+
for (int i = 0; i < node.methods.size(); i++) {
24+
final org.objectweb.asm.tree.MethodNode methodNode = node.methods.get(i);
25+
final JSRInlinerAdapter adapter = new JSRInlinerAdapter(
26+
methodNode,
27+
methodNode.access,
28+
methodNode.name,
29+
methodNode.desc,
30+
methodNode.signature,
31+
methodNode.exceptions.toArray(new String[0])
32+
);
33+
methodNode.accept(adapter);
34+
node.methods.set(i, adapter);
35+
}
36+
37+
return new SkidClassNode(node, skidfuscator);
38+
}
39+
}

obfuscator/src/main/java/dev/skidfuscator/obfuscator/creator/pass/SkidLocalsReallocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public static int realloc(final Skidfuscator skidfuscator, final ControlFlowGrap
7575
System.err.println(e1.getKey() + " == " + e1.getValue());
7676
}
7777
// String.format("illegal typesets for %s, set=%s, refined=%s", args)
78-
throw new RuntimeException("illegal typesets for " + e.getKey());
78+
throw new RuntimeException("illegal typesets for " + e.getKey() + " types: " + Arrays.toString(set.toArray()));
7979
}
8080
}
8181
Local l = e.getKey();

obfuscator/src/main/java/dev/skidfuscator/obfuscator/util/MapleJarUtil.java

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

33
import dev.skidfuscator.obfuscator.Skidfuscator;
44
import dev.skidfuscator.obfuscator.creator.SkidASMFactory;
5+
import dev.skidfuscator.obfuscator.creator.SkidLibASMFactory;
56
import dev.skidfuscator.obfuscator.phantom.jphantom.PhantomJarDownloader;
67
import dev.skidfuscator.obfuscator.phantom.jphantom.PhantomResolvingJarDumper;
78
import lombok.SneakyThrows;
@@ -96,8 +97,11 @@ public static MultiJarDownloader<ClassNode> importJars(File... file) {
9697
}
9798

9899
@SneakyThrows
99-
public static SingleJarDownloader<ClassNode> importJar(File file) {
100-
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(new JarInfo(file));
100+
public static SingleJarDownloader<ClassNode> importJar(File file, Skidfuscator skidfuscator) {
101+
SingleJarDownloader<ClassNode> dl = new SingleJarDownloader<>(
102+
new SkidLibASMFactory(skidfuscator),
103+
new JarInfo(file)
104+
);
101105
dl.download();
102106

103107
return dl;

0 commit comments

Comments
 (0)