Skip to content

Commit 6e5df46

Browse files
committed
2.2.0 Enhanced Controlflow
1 parent b3354d8 commit 6e5df46

File tree

5 files changed

+110
-46
lines changed

5 files changed

+110
-46
lines changed

grunt-main/src/main/kotlin/net/spartanb312/grunt/Grunt.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import kotlin.system.measureTimeMillis
1414
* Gruntpocalypse
1515
* A java bytecode obfuscator
1616
*/
17-
const val VERSION = "2.1.1"
18-
const val SUBTITLE = "build 240913"
17+
const val VERSION = "2.2.0"
18+
const val SUBTITLE = "build 240916"
1919
const val GITHUB = "https://github.com/SpartanB312/Grunt"
2020

2121
fun main(args: Array<String>) {

grunt-main/src/main/kotlin/net/spartanb312/grunt/process/Transformers.kt

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ import net.spartanb312.grunt.process.transformers.rename.*
1414
* 000 Optimization
1515
* 010 Trash classes
1616
* 020 Controlflow 1
17-
* 030 Encryption
17+
* 030 Encryption 1
1818
* 040 Controlflow 2
19-
* 050 Redirect
20-
* 060 Miscellaneous 1
21-
* 070 Renaming
22-
* 080 Minecraft
23-
* 090 InvokeDynamic
24-
* 100 Miscellaneous 2
19+
* 050 Encryption 2
20+
* 060 Redirect
21+
* 070 Miscellaneous 1
22+
* 080 Renaming
23+
* 090 Minecraft
24+
* 100 InvokeDynamic & Miscellaneous 2
2525
* MAX PostProcess
2626
*/
2727
object Transformers : Collection<Transformer> by mutableListOf(
@@ -32,27 +32,27 @@ object Transformers : Collection<Transformer> by mutableListOf(
3232
DeadCodeRemoveTransformer order 4,
3333
ClonedClassTransformer order 10,
3434
TrashClassTransformer order 11,
35-
ControlflowTransformer order 20,
35+
//ControlflowTransformer order 20,
3636
StringEncryptTransformer order 30,
3737
NumberEncryptTransformer order 31,
3838
FloatingPointEncryptTransformer order 32,
3939
ArithmeticEncryptTransformer order 33,
40-
ConstPoolEncryptTransformer order 34,
41-
//ImplicitJumpTransformer order 40,
42-
StringEqualsRedirectTransformer order 50,
43-
FieldScrambleTransformer order 51,
44-
MethodScrambleTransformer order 52,
45-
NativeCandidateTransformer order 60,
46-
SyntheticBridgeTransformer order 61,
47-
LocalVariableRenameTransformer order 70,
48-
MethodRenameTransformer order 71,
49-
FieldRenameTransformer order 72,
50-
ClassRenameTransformer order 73,
51-
MixinFieldRenameTransformer order 80,
52-
MixinClassRenameTransformer order 81,
53-
InvokeDynamicTransformer order 90,
54-
ShuffleMembersTransformer order 100,
55-
CrasherTransformer order 101,
56-
WatermarkTransformer order 102,
40+
ControlflowTransformer order 40,
41+
ConstPoolEncryptTransformer order 50,
42+
StringEqualsRedirectTransformer order 60,
43+
FieldScrambleTransformer order 61,
44+
MethodScrambleTransformer order 62,
45+
NativeCandidateTransformer order 70,
46+
SyntheticBridgeTransformer order 71,
47+
LocalVariableRenameTransformer order 80,
48+
MethodRenameTransformer order 81,
49+
FieldRenameTransformer order 82,
50+
ClassRenameTransformer order 83,
51+
MixinFieldRenameTransformer order 90,
52+
MixinClassRenameTransformer order 91,
53+
InvokeDynamicTransformer order 100,
54+
ShuffleMembersTransformer order 101,
55+
CrasherTransformer order 102,
56+
WatermarkTransformer order 103,
5757
PostProcessTransformer order Int.MAX_VALUE
5858
)

grunt-main/src/main/kotlin/net/spartanb312/grunt/process/transformers/flow/ControlflowTransformer.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@ import org.objectweb.asm.Type
1818
import org.objectweb.asm.tree.ClassNode
1919
import org.objectweb.asm.tree.JumpInsnNode
2020
import org.objectweb.asm.tree.MethodNode
21+
import kotlin.random.Random
2122

2223
/**
23-
* Replace direct jump to implicit jump
24-
* Last update on 24/09/13
24+
* Obfuscating the controlflow
25+
* Last update on 24/09/16
2526
*/
2627
object ControlflowTransformer : Transformer("Controlflow", Category.Controlflow), MethodProcessor {
2728

2829
private var beforeEncrypt by setting("ExecuteBeforeEncrypt", false)
2930
private val replaceGoto by setting("ReplaceGoto", true)
3031
private val replaceIf by setting("ReplaceIf", true)
3132
private val intensity by setting("Intensity", 1)
33+
private val reverse by setting("RandomReversedCondition", true)
3234
val useLocalVar by setting("UseLocalVar", true)
3335
val junkCode by setting("JunkCode", true)
3436
val expandedJunkCode by setting("ExpandedJunkCode", true)
@@ -69,7 +71,12 @@ object ControlflowTransformer : Transformer("Controlflow", Category.Controlflow)
6971
val returnType = Type.getReturnType(methodNode.desc)
7072
methodNode.instructions.forEach { insnNode ->
7173
if (insnNode is JumpInsnNode && insnNode.opcode == Opcodes.GOTO) {
72-
+ReplaceGoto.generate(insnNode.label, methodNode, returnType)
74+
+ReplaceGoto.generate(
75+
insnNode.label,
76+
methodNode,
77+
returnType,
78+
reverse && Random.nextBoolean()
79+
)
7380
count++
7481
} else +insnNode
7582
}
@@ -87,7 +94,13 @@ object ControlflowTransformer : Transformer("Controlflow", Category.Controlflow)
8794
|| insnNode.opcode == Opcodes.IF_ICMPLE
8895
|| insnNode.opcode == Opcodes.IF_ICMPNE)
8996
) {
90-
+ReplaceIf.generate(insnNode, insnNode.label, methodNode, returnType)
97+
+ReplaceIf.generate(
98+
insnNode,
99+
insnNode.label,
100+
methodNode,
101+
returnType,
102+
reverse && Random.nextBoolean()
103+
)
91104
count++
92105
} else +insnNode
93106
}

