3
3
import com .vimasig .bozar .obfuscator .Bozar ;
4
4
import com .vimasig .bozar .obfuscator .transformer .ClassTransformer ;
5
5
import com .vimasig .bozar .obfuscator .utils .ASMUtils ;
6
+ import org .objectweb .asm .Opcodes ;
7
+ import org .objectweb .asm .Type ;
6
8
import org .objectweb .asm .tree .*;
7
9
8
10
import java .util .Arrays ;
@@ -41,6 +43,7 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
41
43
methodNode .instructions .insert (il );
42
44
}
43
45
46
+ // Main obfuscation
44
47
Arrays .stream (methodNode .instructions .toArray ())
45
48
.filter (ASMUtils ::isIf )
46
49
.map (insn -> (JumpInsnNode )insn )
@@ -61,11 +64,25 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
61
64
before .add (ASMUtils .pushLong (Math .abs ((jVar = random .nextLong ()) == 0 ? ++jVar : jVar )));
62
65
before .add (new JumpInsnNode (GOTO , label2 ));
63
66
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 ));
66
71
before .add (label2 );
67
- switch (random .nextInt (2 )) {
72
+ switch (random .nextInt (3 )) {
68
73
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 -> {
69
86
before .add (new InsnNode (LCMP ));
70
87
int index = methodNode .maxLocals + 3 ;
71
88
before .add (new VarInsnNode (ISTORE , index ));
@@ -75,12 +92,11 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
75
92
before .add (ASMUtils .pushInt (-1 ));
76
93
before .add (new JumpInsnNode (IF_ICMPNE , label1 ));
77
94
}
78
- case 1 -> {
95
+ case 2 -> {
79
96
before .add (new InsnNode (LAND ));
80
97
before .add (ASMUtils .pushLong (0 ));
81
98
before .add (new InsnNode (LCMP ));
82
99
before .add (new JumpInsnNode (IFNE , label1 ));
83
-
84
100
after .add (new FieldInsnNode (GETSTATIC , classNode .name , this .FLOW_FIELD_NAME , "J" ));
85
101
after .add (ASMUtils .pushLong (0 ));
86
102
after .add (new InsnNode (LCMP ));
@@ -93,6 +109,15 @@ public void transformMethod(ClassNode classNode, MethodNode methodNode) {
93
109
94
110
this .injectInstructions (methodNode , jump , start , before , after , end );
95
111
});
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
+ }
96
121
}
97
122
98
123
private void injectInstructions (MethodNode methodNode , AbstractInsnNode insn , InsnList start , InsnList before , InsnList after , InsnList end ) {
0 commit comments