Skip to content

Commit 602531c

Browse files
committed
Improvements for ControlFlowTransformer
1 parent 625d2e1 commit 602531c

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

src/main/java/com/vimasig/bozar/obfuscator/transformer/impl/ControlFlowTransformer.java

+30-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.vimasig.bozar.obfuscator.Bozar;
44
import com.vimasig.bozar.obfuscator.transformer.ClassTransformer;
55
import com.vimasig.bozar.obfuscator.utils.ASMUtils;
6+
import org.objectweb.asm.Opcodes;
7+
import org.objectweb.asm.Type;
68
import org.objectweb.asm.tree.*;
79

810
import java.util.Arrays;
@@ -41,6 +43,7 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
4143
methodNode.instructions.insert(il);
4244
}
4345

46+
// Main obfuscation
4447
Arrays.stream(methodNode.instructions.toArray())
4548
.filter(ASMUtils::isIf)
4649
.map(insn -> (JumpInsnNode)insn)
@@ -61,11 +64,25 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
6164
before.add(ASMUtils.pushLong(Math.abs((jVar = random.nextLong()) == 0 ? ++jVar : jVar)));
6265
before.add(new JumpInsnNode(GOTO, label2));
6366
before.add(label1);
64-
for(int i = 0; i < 2; i++)
65-
before.add(ASMUtils.pushLong(random.nextLong()));
67+
long v1 = random.nextLong();
68+
long v2 = random.nextLong();
69+
before.add(ASMUtils.pushLong(v1));
70+
before.add(ASMUtils.pushLong(v2));
6671
before.add(label2);
67-
switch (random.nextInt(2)) {
72+
switch (random.nextInt(3)) {
6873
case 0 -> {
74+
before.add(new InsnNode(LXOR));
75+
before.add(ASMUtils.pushLong(v1 ^ v2));
76+
before.add(new InsnNode(LCMP));
77+
before.add(new JumpInsnNode(IFNE, label1));
78+
before.add(new VarInsnNode(ALOAD, methodNode.maxLocals + 4));
79+
before.add(new JumpInsnNode(IFNULL, label3));
80+
before.add(new InsnNode(ACONST_NULL));
81+
before.add(new VarInsnNode(ASTORE, methodNode.maxLocals + 4));
82+
before.add(new JumpInsnNode(GOTO, label0));
83+
before.add(label3);
84+
}
85+
case 1 -> {
6986
before.add(new InsnNode(LCMP));
7087
int index = methodNode.maxLocals + 3;
7188
before.add(new VarInsnNode(ISTORE, index));
@@ -75,12 +92,11 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
7592
before.add(ASMUtils.pushInt(-1));
7693
before.add(new JumpInsnNode(IF_ICMPNE, label1));
7794
}
78-
case 1 -> {
95+
case 2 -> {
7996
before.add(new InsnNode(LAND));
8097
before.add(ASMUtils.pushLong(0));
8198
before.add(new InsnNode(LCMP));
8299
before.add(new JumpInsnNode(IFNE, label1));
83-
84100
after.add(new FieldInsnNode(GETSTATIC, classNode.name, this.FLOW_FIELD_NAME, "J"));
85101
after.add(ASMUtils.pushLong(0));
86102
after.add(new InsnNode(LCMP));
@@ -93,6 +109,15 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
93109

94110
this.injectInstructions(methodNode, jump, start, before, after, end);
95111
});
112+
113+
try {
114+
var typeConstructor = Type.class.getDeclaredConstructor(int.class, String.class, int.class, int.class);
115+
typeConstructor.setAccessible(true);
116+
methodNode.instructions.insert(new VarInsnNode(ASTORE, methodNode.maxLocals + 4));
117+
methodNode.instructions.insert(new LdcInsnNode(typeConstructor.newInstance(11, "()Z", 0, 3)));
118+
} catch (Exception e) {
119+
e.printStackTrace();
120+
}
96121
}
97122

98123
private void injectInstructions(MethodNode methodNode, AbstractInsnNode insn, InsnList start, InsnList before, InsnList after, InsnList end) {

0 commit comments

Comments
 (0)