Skip to content

Commit 1da7bf2

Browse files
committed
Rewrite allatori deobfuscator, remove useless constantpropogation
1 parent a46a6b0 commit 1da7bf2

File tree

5 files changed

+111
-360
lines changed

5 files changed

+111
-360
lines changed

src/main/java/com/javadeobfuscator/deobfuscator/transformers/Transformers.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@
2424
import com.javadeobfuscator.deobfuscator.transformers.normalizer.SourceFileClassNormalizer;
2525

2626
public class Transformers {
27-
public static class Allatori {
28-
public static final Class<? extends Transformer> STRING_ENCRYPTION = com.javadeobfuscator.deobfuscator.transformers.allatori.StringEncryptionTransformer.class;
29-
}
30-
3127
public static class Stringer {
3228
public static final Class<? extends Transformer> STRING_ENCRYPTION = com.javadeobfuscator.deobfuscator.transformers.stringer.StringEncryptionTransformer.class;
3329
public static final Class<? extends Transformer> INVOKEDYNAMIC = com.javadeobfuscator.deobfuscator.transformers.stringer.InvokedynamicTransformer.class;

src/main/java/com/javadeobfuscator/deobfuscator/transformers/allatori/StringEncryptionTransformer.java

Lines changed: 0 additions & 182 deletions
This file was deleted.
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* Copyright 2018 Sam Sun <github-contact@samczsun.com>
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.javadeobfuscator.deobfuscator.transformers.allatori.string;
18+
19+
import com.javadeobfuscator.deobfuscator.asm.source.*;
20+
import com.javadeobfuscator.deobfuscator.config.*;
21+
import com.javadeobfuscator.deobfuscator.exceptions.*;
22+
import com.javadeobfuscator.deobfuscator.transformers.*;
23+
import com.javadeobfuscator.deobfuscator.utils.*;
24+
import com.javadeobfuscator.javavm.*;
25+
import com.javadeobfuscator.javavm.exceptions.*;
26+
import com.javadeobfuscator.javavm.mirrors.*;
27+
import org.objectweb.asm.*;
28+
import org.objectweb.asm.tree.*;
29+
import org.objectweb.asm.tree.analysis.*;
30+
import org.objectweb.asm.tree.analysis.Frame;
31+
32+
import java.util.*;
33+
34+
public class StringEncryptionTransformer extends Transformer<TransformerConfig> {
35+
@Override
36+
public boolean transform() throws WrongTransformerException {
37+
VirtualMachine vm = TransformerHelper.newVirtualMachine(this);
38+
39+
// We don't need to initialize for Allatori
40+
for (ClassNode classNode : classes.values()) {
41+
JavaClass.forName(vm, classNode.name).setInitializationState(JavaClass.InitializationState.INITIALIZED, null);
42+
}
43+
44+
int decrypted = 0;
45+
46+
for (ClassNode classNode : classes.values()) {
47+
for (MethodNode methodNode : classNode.methods) {
48+
InstructionModifier modifier = new InstructionModifier();
49+
50+
Frame<SourceValue>[] frames;
51+
try {
52+
frames = new Analyzer<>(new SourceInterpreter()).analyze(classNode.name, methodNode);
53+
} catch (AnalyzerException e) {
54+
oops("unexpected analyzer exception", e);
55+
continue;
56+
}
57+
58+
for (AbstractInsnNode abstractInsnNode : TransformerHelper.instructionIterator(methodNode)) {
59+
if (abstractInsnNode.getOpcode() != INVOKESTATIC) continue;
60+
61+
MethodInsnNode methodInsnNode = (MethodInsnNode) abstractInsnNode;
62+
if (!methodInsnNode.desc.equals("(Ljava/lang/String;)Ljava/lang/String;")) continue;
63+
64+
Frame<SourceValue> currentFrame = frames[methodNode.instructions.indexOf(methodInsnNode)];
65+
66+
MethodNode decryptorMethod = new MethodNode(ACC_STATIC | ACC_PUBLIC, "decrypt" + decrypted, "()Ljava/lang/String;", null, null);
67+
Optional<Object> consensus = SourceFinder.findSource(methodNode, frames, new ConstantPropagatingSourceFinder(), methodInsnNode, currentFrame.getStack(currentFrame.getStackSize() - 1)).consensus();
68+
if (!consensus.isPresent()) continue;
69+
70+
decryptorMethod.instructions.add(new LdcInsnNode(consensus.get()));
71+
decryptorMethod.instructions.add(methodInsnNode.clone(null));
72+
decryptorMethod.instructions.add(new InsnNode(ARETURN));
73+
74+
MethodExecution execution;
75+
76+
ClassNode decryptorNode = new ClassNode();
77+
decryptorNode.visit(49, ACC_PUBLIC, "decryptor" + decrypted, null, "java/lang/Object", null);
78+
decryptorNode.methods.add(decryptorMethod);
79+
try {
80+
execution = vm.execute(decryptorNode, decryptorMethod);
81+
} catch (VMException e) {
82+
oops("unexpected vm exception", e);
83+
TransformerHelper.dumpMethod(decryptorMethod);
84+
continue;
85+
} catch (Throwable e) {
86+
oops("unexpected severe vm exception", e);
87+
TransformerHelper.dumpMethod(decryptorMethod);
88+
continue;
89+
}
90+
91+
String value = vm.convertJavaObjectToString(execution.getReturnValue());
92+
if (value == null) continue;
93+
94+
logger.info("Decrypted string in {} {}{}: {}", classNode.name, methodNode.name, methodNode.desc, value);
95+
96+
modifier.replace(methodInsnNode, new InsnNode(POP), new LdcInsnNode(value));
97+
decrypted++;
98+
}
99+
100+
modifier.apply(methodNode);
101+
}
102+
}
103+
104+
vm.shutdown();
105+
106+
logger.info("Decrypted {} strings", decrypted);
107+
return decrypted > 0;
108+
}
109+
}

src/main/java/com/javadeobfuscator/deobfuscator/transformers/dasho/string/StringEncryptionTransformer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public boolean transform() throws WrongTransformerException {
9999
}
100100

101101
String value = vm.convertJavaObjectToString(execution.getReturnValue());
102+
if (value == null) continue;
103+
102104
logger.info("Decrypted string in {} {}{}: {}", classNode.name, methodNode.name, methodNode.desc, value);
103105

104106
modifier.replace(methodInsnNode, new InsnNode(POP2), new LdcInsnNode(value));

0 commit comments

Comments
 (0)