Skip to content

Commit 7cc7653

Browse files
committed
feat(obf): got bored added 2 new string encryptions
1 parent 5a1b8e8 commit 7cc7653

8 files changed

Lines changed: 458 additions & 7 deletions

File tree

dev.skidfuscator.obfuscator/out/production/resources/log4j.properties

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
# Redirect log messages to console
2-
log4j.rootLogger=DEBUG, stdout
3-
log4j.rootLogger=ERROR, stderr
4-
log4j.rootLogger=INFO, stdout
2+
log4j.rootLogger=INFO, stderr, file
53

64
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
75
log4j.appender.stdout.Target=System.out
86
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
9-
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n
7+
log4j.appender.stdout.layout.ConversionPattern=%m%n
108

119
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
1210
log4j.appender.stderr.Target=System.err
1311
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
1412
log4j.appender.stderr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n
1513

14+
log4j.appender.file=org.apache.log4j.RollingFileAppender
15+
log4j.appender.file.File=skidfuscator.log
16+
log4j.appender.file.MaxFileSize=1MB
17+
log4j.appender.file.MaxBackupIndex=1
18+
log4j.appender.file.Append=false
19+
log4j.appender.file.layout=org.apache.log4j.PatternLayout
20+
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
21+
1622
# Redirect log messages to a log file, support file rolling.
1723
# log4j.appender.file=org.apache.log4j.RollingFileAppender
1824
# log4j.appender.file.File=C:\\log4j-application.log

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ protected List<Transformer> _loadTransformer() {
633633
public List<Transformer> getTransformers() {
634634
final List<Transformer> transformers = new ArrayList<>();
635635

636-
if (false) {
636+
if (true) {
637637
if (tsConfig.hasPath("stringEncryption.type")) {
638638
switch (tsConfig.getEnum(StringEncryptionType.class, "stringEncryption.type")) {
639639
case STANDARD: transformers.add(new StringTransformer(this)); break;

dev.skidfuscator.obfuscator/src/main/java/dev/skidfuscator/obfuscator/transform/impl/string/StringTransformer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import dev.skidfuscator.obfuscator.transform.impl.string.generator.algo.AESEncryptionGenerator;
1616
import dev.skidfuscator.obfuscator.transform.impl.string.generator.algo.CaesarEncryptionGenerator;
1717
import dev.skidfuscator.obfuscator.transform.impl.string.generator.basic.BasicEncryptionGenerator;
18+
import dev.skidfuscator.obfuscator.transform.impl.string.generator.guard.ByteBufferEncryptionGenerator;
1819
import dev.skidfuscator.obfuscator.util.RandomUtil;
1920
import org.mapleir.asm.ClassNode;
2021
import org.mapleir.asm.FieldNode;
@@ -72,7 +73,7 @@ void handle(final RunMethodTransformEvent event) {
7273
EncryptionGenerator generator = keyMap.get(parentNode);
7374

7475
if (generator == null) {
75-
switch (RandomUtil.nextInt(1)) {
76+
switch (RandomUtil.nextInt(3)) {
7677
case 1: {
7778
final String iv = RandomUtil.randomAlphabeticalString(16);
7879
keyMap.put(parentNode, (generator = new AESEncryptionGenerator(iv)));
@@ -86,7 +87,7 @@ void handle(final RunMethodTransformEvent event) {
8687
keys[i] = RandomUtil.nextInt(127) + 1;
8788
}
8889

89-
keyMap.put(parentNode, (generator = new CaesarEncryptionGenerator(keys)));
90+
keyMap.put(parentNode, (generator = new ByteBufferEncryptionGenerator(keys)));
9091
break;
9192
}
9293
default: {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package dev.skidfuscator.obfuscator.transform.impl.string.generator.algo;
2+
3+
import dev.skidfuscator.obfuscator.event.EventBus;
4+
import dev.skidfuscator.obfuscator.event.impl.transform.method.InitMethodTransformEvent;
5+
import dev.skidfuscator.obfuscator.skidasm.SkidClassNode;
6+
import dev.skidfuscator.obfuscator.skidasm.SkidMethodNode;
7+
import dev.skidfuscator.obfuscator.transform.impl.string.generator.EncryptionGenerator;
8+
import org.objectweb.asm.Label;
9+
import org.objectweb.asm.MethodVisitor;
10+
import org.objectweb.asm.Opcodes;
11+
12+
import javax.crypto.Cipher;
13+
import javax.crypto.spec.IvParameterSpec;
14+
import javax.crypto.spec.SecretKeySpec;
15+
import java.nio.ByteBuffer;
16+
import java.nio.CharBuffer;
17+
import java.nio.charset.StandardCharsets;
18+
import java.util.Random;
19+
20+
import static org.objectweb.asm.Opcodes.*;
21+
22+
public class IvEncryptionGenerator implements EncryptionGenerator {
23+
private static final String KEY = "ComplexKey12345"; // Static key
24+
private static final String IV = "ComplexIV1234567"; // Static IV
25+
26+
public IvEncryptionGenerator(String iv) {
27+
assert iv.length() == 16 : "AES IV must be 16 bytes long";
28+
}
29+
30+
private static String transform(String input, boolean encrypt) {
31+
final int prime = 257; // Use a prime number for calculations
32+
int[] keyExpansion = new int[input.length()];
33+
int[] ivExpansion = new int[input.length()];
34+
for (int i = 0; i < input.length(); i++) {
35+
keyExpansion[i] = (KEY.charAt(i % KEY.length()) * prime) % 256;
36+
ivExpansion[i] = (IV.charAt(i % IV.length()) * prime) % 256;
37+
}
38+
39+
StringBuilder output = new StringBuilder();
40+
int previousChar = 0;
41+
for (int i = 0; i < input.length(); i++) {
42+
int inputChar = input.charAt(i);
43+
int keyChar = keyExpansion[i];
44+
int ivChar = ivExpansion[i];
45+
int mix = (keyChar + ivChar + previousChar) % 256; // Mix with previous char for more complexity
46+
if (encrypt) {
47+
inputChar = (inputChar + mix) % 256;
48+
} else {
49+
inputChar = (inputChar - mix + 256) % 256; // Ensure positive by adding 256 before mod
50+
}
51+
previousChar = inputChar; // Use current char as previous for next iteration
52+
char outputChar = (char) inputChar;
53+
output.append(outputChar);
54+
}
55+
56+
57+
// Further scramble the output using a simple transposition based on key and IV length for more complexity
58+
if (encrypt) {
59+
output = new StringBuilder(scramble(output.toString(), KEY.length() + IV.length()));
60+
} else {
61+
output = new StringBuilder(unscramble(output.toString(), KEY.length() + IV.length()));
62+
}
63+
64+
return output.toString();
65+
}
66+
67+
private static String scramble(String input, int step) {
68+
char[] arr = new char[input.length()];
69+
for (int i = 0; i < input.length(); i++) {
70+
int j = (i * step) % input.length();
71+
arr[j] = input.charAt(i);
72+
}
73+
return new String(arr);
74+
}
75+
76+
private static String unscramble(String input, int step) {
77+
char[] arr = new char[input.length()];
78+
for (int i = 0; i < input.length(); i++) {
79+
int j = (i * step) % input.length();
80+
arr[i] = input.charAt(j);
81+
}
82+
return new String(arr);
83+
}
84+
85+
@Override
86+
public byte[] encrypt(String input, int key) {
87+
try {
88+
return transform(input, true).getBytes(StandardCharsets.UTF_8);
89+
} catch (Throwable ex) {
90+
throw new IllegalStateException("Failed to encrypt", ex);
91+
}
92+
}
93+
94+
@Override
95+
public String decrypt(byte[] input, int key) {
96+
try {
97+
return transform(new String(input, StandardCharsets.UTF_8), false);
98+
} catch (Throwable ex) {
99+
throw new IllegalStateException("Failed to decrypt", ex);
100+
}
101+
}
102+
103+
@Override
104+
public void visit(final SkidClassNode node, String name) {
105+
106+
}
107+
}

0 commit comments

Comments
 (0)