Skip to content

Commit

Permalink
feat(obf): mom new encryption system dropped
Browse files Browse the repository at this point in the history
  • Loading branch information
terminalsin committed Apr 4, 2024
1 parent f81321a commit acbce8f
Show file tree
Hide file tree
Showing 16 changed files with 12,535 additions and 8 deletions.
4 changes: 3 additions & 1 deletion dev.skidfuscator.obfuscator/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,6 @@ dependencies {

test {
useJUnitPlatform()
}
}
sourceCompatibility = JavaVersion.VERSION_1_9
targetCompatibility = JavaVersion.VERSION_1_9
430 changes: 430 additions & 0 deletions dev.skidfuscator.obfuscator/skidfuscator-error-ezc.txt

Large diffs are not rendered by default.

664 changes: 664 additions & 0 deletions dev.skidfuscator.obfuscator/skidfuscator-error-oku.txt

Large diffs are not rendered by default.

10,567 changes: 10,567 additions & 0 deletions dev.skidfuscator.obfuscator/skidfuscator.log.1

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import dev.skidfuscator.obfuscator.transform.impl.number.NumberTransformer;
import dev.skidfuscator.obfuscator.transform.impl.string.StringEncryptionType;
import dev.skidfuscator.obfuscator.transform.impl.string.StringTransformer;
import dev.skidfuscator.obfuscator.transform.impl.string.StringTransformerV2;
import dev.skidfuscator.obfuscator.util.MapleJarUtil;
import dev.skidfuscator.obfuscator.util.MiscUtil;
import dev.skidfuscator.obfuscator.util.ProgressUtil;
Expand Down Expand Up @@ -636,10 +637,10 @@ public List<Transformer> getTransformers() {
if (true) {
if (tsConfig.hasPath("stringEncryption.type")) {
switch (tsConfig.getEnum(StringEncryptionType.class, "stringEncryption.type")) {
case STANDARD: transformers.add(new StringTransformer(this)); break;
case STANDARD: transformers.add(new StringTransformerV2(this)); break;
}
} else {
transformers.add(new StringTransformer(this));
transformers.add(new StringTransformerV2(this));
}

transformers.addAll(Arrays.asList(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,10 @@ void handle(final PostMethodTransformEvent event) {
final MethodOpaquePredicate predicate = methodNode.getPredicate();
PredicateFlowGetter getter = predicate.getGetter();

assert getter != null : "Predicate flow getter is null! Has group not been initialized?";
assert getter != null : String.format(
"Getter for method %s is null!",
methodNode.getName()
);

PredicateFlowGetter localGetterT = methodNode.getFlowPredicate().getGetter();
PredicateFlowSetter localSetterT = methodNode.getFlowPredicate().getSetter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@

import java.util.ArrayList;

@Getter // TODO: Deprecate the getter and document the stuff
// TODO: Deprecate the getter and document the stuff
public class SkidClassNode extends ClassNode {
@Getter
private final Skidfuscator skidfuscator;
@Getter
private final ClassOpaquePredicate classPredicate;
@Getter
private final ClassOpaquePredicate staticPredicate;
private transient SkidMethodNode clinitNode;
private transient Boolean mixin;
@Getter
private final AttributeMap attributes;

private transient Integer randomInt;
Expand Down Expand Up @@ -120,7 +124,7 @@ public SkidMethodNode getClassInit() {
.access(Opcodes.ACC_STATIC)
.desc("()V")
.name("<clinit>")
.phantom(false)
.phantom(true)
.build();

clinit.getEntryBlock().add(new ReturnStmt());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public SkidFieldNodeBuilder desc(String desc) {
return this;
}

public SkidFieldNodeBuilder phantom(final boolean phantom) {
this.phantom = phantom;
return this;
}

public SkidFieldNodeBuilder signature(String signature) {
this.fieldNodeBuilder.signature(signature);
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ void handle(final RunMethodTransformEvent event) {
if (cfg == null)
return;

final MethodNode clinit = methodNode.getParent().getClinitNode();

final InsnList insnList = new InsnList();
// TODO: Don't forget if you use ASM, compute the CFG again with
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ void handle(final RunMethodTransformEvent event) {
if (cfg == null)
return;

final MethodNode clinit = methodNode.getParent().getClinitNode();

final InsnList insnList = new InsnList();
// TODO: Don't forget if you use ASM, compute the CFG again with
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package dev.skidfuscator.obfuscator.transform.impl.string;

import dev.skidfuscator.obfuscator.Skidfuscator;
import dev.skidfuscator.obfuscator.event.annotation.Listen;
import dev.skidfuscator.obfuscator.event.impl.transform.method.RunMethodTransformEvent;
import dev.skidfuscator.obfuscator.event.impl.transform.skid.PostSkidTransformEvent;
import dev.skidfuscator.obfuscator.skidasm.SkidClassNode;
import dev.skidfuscator.obfuscator.skidasm.SkidMethodNode;
import dev.skidfuscator.obfuscator.skidasm.cfg.SkidBlock;
import dev.skidfuscator.obfuscator.skidasm.expr.SkidConstantExpr;
import dev.skidfuscator.obfuscator.transform.AbstractTransformer;
import dev.skidfuscator.obfuscator.transform.Transformer;
import dev.skidfuscator.obfuscator.transform.impl.string.generator.EncryptionGeneratorV3;
import dev.skidfuscator.obfuscator.transform.impl.string.generator.v3.ByteBufferClinitV3EncryptionGenerator;
import dev.skidfuscator.obfuscator.transform.impl.string.generator.v3.BytesClinitV3EncryptionGenerator;
import dev.skidfuscator.obfuscator.util.RandomUtil;
import org.mapleir.asm.ClassNode;
import org.mapleir.ir.cfg.ControlFlowGraph;
import org.mapleir.ir.code.CodeUnit;
import org.mapleir.ir.code.Expr;

import java.util.*;
import java.util.stream.Collectors;

public class StringTransformerV2 extends AbstractTransformer {
private final Map<SkidClassNode, EncryptionGeneratorV3> keyMap = new HashMap<>();

private final Set<String> INJECTED = new HashSet<>();

public StringTransformerV2(Skidfuscator skidfuscator) {
this(skidfuscator, Collections.emptyList());
}

public StringTransformerV2(Skidfuscator skidfuscator, List<Transformer> children) {
super(skidfuscator, "String Encryption", children);
}

@Listen
void handle(final RunMethodTransformEvent event) {
final SkidMethodNode methodNode = event.getMethodNode();

if (methodNode.isAbstract()
|| methodNode.isInit()) {
this.skip();
return;
}

if (methodNode.node.instructions.size() > 10000) {
this.fail();
return;
}

final ControlFlowGraph cfg = methodNode.getCfg();

if (cfg == null) {
this.fail();
return;
}

final SkidClassNode parentNode = methodNode.getParent();

EncryptionGeneratorV3 generator = keyMap.get(parentNode);

if (generator == null) {
switch (RandomUtil.nextInt(1)) {
default: {
final int size = RandomUtil.nextInt(127) + 1;
final byte[] keys = new byte[size];

for (int i = 0; i < size; i++) {
keys[i] = (byte) (RandomUtil.nextInt(127) + 1);
}

keyMap.put(parentNode, (generator = new ByteBufferClinitV3EncryptionGenerator()));
break;
}
}
}

if (!INJECTED.contains(parentNode.getName())) {
generator.visitPre((SkidClassNode) methodNode.owner);
INJECTED.add(parentNode.getName());
}

EncryptionGeneratorV3 finalGenerator = generator;
cfg.allExprStream()
/*
*
*/
.filter(SkidConstantExpr.class::isInstance)
.map(SkidConstantExpr.class::cast)
.filter(e -> !e.isExempt())
.filter(constantExpr -> constantExpr.getConstant() instanceof String)
/*
* We collect since we're modifying the expression stream
* we kinda need to just not cause any concurrency issue.
* ¯\_(ツ)_/¯
*/
.collect(Collectors.toList())
.forEach(unit -> {
final CodeUnit parent = unit.getParent();
final String constant = (String) unit.getConstant();
final SkidBlock block = (SkidBlock) unit.getBlock();

final Expr encrypted = finalGenerator.encrypt(constant, methodNode, block);

try {
parent.overwrite(unit, encrypted);
} catch (IllegalStateException e) {
return;
}
});
this.success();
}

@Listen
void handle(final PostSkidTransformEvent event) {
keyMap.forEach((clazz, generator) -> generator.visitPost(clazz));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package dev.skidfuscator.obfuscator.transform.impl.string.generator;

import dev.skidfuscator.obfuscator.skidasm.SkidClassNode;
import dev.skidfuscator.obfuscator.skidasm.SkidMethodNode;
import dev.skidfuscator.obfuscator.skidasm.cfg.SkidBlock;
import org.mapleir.ir.code.Expr;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.HashMap;
import java.util.Map;

public interface EncryptionGeneratorV3 {
Expr encrypt(String input, final SkidMethodNode node, final SkidBlock block);

String decrypt(DecryptorDictionary input, int key);

void visitPre(final SkidClassNode node);

default void visitPost(final SkidClassNode node) {};

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface InjectMethod {
// empty
String value();
InjectMethodTag[] tags() default {};
}

enum InjectMethodTag {
RANDOM_NAME
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface InjectField {
// empty
String value();
InjectFieldTag[] tags() default {};
}

enum InjectFieldTag {
RANDOM_NAME,
FINAL,
NO_INTERFACE_COMPAT
}

class DecryptorDictionary {
private final Map<String, DecryptorItem<?>> items;

public DecryptorDictionary(Map<String, DecryptorItem<?>> items) {
this.items = items;
}

public <T> T get(String key) {
return (T) items.get(key).getKey();
}

public DecryptorDictionary of(String key, Object value) {
items.put(key, new DecryptorItem<>(key, value));
return this;
}

public static DecryptorDictionary create() {
return new DecryptorDictionary(new HashMap<>());
}
}

class DecryptorItem<T> {
private final String key;
private final T value;

public DecryptorItem(String key, T value) {
this.key = key;
this.value = value;
}

public String getKey() {
return key;
}

public T getValue() {
return value;
}
}
}
Loading

0 comments on commit acbce8f

Please sign in to comment.