grunt-main/src/main/kotlin/net/spartanb312/grunt/process/transformers/flow/process/ReplaceGoto.kt

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.spartanb312.grunt.process.transformers.flow.process
22

33
import net.spartanb312.grunt.process.transformers.flow.ControlflowTransformer
44
import net.spartanb312.grunt.utils.builder.*
5+
import org.objectweb.asm.Label
56
import org.objectweb.asm.Type
67
import org.objectweb.asm.tree.InsnList
78
import org.objectweb.asm.tree.LabelNode
@@ -13,7 +14,8 @@ object ReplaceGoto {
1314
fun generate(
1415
targetLabel: LabelNode,
1516
methodNode: MethodNode,
16-
returnType: Type
17+
returnType: Type,
18+
reverse: Boolean
1719
): InsnList {
1820
return when (Random.nextInt(6)) {
1921
0 -> insnList {
@@ -25,8 +27,16 @@ object ReplaceGoto {
2527
if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
2628
else LocalVarUsages.Default
2729
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
28-
IF_ICMPEQ(targetLabel)
29-
+JunkCode.generate(methodNode, returnType)
30+
if (reverse) {
31+
val junkLabel = Label()
32+
IF_ICMPNE(junkLabel)
33+
GOTO(targetLabel)
34+
LABEL(junkLabel)
35+
+JunkCode.generate(methodNode, returnType)
36+
} else {
37+
IF_ICMPEQ(targetLabel)
38+
+JunkCode.generate(methodNode, returnType)
39+
}
3040
}
3141

3242
1 -> insnList {
@@ -43,8 +53,16 @@ object ReplaceGoto {
4353
if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
4454
else LocalVarUsages.Default
4555
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
46-
IF_ICMPLT(targetLabel)
47-
+JunkCode.generate(methodNode, returnType)
56+
if (reverse) {
57+
val junkLabel = Label()
58+
IF_ICMPGE(junkLabel)
59+
GOTO(targetLabel)
60+
LABEL(junkLabel)
61+
+JunkCode.generate(methodNode, returnType)
62+
} else {
63+
IF_ICMPLT(targetLabel)
64+
+JunkCode.generate(methodNode, returnType)
65+
}
4866
}
4967

5068
2 -> insnList {
@@ -61,8 +79,16 @@ object ReplaceGoto {
6179
if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
6280
else LocalVarUsages.Default
6381
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
64-
IF_ICMPGE(targetLabel)
65-
+JunkCode.generate(methodNode, returnType)
82+
if (reverse) {
83+
val junkLabel = Label()
84+
IF_ICMPLT(junkLabel)
85+
GOTO(targetLabel)
86+
LABEL(junkLabel)
87+
+JunkCode.generate(methodNode, returnType)
88+
} else {
89+
IF_ICMPGE(targetLabel)
90+
+JunkCode.generate(methodNode, returnType)
91+
}
6692
}
6793

6894
3 -> insnList {
@@ -79,8 +105,16 @@ object ReplaceGoto {
79105
if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
80106
else LocalVarUsages.Default
81107
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
82-
IF_ICMPGT(targetLabel)
83-
+JunkCode.generate(methodNode, returnType)
108+
if (reverse) {
109+
val junkLabel = Label()
110+
IF_ICMPLE(junkLabel)
111+
GOTO(targetLabel)
112+
LABEL(junkLabel)
113+
+JunkCode.generate(methodNode, returnType)
114+
} else {
115+
IF_ICMPGT(targetLabel)
116+
+JunkCode.generate(methodNode, returnType)
117+
}
84118
}
85119

86120
4 -> insnList {
@@ -97,8 +131,16 @@ object ReplaceGoto {
97131
if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
98132
else LocalVarUsages.Default
99133
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
100-
IF_ICMPLE(targetLabel)
101-
+JunkCode.generate(methodNode, returnType)
134+
if (reverse) {
135+
val junkLabel = Label()
136+
IF_ICMPGT(junkLabel)
137+
GOTO(targetLabel)
138+
LABEL(junkLabel)
139+
+JunkCode.generate(methodNode, returnType)
140+
} else {
141+
IF_ICMPLE(targetLabel)
142+
+JunkCode.generate(methodNode, returnType)
143+
}
102144
}
103145

104146
else -> insnList {
@@ -114,8 +156,16 @@ object ReplaceGoto {
114156
val usage = if (ControlflowTransformer.useLocalVar) LocalVarUsages.entries.random()
115157
else LocalVarUsages.Default
116158
+usage.localVarUsage(val1, val2, val3, methodNode.maxLocals, action.insnList)
117-
IF_ICMPNE(targetLabel)
118-
+JunkCode.generate(methodNode, returnType)
159+
if (reverse) {
160+
val junkLabel = Label()
161+
IF_ICMPEQ(junkLabel)
162+
GOTO(targetLabel)
163+
LABEL(junkLabel)
164+
+JunkCode.generate(methodNode, returnType)
165+
} else {
166+
IF_ICMPNE(targetLabel)
167+
+JunkCode.generate(methodNode, returnType)
168+
}
119169
}
120170
}
121171
}

grunt-main/src/main/kotlin/net/spartanb312/grunt/process/transformers/flow/process/ReplaceIf.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ object ReplaceIf {
1717
insnNode: JumpInsnNode,
1818
targetLabel: LabelNode,
1919
methodNode: MethodNode,
20-
returnType: Type
20+
returnType: Type,
21+
reverse: Boolean
2122
): InsnList {
2223
return insnList {
2324
val delegateLabel = Label()
2425
val elseLabel = Label()
2526
+JumpInsnNode(insnNode.opcode, getLabelNode(delegateLabel))
2627
GOTO(elseLabel)
2728
LABEL(delegateLabel)
28-
+ReplaceGoto.generate(targetLabel, methodNode, returnType)
29+
+ReplaceGoto.generate(targetLabel, methodNode, returnType, reverse)
2930
LABEL(elseLabel)
3031
}
3132
}

0 commit comments

Comments
 (0)