key = new AtomicReference<>();
36 |
37 | /* Firstly you must use HP888StringTransformer, so key would be decrypted,
38 | and it only searches in loader classes so don't tell me its bad searching. */
39 | scopedClasses().stream().map(ClassWrapper::classNode).forEach(classNode -> classNode.methods.forEach(methodNode -> methodNode.instructions.forEach(abstractInsnNode -> {
40 | if (abstractInsnNode.isString() && abstractInsnNode.asString().endsWith("==")) {
41 | // Find base64 key
42 | key.set(abstractInsnNode.asString());
43 | }
44 | })));
45 |
46 | if (key.get().isEmpty()) {
47 | LOGGER.error("Key not found");
48 | return;
49 | }
50 |
51 | // Decrypt encrypted classes
52 | Cipher cipher = Cipher.getInstance("AES");
53 | cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.getDecoder().decode(key.get()), "AES"));
54 | context().getFilesMap().forEach((file, bytes) -> {
55 | if (file.endsWith(encryptedClassFilesSuffix)) {
56 | filesToRemove.add(file);
57 |
58 | String path = file.replace(encryptedClassFilesSuffix, ".class").replace(".", "/");
59 | try {
60 | // Decrypt!
61 | byte[] decrypted = cipher.doFinal(bytes);
62 |
63 | // Load and put class
64 | context().addCompiledClass(path, decrypted);
65 |
66 | markChange();
67 | } catch (Exception e) {
68 | throw new RuntimeException("Failed to decrypt class: " + path, e);
69 | }
70 | }
71 | });
72 |
73 | // Cleanup
74 | filesToRemove.forEach(context().getFilesMap()::remove);
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/qprotect/qProtectFieldFlowTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.qprotect;
2 |
3 | import org.objectweb.asm.tree.FieldInsnNode;
4 | import uwu.narumi.deobfuscator.api.asm.MethodContext;
5 | import uwu.narumi.deobfuscator.api.asm.matcher.Match;
6 | import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch;
7 | import uwu.narumi.deobfuscator.api.asm.matcher.impl.NumberMatch;
8 | import uwu.narumi.deobfuscator.api.asm.matcher.impl.OpcodeMatch;
9 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
10 |
11 | public class qProtectFieldFlowTransformer extends Transformer {
12 | private static final Match FIELD_FLOW_PATTERN = SequenceMatch.of(
13 | // Init variable through field
14 | NumberMatch.of(),
15 | OpcodeMatch.of(PUTSTATIC).capture("field"),
16 | // Compare
17 | NumberMatch.of(),
18 | OpcodeMatch.of(GETSTATIC),
19 | Match.of(ctx -> ctx.insn().isCompare())
20 | );
21 |
22 | @Override
23 | protected void transform() throws Exception {
24 | scopedClasses().parallelStream().forEach(classWrapper -> {
25 | classWrapper.methods().parallelStream().forEach(methodNode -> {
26 | MethodContext methodContext = MethodContext.of(classWrapper, methodNode);
27 | FIELD_FLOW_PATTERN.findAllMatches(methodContext).forEach(match -> {
28 | FieldInsnNode fieldInsn = (FieldInsnNode) match.captures().get("field").insn();
29 |
30 | // Remove field flow
31 | match.removeAll();
32 |
33 | markChange();
34 | });
35 | });
36 | });
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/qprotect/qProtectTryCatchTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.qprotect;
2 |
3 | import org.objectweb.asm.tree.AbstractInsnNode;
4 | import org.objectweb.asm.tree.JumpInsnNode;
5 | import org.objectweb.asm.tree.LabelNode;
6 | import uwu.narumi.deobfuscator.api.asm.MethodContext;
7 | import uwu.narumi.deobfuscator.api.asm.matcher.Match;
8 | import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext;
9 | import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch;
10 | import uwu.narumi.deobfuscator.api.asm.matcher.impl.MethodMatch;
11 | import uwu.narumi.deobfuscator.api.asm.matcher.impl.OpcodeMatch;
12 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
13 |
14 | /**
15 | * Removes fake try catch blocks
16 | *
17 | * Transforms this:
18 | *
19 | * block12: {
20 | * plugin = IllIllllIlIl;
21 | * try {
22 | * PLJ.lIIlIIIllIlI("NFdlWk9sV3NYZTQ1Zm5vRg==", "##J\u001d\"\nZ\u00182F-2t%2R5\u001fPX?Iei\u001c0S*!\u001bU\"$\\ \n.5#E,Zs\u0000\"\u000blOfo2\u001a`-O\u0003:b<4?z D;\u000e^\u0012'\u0004V\u0013?%\u0007\u0003%\u000e\u0017\u000bxb\r\u0006\u0019;#T,Zs\u0000\"\u000blOx\u007f");
23 | * break block12;
24 | * } catch (RuntimeException runtimeException) {
25 | * // empty catch block
26 | * }
27 | * while (true) {
28 | * // Infinite loop
29 | * }
30 | * }
31 | *
32 | *
33 | * Into this:
34 | *
35 | * plugin = IllIllllIlIl;
36 | * PLJ.lIIlIIIllIlI("NFdlWk9sV3NYZTQ1Zm5vRg==", "##J\u001d\"\nZ\u00182F-2t%2R5\u001fPX?Iei\u001c0S*!\u001bU\"$\\ \n.5#E,Zs\u0000\"\u000blOfo2\u001a`-O\u0003:b<4?z D;\u000e^\u0012'\u0004V\u0013?%\u0007\u0003%\u000e\u0017\u000bxb\r\u0006\u0019;#T,Zs\u0000\"\u000blOx\u007f");
37 | *
38 | */
39 | public class qProtectTryCatchTransformer extends Transformer {
40 | private static final Match SELF_THROW_TRY_CATCH_MATCH = SequenceMatch.of(
41 | OpcodeMatch.of(DUP),
42 | MethodMatch.invokeVirtual().name("printStackTrace").desc("()V"),
43 | OpcodeMatch.of(ATHROW).or(SequenceMatch.of(
44 | OpcodeMatch.of(CHECKCAST),
45 | OpcodeMatch.of(ATHROW)
46 | ))
47 | );
48 |
49 | @Override
50 | protected void transform() throws Exception {
51 | scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
52 | MethodContext methodContext = MethodContext.of(classWrapper, methodNode);
53 |
54 | // Remove infinite loop try catch blocks
55 | methodNode.tryCatchBlocks.removeIf(tryCatch -> {
56 | LabelNode handlerLabel = tryCatch.handler;
57 | AbstractInsnNode nextInsn = handlerLabel.getNext();
58 |
59 | // Check if handler is in infinite loop (goto itself)
60 | if (nextInsn != null && nextInsn.getOpcode() == GOTO && ((JumpInsnNode) nextInsn).label == handlerLabel) {
61 | methodNode.instructions.remove(nextInsn);
62 | markChange();
63 |
64 | return true;
65 | }
66 |
67 | return false;
68 | });
69 |
70 | // Remove self-throw try catch blocks
71 | methodNode.tryCatchBlocks.removeIf(tryCatch -> {
72 | LabelNode handlerLabel = tryCatch.handler;
73 | AbstractInsnNode nextInsn = handlerLabel.getNext();
74 |
75 | MatchContext matchContext = SELF_THROW_TRY_CATCH_MATCH.matchResult(methodContext.at(nextInsn));
76 | if (matchContext != null) {
77 | matchContext.removeAll();
78 | markChange();
79 |
80 | return true;
81 | }
82 |
83 | return false;
84 | });
85 | }));
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/AccessRepairTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
4 |
5 | public class AccessRepairTransformer extends Transformer {
6 |
7 | private final int[] CLASS = {
8 | ACC_STATIC,
9 | ACC_SYNCHRONIZED,
10 | ACC_OPEN,
11 | ACC_TRANSITIVE,
12 | ACC_VOLATILE,
13 | ACC_BRIDGE,
14 | ACC_STATIC_PHASE,
15 | ACC_VARARGS,
16 | ACC_TRANSIENT,
17 | ACC_NATIVE,
18 | ACC_STRICT,
19 | ACC_SYNTHETIC
20 | };
21 |
22 | private final int[] METHOD = {
23 | ACC_SUPER,
24 | ACC_OPEN,
25 | ACC_TRANSITIVE,
26 | ACC_VOLATILE,
27 | ACC_STATIC_PHASE,
28 | ACC_TRANSIENT,
29 | ACC_INTERFACE,
30 | ACC_ANNOTATION,
31 | ACC_ENUM,
32 | ACC_MODULE,
33 | ACC_RECORD,
34 | ACC_SYNTHETIC,
35 | ACC_BRIDGE
36 | };
37 |
38 | private final int[] FIELD = {
39 | ACC_SUPER,
40 | ACC_SYNCHRONIZED,
41 | ACC_OPEN,
42 | ACC_TRANSITIVE,
43 | ACC_BRIDGE,
44 | ACC_STATIC_PHASE,
45 | ACC_VARARGS,
46 | ACC_NATIVE,
47 | ACC_INTERFACE,
48 | ACC_ABSTRACT,
49 | ACC_STRICT,
50 | ACC_ANNOTATION,
51 | ACC_MODULE,
52 | ACC_RECORD,
53 | ACC_SYNTHETIC
54 | };
55 |
56 | private final int[] PARAMETER = {
57 | ACC_PUBLIC,
58 | ACC_PRIVATE,
59 | ACC_PROTECTED,
60 | ACC_STATIC,
61 | ACC_SUPER,
62 | ACC_SYNCHRONIZED,
63 | ACC_OPEN,
64 | ACC_TRANSITIVE,
65 | ACC_VOLATILE,
66 | ACC_BRIDGE,
67 | ACC_STATIC_PHASE,
68 | ACC_VARARGS,
69 | ACC_TRANSIENT,
70 | ACC_NATIVE,
71 | ACC_INTERFACE,
72 | ACC_ABSTRACT,
73 | ACC_STRICT,
74 | ACC_ANNOTATION,
75 | ACC_ENUM,
76 | ACC_MODULE,
77 | ACC_RECORD,
78 | ACC_DEPRECATED,
79 | ACC_SYNTHETIC
80 | };
81 |
82 | @Override
83 | protected void transform() throws Exception {
84 | scopedClasses().forEach(classWrapper -> {
85 | int classAccess = classWrapper.classNode().access;
86 | for (int access : CLASS) {
87 | if (isAccess(classAccess, access)) {
88 | classAccess &= ~access;
89 | this.markChange();
90 | }
91 | }
92 | classWrapper.classNode().access = classAccess;
93 |
94 | classWrapper.methods().forEach(methodNode -> {
95 | for (int access : METHOD) {
96 | if (isAccess(methodNode.access, access)) {
97 | methodNode.access &= ~access;
98 | this.markChange();
99 | }
100 | }
101 |
102 | if (methodNode.parameters != null)
103 | methodNode.parameters.forEach(parameterNode -> {
104 | for (int access : PARAMETER) {
105 | if (isAccess(parameterNode.access, access)) {
106 | parameterNode.access &= ~access;
107 | this.markChange();
108 | }
109 | }
110 | });
111 | });
112 |
113 | classWrapper.fields().forEach(fieldNode -> {
114 | // Remove ACC_ENUM from fields from classes that are not enums
115 | if (!isAccess(classWrapper.classNode().access, ACC_ENUM)) {
116 | fieldNode.access &= ~ACC_ENUM;
117 | }
118 |
119 | for (int access : FIELD) {
120 | if (isAccess(fieldNode.access, access)) {
121 | fieldNode.access &= ~access;
122 | this.markChange();
123 | }
124 | }
125 | });
126 |
127 | // TODO: Module maybe?
128 | });
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/AnnotationFilterTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import java.util.List;
4 | import java.util.function.Predicate;
5 |
6 | import org.objectweb.asm.tree.AnnotationNode;
7 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
8 |
9 | public class AnnotationFilterTransformer extends Transformer {
10 |
11 | private static final Predicate ANNOTATION_NODE_PREDICATE =
12 | annotationNode ->
13 | annotationNode.desc == null
14 | || annotationNode.desc.length() <= 3
15 | || !annotationNode.desc.startsWith("L")
16 | || !annotationNode.desc.endsWith(";")
17 | || annotationNode.desc.contains("\n")
18 | || annotationNode.desc.contains("\u0000")
19 | || annotationNode.desc.contains(" ");
20 |
21 | private boolean changed = false;
22 |
23 | @Override
24 | protected void transform() throws Exception {
25 | scopedClasses().forEach(classWrapper -> {
26 | if (classWrapper.classNode().invisibleAnnotations != null)
27 | changed |= classWrapper
28 | .classNode()
29 | .invisibleAnnotations
30 | .removeIf(ANNOTATION_NODE_PREDICATE);
31 |
32 | if (classWrapper.classNode().visibleAnnotations != null)
33 | changed |= classWrapper.classNode().visibleAnnotations.removeIf(ANNOTATION_NODE_PREDICATE);
34 |
35 | classWrapper.methods().forEach(methodNode -> {
36 | if (methodNode.invisibleAnnotations != null)
37 | changed |= methodNode.invisibleAnnotations.removeIf(ANNOTATION_NODE_PREDICATE);
38 |
39 | if (methodNode.visibleAnnotations != null)
40 | changed |= methodNode.visibleAnnotations.removeIf(ANNOTATION_NODE_PREDICATE);
41 |
42 | if (methodNode.invisibleParameterAnnotations != null)
43 | for (List invisibleParameterAnnotation : methodNode.invisibleParameterAnnotations) {
44 | if (invisibleParameterAnnotation == null) continue;
45 |
46 | changed |= invisibleParameterAnnotation.removeIf(ANNOTATION_NODE_PREDICATE);
47 | }
48 |
49 | if (methodNode.visibleParameterAnnotations != null)
50 | for (List visibleParameterAnnotation : methodNode.visibleParameterAnnotations) {
51 | if (visibleParameterAnnotation == null) continue;
52 |
53 | changed |= visibleParameterAnnotation.removeIf(ANNOTATION_NODE_PREDICATE);
54 | }
55 | });
56 |
57 | classWrapper.fields().forEach(fieldNode -> {
58 | if (fieldNode.invisibleAnnotations != null)
59 | changed |= fieldNode.invisibleAnnotations.removeIf(ANNOTATION_NODE_PREDICATE);
60 |
61 | if (fieldNode.visibleAnnotations != null)
62 | changed |= fieldNode.visibleAnnotations.removeIf(ANNOTATION_NODE_PREDICATE);
63 | });
64 | });
65 |
66 | if (changed) {
67 | markChange();
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/RecoverSyntheticsTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
4 |
5 | public class RecoverSyntheticsTransformer extends Transformer {
6 | @Override
7 | protected void transform() throws Exception {
8 | scopedClasses().forEach(classWrapper -> {
9 | classWrapper.methods().forEach(methodNode -> {
10 | // Recover by name
11 | if (methodNode.name.startsWith("lambda$")) {
12 | // Mark as synthetic
13 | methodNode.access |= ACC_SYNTHETIC;
14 | markChange();
15 | }
16 | });
17 | });
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/SourceFileNameRecoverTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import org.objectweb.asm.commons.ClassRemapper;
4 | import org.objectweb.asm.tree.ClassNode;
5 | import uwu.narumi.deobfuscator.api.asm.remapper.NamesRemapper;
6 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
7 |
8 | import java.util.ArrayList;
9 |
10 | /**
11 | * Recovers class name from source file name.
12 | */
13 | public class SourceFileNameRecoverTransformer extends Transformer {
14 | @Override
15 | protected void transform() throws Exception {
16 | NamesRemapper remapper = new NamesRemapper();
17 |
18 | scopedClasses().forEach(classWrapper -> {
19 | String sourceFileName = classWrapper.classNode().sourceFile;
20 | if (sourceFileName == null) return;
21 |
22 | // Replace the class name with the source file name without touching the package
23 | String newClassName = classWrapper.classNode().name.replaceAll("/[^/]+$", "/" + sourceFileName.replaceAll("\\.java$", ""));
24 |
25 | remapper.classMappings.put(classWrapper.name(), newClassName);
26 |
27 | markChange();
28 | });
29 |
30 | // Remap
31 | new ArrayList<>(context().classes()).forEach(classWrapper -> {
32 | ClassNode newNode = new ClassNode();
33 |
34 | // Remap
35 | ClassRemapper classRemapper = new ClassRemapper(newNode, remapper);
36 | classWrapper.classNode().accept(classRemapper);
37 |
38 | // Update class name
39 | context().getClassesMap().remove(classWrapper.name());
40 | context().getClassesMap().put(newNode.name, classWrapper);
41 |
42 | // Set new class node
43 | classWrapper.setClassNode(newNode);
44 | classWrapper.setPathInJar(newNode.name + ".class");
45 | });
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/TryCatchRepairTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import org.objectweb.asm.tree.LabelNode;
4 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
5 |
6 | public class TryCatchRepairTransformer extends Transformer {
7 |
8 | @Override
9 | protected void transform() throws Exception {
10 | scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
11 | methodNode.tryCatchBlocks.removeIf(tryCatchBlock -> {
12 | LabelNode start = tryCatchBlock.start;
13 | LabelNode handler = tryCatchBlock.handler;
14 | LabelNode end = tryCatchBlock.end;
15 |
16 | if (start.equals(end) || start.equals(handler) || end.equals(handler)) {
17 | // Try-catch has overlapping labels. Remove it.
18 | markChange();
19 | return true;
20 | }
21 |
22 | // Check if try-catch labels exist
23 | if (methodNode.instructions.indexOf(start) == -1 || methodNode.instructions.indexOf(handler) == -1 || methodNode.instructions.indexOf(end) == -1) {
24 | return true;
25 | }
26 |
27 | // Check if try-catch labels are in the correct order
28 | return methodNode.instructions.indexOf(start) >= methodNode.instructions.indexOf(handler)
29 | || methodNode.instructions.indexOf(start) >= methodNode.instructions.indexOf(end)
30 | || methodNode.instructions.indexOf(handler) <= methodNode.instructions.indexOf(end);
31 | });
32 |
33 | // Remove exceptions that are already caught by try-catch blocks
34 | methodNode.exceptions.removeIf(exception ->
35 | methodNode.tryCatchBlocks.stream().noneMatch(tryCatch -> tryCatch.type != null && tryCatch.type.equals(exception))
36 | );
37 | }));
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalFlowTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer;
4 | import uwu.narumi.deobfuscator.core.other.impl.clean.peephole.DeadCodeCleanTransformer;
5 | import uwu.narumi.deobfuscator.core.other.impl.universal.flow.CleanRedundantJumpsTransformer;
6 | import uwu.narumi.deobfuscator.core.other.impl.universal.flow.CleanRedundantSwitchesTransformer;
7 |
8 | public class UniversalFlowTransformer extends ComposedTransformer {
9 | public UniversalFlowTransformer() {
10 | super(
11 | // Clean up redundant ifs and switches
12 | CleanRedundantJumpsTransformer::new,
13 | CleanRedundantSwitchesTransformer::new,
14 |
15 | // Resolve all number operations
16 | UniversalNumberTransformer::new,
17 |
18 | // Last thing will be to clean up all dead code that is unreachable
19 | DeadCodeCleanTransformer::new
20 | );
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal;
2 |
3 | import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer;
4 | import uwu.narumi.deobfuscator.core.other.impl.clean.peephole.UselessPopCleanTransformer;
5 | import uwu.narumi.deobfuscator.core.other.impl.universal.number.InlineConstantValuesTransformer;
6 |
7 | /**
8 | * Simplifies number operations on constant values.
9 | */
10 | public class UniversalNumberTransformer extends ComposedTransformer {
11 | public UniversalNumberTransformer() {
12 | super(
13 | InlineConstantValuesTransformer::new,
14 |
15 | UselessPopCleanTransformer::new
16 | );
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/flow/CleanRedundantJumpsTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal.flow;
2 |
3 | import org.objectweb.asm.tree.JumpInsnNode;
4 | import org.objectweb.asm.tree.MethodNode;
5 | import uwu.narumi.deobfuscator.api.helper.AsmMathHelper;
6 | import uwu.narumi.deobfuscator.api.helper.FramedInstructionsStream;
7 | import uwu.narumi.deobfuscator.api.helper.MethodHelper;
8 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
9 |
10 | import java.util.Optional;
11 |
12 | public class CleanRedundantJumpsTransformer extends Transformer {
13 | @Override
14 | protected void transform() throws Exception {
15 | FramedInstructionsStream.of(this)
16 | .framesProvider(MethodHelper::analyzeSourcePredictJumps) // Predict jumps
17 | .forEach(insnContext -> {
18 | if (!(insnContext.insn() instanceof JumpInsnNode jumpInsn)) return;
19 |
20 | Optional optIfResult = AsmMathHelper.predictIf(jumpInsn, insnContext.frame());
21 |
22 | if (optIfResult.isEmpty()) return;
23 |
24 | boolean ifResult = optIfResult.get();
25 |
26 | if (AsmMathHelper.isOneValueCondition(jumpInsn.getOpcode()) || AsmMathHelper.isTwoValuesCondition(jumpInsn.getOpcode())) {
27 | insnContext.placePops();
28 | }
29 |
30 | // Replace if with corresponding GOTO or remove it
31 | processRedundantIfStatement(insnContext.methodNode(), jumpInsn, ifResult);
32 |
33 | markChange();
34 | });
35 | }
36 |
37 | private void processRedundantIfStatement(MethodNode methodNode, JumpInsnNode ifStatement, boolean ifResult) {
38 | if (!ifResult) {
39 | // Remove unreachable if statement
40 | methodNode.instructions.remove(ifStatement);
41 | } else {
42 | // Replace always reachable if statement with GOTO
43 | ifStatement.setOpcode(GOTO);
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/flow/CleanRedundantSwitchesTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal.flow;
2 |
3 | import org.objectweb.asm.tree.JumpInsnNode;
4 | import org.objectweb.asm.tree.LabelNode;
5 | import org.objectweb.asm.tree.LookupSwitchInsnNode;
6 | import org.objectweb.asm.tree.TableSwitchInsnNode;
7 | import uwu.narumi.deobfuscator.api.helper.AsmMathHelper;
8 | import uwu.narumi.deobfuscator.api.helper.FramedInstructionsStream;
9 | import uwu.narumi.deobfuscator.api.helper.MethodHelper;
10 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
11 |
12 | import java.util.Optional;
13 |
14 | /**
15 | * Clean redundant LOOKUPSWITCH and TABLESWITCH instructions
16 | */
17 | public class CleanRedundantSwitchesTransformer extends Transformer {
18 |
19 | @Override
20 | protected void transform() throws Exception {
21 | FramedInstructionsStream.of(this)
22 | .framesProvider(MethodHelper::analyzeSourcePredictJumps) // Predict jumps
23 | .forEach(insnContext -> {
24 | if (insnContext.insn().getOpcode() == LOOKUPSWITCH) {
25 | LookupSwitchInsnNode lookupSwitchInsn = (LookupSwitchInsnNode) insnContext.insn();
26 |
27 | Optional optPredictedJump = AsmMathHelper.predictLookupSwitch(lookupSwitchInsn, insnContext.frame());
28 | if (optPredictedJump.isEmpty()) return;
29 |
30 | LabelNode predictedJump = optPredictedJump.get();
31 | // Remove value from stack
32 | insnContext.placePops();
33 | // Replace lookup switch with predicted jump
34 | insnContext.methodNode().instructions.set(lookupSwitchInsn, new JumpInsnNode(GOTO, predictedJump));
35 |
36 | markChange();
37 | } else if (insnContext.insn().getOpcode() == TABLESWITCH) {
38 | TableSwitchInsnNode tableSwitchInsn = (TableSwitchInsnNode) insnContext.insn();
39 |
40 | Optional optPredictedJump = AsmMathHelper.predictTableSwitch(tableSwitchInsn, insnContext.frame());
41 | if (optPredictedJump.isEmpty()) return;
42 |
43 | LabelNode predictedJump = optPredictedJump.get();
44 | // Remove value from stack
45 | insnContext.placePops();
46 | // Replace lookup switch with predicted jump
47 | insnContext.methodNode().instructions.set(tableSwitchInsn, new JumpInsnNode(GOTO, predictedJump));
48 |
49 | markChange();
50 | }
51 | });
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/number/InlineConstantValuesTransformer.java:
--------------------------------------------------------------------------------
1 | package uwu.narumi.deobfuscator.core.other.impl.universal.number;
2 |
3 | import org.objectweb.asm.tree.AbstractInsnNode;
4 | import org.objectweb.asm.tree.analysis.OriginalSourceValue;
5 | import uwu.narumi.deobfuscator.api.asm.InsnContext;
6 | import uwu.narumi.deobfuscator.api.asm.MethodContext;
7 | import uwu.narumi.deobfuscator.api.helper.AsmHelper;
8 | import uwu.narumi.deobfuscator.api.transformer.Transformer;
9 |
10 | import java.util.HashSet;
11 | import java.util.Set;
12 |
13 | /**
14 | * Inline constant values into instructions.
15 | */
16 | public class InlineConstantValuesTransformer extends Transformer {
17 | @Override
18 | protected void transform() throws Exception {
19 | scopedClasses().parallelStream().forEach(classWrapper -> classWrapper.methods().parallelStream().forEach(methodNode -> {
20 | MethodContext methodContext = MethodContext.of(classWrapper, methodNode);
21 |
22 | Set poppedInsns = new HashSet<>();
23 | for (AbstractInsnNode insn : methodNode.instructions.toArray()) {
24 | InsnContext insnContext = methodContext.at(insn);
25 | if (insnContext.frame() == null) continue;
26 |
27 | // Iterate over stack values
28 | for (int i = 0; i < insnContext.frame().getStackSize(); i++) {
29 | // Using "originalSource" ensures that we don't replace DUPs or var loads
30 | OriginalSourceValue sourceValue = insnContext.frame().getStack(insnContext.frame().getStackSize() - (i + 1)).originalSource;
31 |
32 | // Check if the source value is constant
33 | if (sourceValue.getConstantValue() != null) {
34 | // Replace constant value with instruction
35 | AbstractInsnNode toReplace = sourceValue.getProducer();
36 |
37 | // Constants are already constants. Skip them
38 | if (toReplace.isConstant()) continue;
39 |
40 | if (poppedInsns.contains(toReplace)) {
41 | // Already popped
42 | continue;
43 | }
44 |
45 | // Place pops before replacing
46 | insnContext.methodContext().at(toReplace).placePops();
47 |
48 | // Replace instruction with constant value
49 | AbstractInsnNode newInsn = AsmHelper.toConstantInsn(sourceValue.getConstantValue().value());
50 | insnContext.methodNode().instructions.set(toReplace, newInsn);
51 | poppedInsns.add(toReplace);
52 |
53 | markChange();
54 | }
55 | }
56 | }
57 | }));
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | uwu.narumi
8 | Diobfuscator
9 | pom
10 | 2.0-SNAPSHOT
11 |
12 |
13 |
14 | testData/src/java
15 |
16 | deobfuscator-api
17 | deobfuscator-impl
18 | deobfuscator-transformers
19 | reverse-engineering
20 |
21 |
22 |
23 | UTF-8
24 |
25 | 17
26 | 17
27 |
28 |
29 |
30 |
31 | org.jetbrains
32 | annotations
33 | 24.1.0
34 |
35 |
36 |
37 |
38 |
39 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/reverse-engineering/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | uwu.narumi
8 | Diobfuscator
9 | 2.0-SNAPSHOT
10 |
11 |
12 | reverse-engineering
13 |
14 |
15 | 17
16 | 17
17 | UTF-8
18 |
19 |
20 |
--------------------------------------------------------------------------------
/reverse-engineering/src/main/java/qprotect/InvokeDynamicSample.java:
--------------------------------------------------------------------------------
1 | package qprotect;
2 |
3 | import java.lang.invoke.ConstantCallSite;
4 | import java.lang.invoke.MethodHandle;
5 | import java.lang.invoke.MethodHandles;
6 | import java.lang.invoke.MethodType;
7 | import java.util.Arrays;
8 |
9 | public class InvokeDynamicSample {
10 | public static void main(String[] args) {
11 | invokeBootstrapMethod("SlAyclR2ZWV6bXBLem8waA==", "<\u001e&W\t\u001f=\\t\u00077D\u0011=0\u000f\n\u0003^\u001e\u00064O\\'\u0005.\u0017W?3\u0003l 2]+4\u000b\u0005\t\u0001q>\r\btQ\u001a\u0000u*\u0002]dE><~\u001f4l\u0011-T[O\u0013\n.OZ}\u00062\u0016\rB\u0002S($3D!7,*\f\nM\u0005\u00005TR=X\u0012\u0018RZ%V1bb\u000e");
12 | }
13 |
14 | public static Object invokeBootstrapMethod(Object xorKeyObj, Object encryptedDataObj) {
15 | // Extract encrypted data and XOR key
16 | String encryptedData = (String)encryptedDataObj;
17 | char[] xorKey = ((String)xorKeyObj).toCharArray();
18 |
19 | // Decrypt the data using XOR cipher
20 | char[] decryptedChars = new char[encryptedData.length()];
21 | char[] encryptedChars = encryptedData.toCharArray();
22 | for (int i = 0; i < encryptedData.length(); i++) {
23 | decryptedChars[i] = (char)(encryptedChars[i] ^ xorKey[i % xorKey.length]);
24 | }
25 |
26 | // Convert decrypted data to string and split parts
27 | byte[] decryptedBytes = new String(decryptedChars).getBytes();
28 | String decryptedString = new String(decryptedBytes);
29 | String[] parts = decryptedString.split("4Sa16wdk"); // Dynamic
30 |
31 | System.out.println(Arrays.toString(parts));
32 |
33 | // Extract method information from parts
34 | String ownerClass = parts[0]; // Class containing the method
35 | String methodName = parts[1]; // Name of the method
36 | String methodDesc = parts[2]; // Method descriptor
37 | String specialClass = parts[3]; // Special class for super calls
38 | int methodType = Integer.parseInt(parts[4]); // Type of method call
39 |
40 | System.out.println("Owner class: " + ownerClass);
41 | System.out.println("Method name: " + methodName);
42 | System.out.println("Method desc: " + methodDesc);
43 | System.out.println("Special class: " + specialClass);
44 | System.out.println("Method type: " + methodType);
45 |
46 | return null;
47 |
48 | /*MethodHandle handle;
49 | try {
50 | // Load required classes
51 | Class> ownerClassType = Class.forName(ownerClass);
52 | Class> specialClassType = Class.forName(specialClass);
53 | ClassLoader loader = InvokeDynamicSample.class.getClassLoader();
54 | MethodType type = MethodType.fromMethodDescriptorString(methodDesc, loader);
55 |
56 | // Create appropriate method handle based on call type
57 | switch (methodType) {
58 | case 548: // Static method call // Dynamic
59 | handle = ((MethodHandles.Lookup)lookupObj).findStatic(ownerClassType, methodName, type);
60 | break;
61 | case 10116: // Virtual method call // Dynamic
62 | handle = ((MethodHandles.Lookup)lookupObj).findVirtual(ownerClassType, methodName, type);
63 | break;
64 | case 25620: // Special method call (super) // Dynamic
65 | handle = ((MethodHandles.Lookup)lookupObj).findSpecial(ownerClassType, methodName, type, specialClassType);
66 | break;
67 | default:
68 | throw new BootstrapMethodError();
69 | }
70 |
71 | // Adapt the method handle to the target type
72 | handle = handle.asType((MethodType)targetMethodTypeObj);
73 | } catch (Exception e) {
74 | e.printStackTrace();
75 | throw new BootstrapMethodError();
76 | }
77 |
78 | return new ConstantCallSite(handle);*/
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/reverse-engineering/src/main/java/qprotect/StringEncryption.java:
--------------------------------------------------------------------------------
1 | package qprotect;
2 |
3 | public class StringEncryption {
4 | public static void main(String[] args) {
5 | System.out.println(decryptString(
6 | "퇧\uea6e롩톮\uea71롽퇳\uea60", "\u001an��4�", "w\u000bᅭフAワy\u0005ルネWヨ5\u001f゙ル_ミ5*ヨミpワw\u000fレリ", 2037571890, -791401, 253081604, 1890996
7 | ));
8 | }
9 |
10 | /**
11 | * Decrypts an encrypted string using multiple XOR operations and stack trace validation
12 | *
13 | * @param encryptedText The main encrypted text to decrypt
14 | * @param xorKey The key used for initial XOR operation
15 | * @param encryptedData Secondary encrypted data
16 | * @param salt1 First salt value for XOR
17 | * @param salt2 Second salt value for XOR
18 | * @param salt3 Third salt value for XOR
19 | * @param salt4 Fourth salt value for XOR
20 | * @return Decrypted string
21 | */
22 | public static String decryptString(String encryptedText, String xorKey, String encryptedData,
23 | int salt1, int salt2, int salt3, int salt4) {
24 | // First decryption phase - XOR with key
25 | char[] encryptedChars = encryptedData.toCharArray();
26 | char[] decryptedChars = new char[encryptedChars.length];
27 | char[] keyChars = xorKey.toCharArray();
28 | //StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
29 |
30 | // Perform initial XOR decryption
31 | for (int i = 0; i < encryptedChars.length; i++) {
32 | decryptedChars[i] = (char)(encryptedChars[i] ^ keyChars[i % keyChars.length]);
33 | }
34 |
35 | // Calculate hash values for verification
36 | String decryptedString = new String(decryptedChars);
37 | int stringHash = decryptedString.hashCode();
38 | int xorValue = salt2 - salt4 - salt1;
39 |
40 | // Stack trace validation (anti-tampering)
41 | //stackTrace[2].getClassName().hashCode();
42 | //stackTrace[2].getMethodName().hashCode();
43 |
44 | // Second decryption phase - Triple XOR pattern
45 | char[] finalEncrypted = encryptedText.toCharArray();
46 | char[] finalDecrypted = new char[finalEncrypted.length];
47 |
48 | for (int i = 0; i < finalDecrypted.length; i++) {
49 | switch (i % 3) {
50 | case 0:
51 | finalDecrypted[i] = (char)(xorValue ^ stringHash ^ finalEncrypted[i]);
52 | break;
53 | case 1:
54 | finalDecrypted[i] = (char)(salt4 ^ xorValue ^ finalEncrypted[i]);
55 | break;
56 | case 2:
57 | finalDecrypted[i] = (char)(salt3 ^ finalEncrypted[i]);
58 | }
59 | }
60 |
61 | return new String(finalDecrypted);
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/reverse-engineering/src/main/java/zelix/longdecrypter/ILongDecrypter.java:
--------------------------------------------------------------------------------
1 | package zelix.longdecrypter;
2 |
3 | public interface ILongDecrypter {
4 | void setChild(ILongDecrypter parent);
5 |
6 | int[] getEncryptionInts();
7 |
8 | long decrypt(long decryptKey);
9 |
10 | void setKey(long key);
11 |
12 | boolean lessThanOrEqual(ILongDecrypter other);
13 | }
14 |
--------------------------------------------------------------------------------
/reverse-engineering/src/main/java/zelix/longdecrypter/Main.java:
--------------------------------------------------------------------------------
1 | package zelix.longdecrypter;
2 |
3 | import java.lang.invoke.MethodHandles;
4 |
5 | public class Main {
6 | // Usage
7 |
8 | public static void main(String[] args) {
9 | // decrypterA must be decrypted first for decrypterB to be decrypted correctly. So there is specific decryption order:
10 | // decrypterA -> decrypterB
11 | ILongDecrypter decrypterA = SimpleLongDecrypter.buildNumberDecryptor(273921918217628048L, -8431841081763909460L, MethodHandles.lookup().lookupClass());
12 | System.out.println(decrypterA);
13 | long a = decrypterA.decrypt(36730249601911L);
14 | System.out.println(a);
15 |
16 | ILongDecrypter decrypterB = SimpleLongDecrypter.buildNumberDecryptor(-5385547845782035026L, 2563870759759473543L, MethodHandles.lookup().lookupClass());
17 | System.out.println(decrypterB);
18 | long b = decrypterB.decrypt(130571778689313L);
19 | System.out.println(b);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/JSR.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/JSR.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/KotlinSample.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/KotlinSample.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/KotlinSample2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/KotlinSample2.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/KotlinSample3.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/KotlinSample3.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/Pop2Sample.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/Pop2Sample.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/hp888/IIIlIIIlllIIIlllIIlIllIIlIIIIIllIlIIlIlIllIIIlIIII.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/hp888/IIIlIIIlllIIIlllIIlIllIIlIIIIIllIlIIlIlIllIIIlIIII.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPicker$1.mc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPicker$1.mc
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPicker.mc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPicker.mc
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPickerMode.mc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/hp888/com/bric/colorpicker/ColorPickerMode.mc
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/hp888/pack/MyFunction2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/hp888/pack/MyFunction2.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample1/JSONStringer.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample1/JSONStringer.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample1/JSONTokener.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample1/JSONTokener.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample1/JSONWriter.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample1/JSONWriter.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample1/ParserConfiguration.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample1/ParserConfiguration.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample1/XML.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample1/XML.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample2/ChatUtil.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample2/ChatUtil.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/qprotect/sample3/fastcode/IlllIIlIIlllIIIl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/qprotect/sample3/fastcode/IlllIIlIIlllIIIl.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/sb27/sample1/ConfigComplete.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/sb27/sample1/ConfigComplete.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/unknown/obf1/SomeClass1.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/unknown/obf1/SomeClass1.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/unknown/obf1/SomeClass2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/unknown/obf1/SomeClass2.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/EnhancedStringEncManyStrings.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/EnhancedStringEncManyStrings.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/EnhancedStringEncSomeStrings.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/EnhancedStringEncSomeStrings.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/PacketEvents.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/PacketEvents.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_7.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_7.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_8.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_8.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_a.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_a.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_m.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_m.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_x.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample1/me/frep/vulcan/spigot/Vulcan_x.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a4.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a4.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a_.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/a_.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/b.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/b.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/ba.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/ba.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/bc.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/bc.class
--------------------------------------------------------------------------------
/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/c.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-classes/zkm/sample2/a/a/a/a/c.class
--------------------------------------------------------------------------------
/testData/compiled/custom-jars/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-jars/.gitkeep
--------------------------------------------------------------------------------
/testData/compiled/custom-jars/SnakeGame-obf-zkm.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-jars/SnakeGame-obf-zkm.jar
--------------------------------------------------------------------------------
/testData/compiled/custom-jars/grunt-obf.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-jars/grunt-obf.jar
--------------------------------------------------------------------------------
/testData/compiled/custom-jars/qprotect-obf.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narumii/Deobfuscator/1fa52fb8cf0e71261c4e1138ddfc11d00efd0b29/testData/compiled/custom-jars/qprotect-obf.jar
--------------------------------------------------------------------------------
/testData/results/custom-classes/JSR.dec:
--------------------------------------------------------------------------------
1 | import java.io.PrintStream;
2 |
3 | public class TestJSR {
4 | public static void main(String[] var0) {
5 | test(System.out);
6 | }
7 |
8 | public static void test(PrintStream var0) {
9 | var0.println("In");
10 | Object var1 = null;
11 | var0.println("Out");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/Pop2Sample.dec:
--------------------------------------------------------------------------------
1 | package com.arlania;
2 |
3 | import com.arlania.r.H;
4 | import com.arlania.r.W;
5 | import javax.swing.ImageIcon;
6 | import javax.swing.JColorChooser;
7 | import javax.swing.JOptionPane;
8 | import javax.swing.JPanel;
9 | import javax.swing.colorchooser.AbstractColorChooserPanel;
10 |
11 | class Ld implements Runnable {
12 | @Override
13 | public void run() {
14 | AbstractColorChooserPanel[] var5;
15 | JColorChooser var7;
16 | int var4 = (var5 = (var7 = new JColorChooser()).getChooserPanels()).length;
17 |
18 | int var3;
19 | for (int var10000 = var3 = 0; var10000 < var4; var10000 = ++var3) {
20 | String var2;
21 | AbstractColorChooserPanel var6;
22 | switch ((var2 = (var6 = var5[var3]).getDisplayName()).hashCode()) {
23 | case -249666038:
24 | while (false) {
25 | }
26 |
27 | if (!var2.equals(H.ALLATORIxDEMO("\u0013\u001a!\u0019#\u0005%\u001e"))) {
28 | continue;
29 | }
30 | break;
31 | case 71851:
32 | if (!var2.equals(W.ALLATORIxDEMO("\"\u0011<"))) {
33 | continue;
34 | }
35 | break;
36 | case 81069:
37 | if (!var2.equals(H.ALLATORIxDEMO("?\u0007/"))) {
38 | continue;
39 | }
40 | break;
41 | case 2072828:
42 | if (!var2.equals(W.ALLATORIxDEMO("\u0001'\u001b!"))) {
43 | continue;
44 | }
45 | break;
46 | default:
47 | continue;
48 | }
49 |
50 | var7.removeChooserPanel(var6);
51 | }
52 |
53 | var7.setColor(com.arlania.H.Wa[a.ALLATORIxDEMO].KC);
54 | var7.setPreviewPanel(new JPanel());
55 | var7.getSelectionModel().addChangeListener(new BA(a, var7, a.E, a.ALLATORIxDEMO));
56 | Client.ALLATORIxDEMO(var7);
57 | JOptionPane.showMessageDialog(null, var7, a.M, -1, new ImageIcon());
58 | }
59 |
60 | Ld(Client var1, int var2, String var3, int var4) {
61 | a.j = var1;
62 | a.ALLATORIxDEMO = var2;
63 | a.M = var3;
64 | a.E = var4;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/hp888/com/bric/colorpicker/ColorPicker$1.dec:
--------------------------------------------------------------------------------
1 | package com.bric.colorpicker;
2 |
3 | // $VF: synthetic class
4 | public class ColorPicker$1 {
5 | static {
6 | try {
7 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.HUE.ordinal()] = 1;
8 | } catch (NoSuchFieldError var6) {
9 | }
10 |
11 | try {
12 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.SATURATION.ordinal()] = 2;
13 | } catch (NoSuchFieldError var5) {
14 | }
15 |
16 | try {
17 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.BRIGHTNESS.ordinal()] = 3;
18 | } catch (NoSuchFieldError var4) {
19 | }
20 |
21 | try {
22 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.RED.ordinal()] = 4;
23 | } catch (NoSuchFieldError var3) {
24 | }
25 |
26 | try {
27 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.GREEN.ordinal()] = 5;
28 | } catch (NoSuchFieldError var2) {
29 | }
30 |
31 | try {
32 | $SwitchMap$com$bric$colorpicker$ColorPickerMode[ColorPickerMode.BLUE.ordinal()] = 6;
33 | } catch (NoSuchFieldError var1) {
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/hp888/com/bric/colorpicker/ColorPickerMode.dec:
--------------------------------------------------------------------------------
1 | package com.bric.colorpicker;
2 |
3 | public enum ColorPickerMode {
4 | HUE(360),
5 | BRIGHTNESS(100),
6 | SATURATION(100),
7 | RED(255),
8 | GREEN(255),
9 | BLUE(255),
10 | ALPHA(255);
11 |
12 | private int max;
13 |
14 | private ColorPickerMode(int var3) {
15 | this.max = var3;
16 | }
17 |
18 | public int getMax() {
19 | return this.max;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/qprotect/sample1/JSONStringer.dec:
--------------------------------------------------------------------------------
1 | package org.json;
2 |
3 | import java.io.StringWriter;
4 |
5 | public class JSONStringer extends org.json.JSONWriter {
6 | public static final int IIlIIlIIIlIIIl;
7 | public static final boolean IIlIIIIIIIllll = false;
8 |
9 | public JSONStringer() {
10 | super(new StringWriter());
11 | org.json.ParserConfiguration.IIlIIIIlIIII();
12 | }
13 |
14 | @Override
15 | public String toString() {
16 | return this.mode == 'd' ? this.writer.toString() : null;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/sb27/sample1/ConfigComplete.dec:
--------------------------------------------------------------------------------
1 | import java.util.ArrayList;
2 | import java.util.List;
3 | import org.bukkit.command.Command;
4 | import org.bukkit.command.CommandSender;
5 | import org.bukkit.command.TabCompleter;
6 | import org.bukkit.util.StringUtil;
7 |
8 | public class ConfigComplete implements TabCompleter {
9 | public List onTabComplete(CommandSender var1, Command var2, String var3, String[] var4) {
10 | ArrayList var5 = new ArrayList();
11 | ArrayList var6 = new ArrayList();
12 | if (var4.length == 1) {
13 | var6.add("doBedExplode");
14 | var6.add("doBrutesSpawn");
15 | var6.add("oldPiglinDrop");
16 | var6.add("compassOnRespawn");
17 | StringUtil.copyPartialMatches(var4[0], var6, var5);
18 | }
19 |
20 | return var5;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/unknown/obf1/SomeClass1.dec:
--------------------------------------------------------------------------------
1 | import org.bukkit.Bukkit;
2 | import org.bukkit.event.Listener;
3 |
4 | public class SomeClass1 implements Listener {
5 | public static int lIIIIlllIlIIllIIIlllllIlllIIllIllIIlIIllIIIllIIlIllllIIIIllIIlIIIIlIllIIlllIllIllllIIIlllIllIllIlllIlllllIIlIIIlllllIIIlIlIllllIllllIllllIIlIIllIlIIllIIllIIlIllIIllllIlllIIIIlIIllIIIIIIIIllllIlIllllIl(
6 | int var0
7 | ) {
8 | Bukkit.getServer();
9 | Bukkit.getServer();
10 | Bukkit.getServer();
11 | Bukkit.getServer();
12 | Bukkit.getServer();
13 | Bukkit.getServer();
14 | Bukkit.getServer();
15 | return 0;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/unknown/obf1/SomeClass2.dec:
--------------------------------------------------------------------------------
1 | import org.bukkit.ChatColor;
2 | import org.bukkit.Material;
3 | import org.bukkit.enchantments.Enchantment;
4 | import org.bukkit.entity.Player;
5 | import org.bukkit.event.EventHandler;
6 | import org.bukkit.event.Listener;
7 | import org.bukkit.event.player.PlayerRespawnEvent;
8 | import org.bukkit.inventory.ItemFlag;
9 | import org.bukkit.inventory.ItemStack;
10 | import org.bukkit.inventory.meta.ItemMeta;
11 |
12 | public class SomeClass2 implements Listener {
13 | @EventHandler
14 | public void onPlayerRespawn(PlayerRespawnEvent var1) {
15 | Player var2 = var1.getPlayer();
16 | if (lIIlIIIllIIlIlllIIIIllllIIllllIlIlIIlIlllIIlIlIllIlIIIIlIllllIIIIIlllllIIllIIIllIIlllIIlllllIlIIIIIIlIIIIIllIIlllIlllIllIlIlllllIlIlllIIIlIllIIIlIlllIIIIIlllIIIIllIlllIlIlIllllIlIIIIllllIlIlIIlIIlIllI.IllIllIlIllIIIIlllIllIlIlIllIIllIlllllllllIlIIIIIIlllllllIIlIllllIIIlIllIllIlIIIIlllIlllIIlllIIIIIIIIIlIlllIlllIIlIllIllIIlIIllIIlllIIIlllIllIllIIllIlIllllllIIllllIllIIIlllIllllIIlllIIIlIlIIlllIIIIlIl
17 | .getConfig()
18 | .getBoolean("compassOnRespawn")
19 | && !var2.getInventory().contains(Material.COMPASS)) {
20 | ItemStack var3 = new ItemStack(Material.COMPASS, 1);
21 | var3.addUnsafeEnchantment(Enchantment.VANISHING_CURSE, 1);
22 | ItemMeta var4 = var3.getItemMeta();
23 | var4.setDisplayName(ChatColor.RED + "[" + ChatColor.AQUA + "" + ChatColor.BOLD + "Compass Tracker" + ChatColor.RESET + "" + ChatColor.RED + "]");
24 | var4.addItemFlags(new ItemFlag[]{ItemFlag.HIDE_ENCHANTS});
25 | var3.setItemMeta(var4);
26 | var2.getInventory().addItem(new ItemStack[]{var3});
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil.dec:
--------------------------------------------------------------------------------
1 | package io.github.repooper.packetevents.utils.netty.bytebuf;
2 |
3 | public interface ByteBufUtil {
4 | Object Vulcan_y();
5 |
6 | Object Vulcan_u(byte[] var1);
7 |
8 | void Vulcan_G(Object var1);
9 |
10 | void Vulcan_u(Object var1);
11 |
12 | byte[] Vulcan_S(Object var1, long var2);
13 |
14 | void Vulcan_S(Object var1, byte[] var2, long var3);
15 | }
16 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_7.dec:
--------------------------------------------------------------------------------
1 | package io.github.repooper.packetevents.utils.netty.bytebuf;
2 |
3 | import io.netty.buffer.Unpooled;
4 | import me.frep.vulcan.spigot.check.AbstractCheck;
5 | import net.minecraft.util.io.netty.buffer.ByteBuf;
6 | import net.minecraft.util.io.netty.util.internal.EmptyArrays;
7 |
8 | public final class ByteBufUtil_7 implements ByteBufUtil {
9 | @Override
10 | public Object Vulcan_y() {
11 | return Unpooled.buffer();
12 | }
13 |
14 | @Override
15 | public Object Vulcan_u(byte[] var1) {
16 | return Unpooled.wrappedBuffer(var1);
17 | }
18 |
19 | @Override
20 | public void Vulcan_G(Object var1) {
21 | ((ByteBuf)var1).retain();
22 | }
23 |
24 | @Override
25 | public void Vulcan_u(Object var1) {
26 | ((ByteBuf)var1).release();
27 | }
28 |
29 | @Override
30 | public byte[] Vulcan_S(Object var1, long var2) {
31 | String[] var10000 = ByteBufUtil_8.Vulcan_O();
32 | ByteBuf var6 = (ByteBuf)var1;
33 | String[] var5 = var10000;
34 | int var8 = var6.refCnt();
35 | String[] var10001 = var5;
36 | if (var2 > 0L) {
37 | if (var5 != null) {
38 | if (var8 < 1) {
39 | return EmptyArrays.EMPTY_BYTES;
40 | }
41 |
42 | var8 = var6.hasArray();
43 | }
44 |
45 | var10001 = var5;
46 | }
47 |
48 | if (var10001 != null) {
49 | if (var8 != 0) {
50 | byte[] var7 = var6.array();
51 | if (var5 != null) {
52 | return var7;
53 | }
54 |
55 | AbstractCheck.Vulcan_t(!AbstractCheck.Vulcan_a());
56 | }
57 |
58 | var8 = var6.readableBytes();
59 | }
60 |
61 | byte[] var9 = new byte[var8];
62 | var6.getBytes(var6.readerIndex(), var9);
63 | return var9;
64 | }
65 |
66 | @Override
67 | public void Vulcan_S(Object var1, byte[] var2, long var3) {
68 | String[] var10000 = ByteBufUtil_8.Vulcan_O();
69 | ByteBuf var7 = (ByteBuf)var1;
70 | String[] var6 = var10000;
71 | int var9 = var7.refCnt();
72 | if (var6 != null) {
73 | if (var9 < 1) {
74 | return;
75 | }
76 |
77 | var9 = var2.length;
78 | }
79 |
80 | int var8 = var9;
81 | if (var3 >= 0L && var6 != null) {
82 | if (var7.capacity() < var8) {
83 | var7.capacity(var8);
84 | }
85 |
86 | var7.setBytes(0, var2);
87 | }
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/zkm/sample1/io/github/repooper/packetevents/utils/netty/bytebuf/ByteBufUtil_8.dec:
--------------------------------------------------------------------------------
1 | package io.github.repooper.packetevents.utils.netty.bytebuf;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import io.netty.buffer.Unpooled;
5 | import io.netty.util.internal.EmptyArrays;
6 | import me.frep.vulcan.spigot.check.AbstractCheck;
7 |
8 | public final class ByteBufUtil_8 implements ByteBufUtil {
9 | private static String[] Vulcan_n;
10 |
11 | @Override
12 | public Object Vulcan_y() {
13 | return Unpooled.buffer();
14 | }
15 |
16 | @Override
17 | public Object Vulcan_u(byte[] var1) {
18 | return Unpooled.wrappedBuffer(var1);
19 | }
20 |
21 | @Override
22 | public void Vulcan_G(Object var1) {
23 | ((ByteBuf)var1).retain();
24 | }
25 |
26 | @Override
27 | public void Vulcan_u(Object var1) {
28 | ((ByteBuf)var1).release();
29 | }
30 |
31 | @Override
32 | public byte[] Vulcan_S(Object var1, long var2) {
33 | String[] var10000 = Vulcan_O();
34 | ByteBuf var6 = (ByteBuf)var1;
35 | String[] var5 = var10000;
36 | int var8 = var6.refCnt();
37 | String[] var10001 = var5;
38 | if (var2 > 0L) {
39 | if (var5 != null) {
40 | if (var8 < 1) {
41 | return EmptyArrays.EMPTY_BYTES;
42 | }
43 |
44 | var8 = var6.hasArray();
45 | }
46 |
47 | var10001 = var5;
48 | }
49 |
50 | byte[] var7;
51 | label39: {
52 | if (var10001 != null) {
53 | if (var8 != 0) {
54 | var7 = var6.array();
55 | if (var2 < 0L || var5 != null) {
56 | break label39;
57 | }
58 | }
59 |
60 | var8 = var6.readableBytes();
61 | }
62 |
63 | var7 = new byte[var8];
64 | var6.getBytes(var6.readerIndex(), var7);
65 | }
66 |
67 | byte var9 = AbstractCheck.Vulcan_l();
68 | if (var2 >= 0L) {
69 | if (var9 == 0) {
70 | return var7;
71 | }
72 |
73 | var9 = 1;
74 | }
75 |
76 | Vulcan_L(new String[var9]);
77 | return var7;
78 | }
79 |
80 | @Override
81 | public void Vulcan_S(Object var1, byte[] var2, long var3) {
82 | String[] var10000 = Vulcan_O();
83 | ByteBuf var7 = (ByteBuf)var1;
84 | String[] var6 = var10000;
85 | int var9 = var7.refCnt();
86 | if (var6 != null) {
87 | if (var9 < 1) {
88 | return;
89 | }
90 |
91 | var9 = var2.length;
92 | }
93 |
94 | int var8 = var9;
95 | if (var3 > 0L && var6 != null) {
96 | if (var7.capacity() < var8) {
97 | var7.capacity(var8);
98 | }
99 |
100 | var7.setBytes(0, var2);
101 | }
102 | }
103 |
104 | public static void Vulcan_L(String[] var0) {
105 | Vulcan_n = var0;
106 | }
107 |
108 | public static String[] Vulcan_O() {
109 | return Vulcan_n;
110 | }
111 |
112 | static {
113 | if (Vulcan_O() == null) {
114 | Vulcan_L(new String[5]);
115 | }
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/zkm/sample2/a/a/a/a/ba.dec:
--------------------------------------------------------------------------------
1 | package a.a.a.a;
2 |
3 | import java.util.Comparator;
4 |
5 | public class ba extends a_ {
6 | private static final long serialVersionUID = 1L;
7 |
8 | public ba(long var1, Number var3, Number var4, Comparator var5) {
9 | var1 = 87486991067610L ^ var1;
10 | int var6 = (int)((var1 ^ 101419208877758L) >>> 32);
11 | long var7 = (var1 ^ 101419208877758L) << 32 >>> 32;
12 | super(var3, var4, var6, var7, var5);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/testData/results/custom-classes/zkm/sample2/a/a/a/a/bc.dec:
--------------------------------------------------------------------------------
1 | package a.a.a.a;
2 |
3 | public final class bc extends ba {
4 | private static final long serialVersionUID = 1L;
5 |
6 | public static bc a(int var0, long var1, int var3) {
7 | var1 = 90497055901648L ^ var1;
8 | long var5 = var1 ^ 32932499080870L;
9 | return b(new Object[]{var0, var5, var3});
10 | }
11 |
12 | public static bc b(Integer var0, long var1, Integer var3) {
13 | var1 = 90497055901648L ^ var1;
14 | int var5 = (int)((var1 ^ 61248110729654L) >>> 56);
15 | long var6 = (var1 ^ 61248110729654L) << 8 >>> 8;
16 | return new bc((byte)var5, var0, var3, var6);
17 | }
18 |
19 | private bc(byte var1, Integer var2, Integer var3, long var4) {
20 | long var6 = ((long)var1 << 56 | var4 << 8 >>> 8) ^ 90497055901648L;
21 | long var8 = var6 ^ 83241345321299L;
22 | super(var8, var2, var3, null);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/SnakeGame-obf-zkm/a.dec:
--------------------------------------------------------------------------------
1 | import java.awt.event.KeyAdapter;
2 | import java.awt.event.KeyEvent;
3 |
4 | public class a extends KeyAdapter {
5 | @Override
6 | public void keyPressed(KeyEvent var1) {
7 | boolean var4;
8 | label60: {
9 | label61: {
10 | label62: {
11 | var4 = d.h;
12 | int var10000 = var1.getKeyCode();
13 | if (!var4) {
14 | switch (var10000) {
15 | case 37:
16 | break label61;
17 | case 38:
18 | break label62;
19 | case 39:
20 | var10000 = d.e;
21 | break;
22 | case 40:
23 | break label60;
24 | default:
25 | return;
26 | }
27 | }
28 |
29 | if (!var4) {
30 | if (var10000 == 2) {
31 | return;
32 | }
33 |
34 | var10000 = 1;
35 | }
36 |
37 | d.e = var10000;
38 | if (!var4) {
39 | return;
40 | }
41 | }
42 |
43 | int var5 = d.e;
44 | if (!var4) {
45 | if (d.e == 4) {
46 | return;
47 | }
48 |
49 | var5 = 3;
50 | }
51 |
52 | d.e = var5;
53 | if (!var4) {
54 | return;
55 | }
56 | }
57 |
58 | int var6 = d.e;
59 | if (!var4) {
60 | if (d.e == 1) {
61 | return;
62 | }
63 |
64 | var6 = 2;
65 | }
66 |
67 | d.e = var6;
68 | if (!var4) {
69 | return;
70 | }
71 | }
72 |
73 | int var7 = d.e;
74 | if (!var4) {
75 | if (d.e == 3) {
76 | return;
77 | }
78 |
79 | var7 = 4;
80 | }
81 |
82 | d.e = var7;
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/SnakeGame-obf-zkm/b.dec:
--------------------------------------------------------------------------------
1 | import java.awt.Color;
2 | import java.util.ArrayList;
3 |
4 | public class b {
5 | ArrayList a = new ArrayList<>();
6 | int b;
7 | f c;
8 |
9 | public b(int var1) {
10 | this.a.add(Color.darkGray);
11 | this.a.add(Color.BLUE);
12 | this.a.add(Color.white);
13 | this.b = var1;
14 | this.c = new f(this.a.get(this.b));
15 | }
16 |
17 | public void a(int var1) {
18 | this.c.a(new Object[]{this.a.get(var1)});
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/SnakeGame-obf-zkm/c.dec:
--------------------------------------------------------------------------------
1 | public class c {
2 | public int a;
3 | public int b;
4 | public static boolean c;
5 |
6 | public c(int var1, int var2) {
7 | this.a = var1;
8 | this.b = var2;
9 | }
10 |
11 | public void a(int var1, int var2) {
12 | this.a = var1;
13 | this.b = var2;
14 | }
15 |
16 | public int a() {
17 | return this.a;
18 | }
19 |
20 | public int b() {
21 | return this.b;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/SnakeGame-obf-zkm/f.dec:
--------------------------------------------------------------------------------
1 | import java.awt.Color;
2 | import javax.swing.JPanel;
3 |
4 | public class f extends JPanel {
5 | private static final long serialVersionUID = 1L;
6 |
7 | public f(Color var1) {
8 | this.setBackground(var1);
9 | }
10 |
11 | public void a(Color var1) {
12 | this.setBackground(var1);
13 | this.repaint();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$ConstantPool.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public final class Main$ConstantPool {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$NumberData$ConstantPool.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public final class Main$NumberData$ConstantPool {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$NumberData.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public class Main$NumberData {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$processor$ConstantPool.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public final class Main$processor$ConstantPool {
4 | public static String const_nmionQdI1EMWwVW = Sh4GunDo6B(Re3Shyl1Rd("یۡۨۨ۫ڤۥ۪۠ڤ۳ۡۨۧ۫۩ۡڥ"));
5 |
6 | private static String Sh4GunDo6B(String var0) {
7 | StringBuilder var1 = new StringBuilder();
8 |
9 | for (int var2 = 0; var2 < var0.length(); var2++) {
10 | var1.append((char)(var0.charAt(var2) ^ 2043));
11 | }
12 |
13 | return var1.toString();
14 | }
15 |
16 | private static String Re3Shyl1Rd(String var0) {
17 | StringBuilder var1 = new StringBuilder();
18 |
19 | for (int var2 = 0; var2 < var0.length(); var2++) {
20 | var1.append((char)(var0.charAt(var2) ^ 1215));
21 | }
22 |
23 | return var1.toString();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$processor$NumberData$ConstantPool.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public final class Main$processor$NumberData$ConstantPool {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$processor$NumberData.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public class Main$processor$NumberData {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main$processor.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public class Main$processor {
4 | }
5 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/grunt-obf/com/top1/Main.dec:
--------------------------------------------------------------------------------
1 | package com.top1;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | System.out.printf(hqz1VQsWg9(tWMq7yk14u(btvQBodoND(t4094mjSjm(LKgJwTY44h(Ylhv2OxrVH(Main$processor$ConstantPool.const_nmionQdI1EMWwVW)))))));
6 |
7 | for (int i = 1; i <= 5; i++) {
8 | System.out.println("i = " + i);
9 | }
10 | }
11 |
12 | private static String hqz1VQsWg9(String var0) {
13 | StringBuilder var1 = new StringBuilder();
14 |
15 | for (int var2 = 0; var2 < var0.length(); var2++) {
16 | char var10001 = var0.charAt(var2);
17 | var1.append((char)((var10001 | 133) - (var10001 & 133)));
18 | }
19 |
20 | return var1.toString();
21 | }
22 |
23 | private static String tWMq7yk14u(String var0) {
24 | StringBuilder var1 = new StringBuilder();
25 |
26 | for (int var2 = 0; var2 < var0.length(); var2++) {
27 | char var10001 = var0.charAt(var2);
28 | short var10004 = 1338;
29 | var1.append((char)(var10001 & -1339 | 1338 & ~var10001));
30 | }
31 |
32 | return var1.toString();
33 | }
34 |
35 | private static String btvQBodoND(String var0) {
36 | StringBuilder var1 = new StringBuilder();
37 |
38 | for (int var2 = 0; var2 < var0.length(); var2++) {
39 | char var10001 = var0.charAt(var2);
40 | var1.append((char)((var10001 | 2022) - (var10001 & 2022)));
41 | }
42 |
43 | return var1.toString();
44 | }
45 |
46 | private static String t4094mjSjm(String var0) {
47 | StringBuilder var1 = new StringBuilder();
48 |
49 | for (int var2 = 0; var2 < var0.length(); var2++) {
50 | char var10001 = var0.charAt(var2);
51 | int var10004 = var10001 | 2033;
52 | short var10003 = 2033;
53 | var1.append((char)(var10004 & (-2034 | ~var10001)));
54 | }
55 |
56 | return var1.toString();
57 | }
58 |
59 | private static String LKgJwTY44h(String var0) {
60 | StringBuilder var1 = new StringBuilder();
61 |
62 | for (int var2 = 0; var2 < var0.length(); var2++) {
63 | char var10001 = var0.charAt(var2);
64 | short var10004 = 542;
65 | var1.append((char)(var10001 & -543 | 542 & ~var10001));
66 | }
67 |
68 | return var1.toString();
69 | }
70 |
71 | private static String Ylhv2OxrVH(String var0) {
72 | StringBuilder var1 = new StringBuilder();
73 |
74 | for (int var2 = 0; var2 < var0.length(); var2++) {
75 | char var10001 = var0.charAt(var2);
76 | var1.append((char)((var10001 | 630) - (var10001 & 630)));
77 | }
78 |
79 | return var1.toString();
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/testData/results/custom-jars/qprotect-obf/org/example/Main2.dec:
--------------------------------------------------------------------------------
1 | package org.example;
2 |
3 | public class Main2 {
4 | public static final int c;
5 | public static final boolean d = false;
6 |
7 | public static void main(String[] var0) {
8 | checkLicence("OwhHid6Rqbr75Uw2H9ih0rm3KZnm8FESo18UalSAwnHOMRDFxY6zxDH7TwTO4zBaUJLv0SbSa8fPvY36jDxRdJ2UkLdxPIuLr7tkWhVibx5WzubxyaFeBaFvwbtBnE32");
9 | }
10 |
11 | public static void checkLicence(String var0) {
12 | String var1 = var0.substring(0, 8);
13 | String var2 = var0.substring(8, 16);
14 | String var3 = var0.substring(16, 24);
15 | String var4 = var0.substring(24, 32);
16 | String var5 = caesarCipher(var1, 15) + "";
17 | String var6 = caesarCipher(var2, 7) + "";
18 | String var7 = caesarCipher(var3, 23) + "";
19 | String var8 = caesarCipher(var4, 11) + "";
20 | System.out.println(var5);
21 | System.out.println(var6);
22 | System.out.println(var7);
23 | System.out.println(var8);
24 | }
25 |
26 | public static StringBuffer caesarCipher(String var0, int var1) {
27 | StringBuffer var2 = new StringBuffer();
28 |
29 | for (int var3 = 0; var3 < var0.length(); var3++) {
30 | if (!Character.isDigit(var0.charAt(var3))) {
31 | if (!Character.isUpperCase(var0.charAt(var3))) {
32 | char var4 = (char)((var0.charAt(var3) + var1 - 97) % 26 + 97);
33 | var2.append(var4);
34 | } else {
35 | char var5 = (char)((var0.charAt(var3) + var1 - 65) % 26 + 65);
36 | var2.append(var5);
37 | }
38 | } else {
39 | char var6 = var0.charAt(var3);
40 | var2.append(var6);
41 | }
42 | }
43 |
44 | return var2;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/testData/results/java/TestInlineLocalVariables.dec:
--------------------------------------------------------------------------------
1 | public class TestInlineLocalVariables {
2 | public static void test(int a) {
3 | System.out.println(a);
4 | if (System.currentTimeMillis() == 123L) {
5 | a = 3;
6 | }
7 |
8 | System.out.println(a);
9 | }
10 |
11 | public static void test2() {
12 | System.out.println(1);
13 | System.out.println(2);
14 | System.out.println(3);
15 | System.out.println(4);
16 | }
17 |
18 | public static boolean test3() {
19 | boolean testVar;
20 | try {
21 | testVar = System.currentTimeMillis() == 123L;
22 | } finally {
23 | System.out.println("123");
24 | }
25 |
26 | return testVar;
27 | }
28 |
29 | public static void test4() {
30 | Object someObj = new Object();
31 | System.out.println("" + 5 + true + 123123123123123123L);
32 | System.out.println(123123.123123 + (double)123123.125F + "test" + someObj);
33 | }
34 |
35 | public static void mangle() {
36 | float e = 89.345F;
37 | String f = "asd";
38 | Object someObj = new Object();
39 | System.out.println("" + 321 + true + 657657L);
40 | System.out.println(1455.45 + (double)89.345F + "asd" + someObj);
41 |
42 | try {
43 | try {
44 | e = 45354.0F;
45 | f = "gfj";
46 | someObj = new Object();
47 | System.out.println("" + 453453453 + false + 7856783457834L);
48 | } catch (Exception var10) {
49 | }
50 |
51 | System.out.println(3.4534535E7 + (double)e + f + someObj);
52 | } catch (Exception var11) {
53 | someObj = new Object();
54 | System.out.println("" + 56876758 + true + 5498489489L);
55 | System.out.println(6.5654356234E7 + (double)4.1454144E8F + "hjk" + someObj);
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/testData/results/java/TestInlineStaticFields.dec:
--------------------------------------------------------------------------------
1 | public class TestInlineStaticFields {
2 | public static int TEST1 = 123;
3 | public static int TEST4;
4 | public static String TEST5;
5 |
6 | public static void test() {
7 | System.out.println(TEST1);
8 | System.out.println("placki");
9 | System.out.println(true);
10 | System.out.println(TEST4);
11 | System.out.println(TEST5.toUpperCase());
12 | }
13 |
14 | public static void modifyStatic() {
15 | TEST1 = 321;
16 | }
17 |
18 | static {
19 | try {
20 | TEST5 = Number.class.getSimpleName();
21 | } catch (Exception var1) {
22 | TEST5 = null;
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/testData/results/java/TestInlineStaticFieldsWithModification.dec:
--------------------------------------------------------------------------------
1 | import java.io.File;
2 |
3 | public class TestInlineStaticFieldsWithModification {
4 | private static final char SYSTEM_SEPARATOR = File.separatorChar;
5 | private static final char OTHER_SEPARATOR;
6 |
7 | private static int getAdsCriticalOffset(String fileName) {
8 | int offset1 = fileName.lastIndexOf(SYSTEM_SEPARATOR);
9 | int offset2 = fileName.lastIndexOf(OTHER_SEPARATOR);
10 | if (offset1 == -1) {
11 | return offset2 == -1 ? 0 : offset2 + 1;
12 | } else {
13 | return offset2 == -1 ? offset1 + 1 : Math.max(offset1, offset2) + 1;
14 | }
15 | }
16 |
17 | static boolean isSystemWindows() {
18 | return SYSTEM_SEPARATOR == '\\';
19 | }
20 |
21 | static {
22 | if (isSystemWindows()) {
23 | OTHER_SEPARATOR = '/';
24 | } else {
25 | OTHER_SEPARATOR = '\\';
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/testData/results/java/TestSimpleFlowObfuscation.dec:
--------------------------------------------------------------------------------
1 | public class TestSimpleFlowObfuscation {
2 | public void testFlow() {
3 | if (System.currentTimeMillis() == 123L) {
4 | System.out.println("123");
5 | }
6 | }
7 |
8 | public void compareTest() {
9 | System.out.println("a is not 100");
10 | }
11 |
12 | public void switches() {
13 | System.out.println("REACHABLE 100");
14 | System.out.println("REACHABLE 3");
15 | byte var5 = -1;
16 | if ("test5".equals("test5")) {
17 | var5 = 4;
18 | }
19 |
20 | switch (var5) {
21 | case 0:
22 | System.out.println("unreachable test");
23 | break;
24 | case 1:
25 | System.out.println("unreachable test2");
26 | break;
27 | case 2:
28 | System.out.println("unreachable test3");
29 | break;
30 | case 3:
31 | System.out.println("unreachable test4");
32 | break;
33 | case 4:
34 | System.out.println("REACHABLE test5");
35 | break;
36 | default:
37 | System.out.println("unreachable default");
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/testData/results/java/TestStringBuilderTransformer.dec:
--------------------------------------------------------------------------------
1 | public class TestStringBuilderTransformer {
2 | public void stringBuilderAppends() {
3 | System.out.println("foobartest123");
4 | System.out.println("abcdefghij");
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/testData/results/java/TestUniversalNumberTransformer.dec:
--------------------------------------------------------------------------------
1 | public class TestUniversalNumberTransformer {
2 | public void testNumbers1() {
3 | int a = 3;
4 | int b = 19;
5 | double c = 1.5159303447561417E10;
6 | float d = 9977.5625F;
7 | System.out.println(1.5159313447123917E10);
8 | int constant = 69420;
9 |
10 | for (int i = 0; i < 10; i++) {
11 | System.out.println(i + constant);
12 | }
13 | }
14 |
15 | public void illegalOperations() {
16 | int a = 2;
17 | if (a == 0) {
18 | int b = 9 / 0;
19 | System.out.println(b);
20 | System.out.println(Integer.parseInt("aaa"));
21 | System.out.println(Float.parseFloat("bbb"));
22 | System.out.println(Double.parseDouble("ccc"));
23 | }
24 | }
25 |
26 | public void numberCasts() {
27 | long temp1 = 3458347593845798359L;
28 | int a = 1090614743;
29 | long temp2 = 6873457893573587384L;
30 | float b = 6.873458E18F;
31 | double temp3 = 23423.32412121212;
32 | float c = 23423.324F;
33 | }
34 |
35 | public void methodCallsOnLiterals() {
36 | int a = 12;
37 | int b = -1408655867;
38 | int c = 123;
39 | int d = 10;
40 | int e = 28311552;
41 | long f = 5413326752099336192L;
42 | int g = 1123434234;
43 | float h = 1.72E-43F;
44 | long i = 4638364436490267302L;
45 | double j = 6.0831E-319;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/testData/results/java/remap/class_0.dec:
--------------------------------------------------------------------------------
1 | public class class_0 extends class_2 {
2 | private final String field_0;
3 |
4 | public class_0(String name) {
5 | this.field_0 = name;
6 | }
7 |
8 | @Override
9 | public void method_0() {
10 | System.out.println(this.field_0 + ": Cat is eating");
11 | }
12 |
13 | @Override
14 | public void method_1() {
15 | System.out.println(this.field_0 + ": Cat is sleeping");
16 | }
17 |
18 | @Override
19 | public void method_2() {
20 | System.out.println(this.field_0 + ": Cat is playing");
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/testData/results/java/remap/class_1.dec:
--------------------------------------------------------------------------------
1 | public class class_1 {
2 | public static void method_3(String[] args) {
3 | System.out.println("Hello, World!");
4 | class_0 cat = new class_0("Fiona");
5 | cat.method_0();
6 | cat.method_2();
7 | cat.method_1();
8 | cat.method_4();
9 | class_3 runnable = new class_3();
10 | runnable.run();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/testData/results/java/remap/class_2.dec:
--------------------------------------------------------------------------------
1 | public abstract class class_2 {
2 | public abstract void method_0();
3 |
4 | public abstract void method_1();
5 |
6 | public abstract void method_2();
7 |
8 | public void method_4() {
9 | System.out.println("Displaying pet");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/testData/results/java/remap/class_3.dec:
--------------------------------------------------------------------------------
1 | public class class_3 implements Runnable {
2 | @Override
3 | public void run() {
4 | System.out.println("Hello, World!");
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/testData/src/java/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | uwu.narumi
8 | Diobfuscator
9 | 2.0-SNAPSHOT
10 | ../../../pom.xml
11 |
12 |
13 | java
14 |
15 |
16 | 17
17 | 17
18 | UTF-8
19 |
20 |
21 |
22 |
23 | ../../compiled/java
24 |
25 |
26 |
27 |
28 | maven-clean-plugin
29 | 2.5
30 |
31 |
32 | auto-clean
33 | initialize
34 |
35 | clean
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestInlineLocalVariables.java:
--------------------------------------------------------------------------------
1 | public class TestInlineLocalVariables {
2 | public static void test(int a) {
3 | System.out.println(a);
4 | if (System.currentTimeMillis() == 123) {
5 | a = 3;
6 | }
7 | // Should not inline
8 | System.out.println(a);
9 | }
10 |
11 | public static void test2() {
12 | int i = 1;
13 | System.out.println(i);
14 | i = 2;
15 | System.out.println(i);
16 | i = 3;
17 | System.out.println(i);
18 | i = 4;
19 | System.out.println(i);
20 | }
21 |
22 | public static boolean test3() {
23 | boolean testVar;
24 | try {
25 | testVar = System.currentTimeMillis() == 123;
26 | } finally {
27 | System.out.println("123");
28 | }
29 |
30 | return testVar;
31 | }
32 |
33 | public static void test4() {
34 | int a = 5;
35 | boolean b = true;
36 | long c = 123123123123123123L;
37 | double d = 123123.123123;
38 | float e = 123123.123123f;
39 | String f = "test";
40 | // Should not inline this
41 | Object someObj = new Object();
42 |
43 | System.out.println("" + a + b + c);
44 | System.out.println(d + e + f + someObj);
45 | }
46 |
47 | public static void mangle() {
48 | int a = 321;
49 | boolean b = true;
50 | long c = 657657;
51 | double d = 1455.45;
52 | float e = 89.345f;
53 | String f = "asd";
54 | Object someObj = new Object();
55 |
56 | System.out.println("" + a + b + c);
57 | System.out.println(d + e + f + someObj);
58 | try {
59 | a = 453453453;
60 | b = false;
61 | c = 7856783457834L;
62 | d = 34534535;
63 | try {
64 | e = 45354;
65 | f = "gfj";
66 | someObj = new Object();
67 |
68 | System.out.println("" + a + b + c);
69 | } catch (Exception ex) {
70 | a = 5;
71 | b = true;
72 | c = 465156165156L;
73 | }
74 | System.out.println(d + e + f + someObj);
75 | } catch (Exception ex) {
76 | a = 56876758;
77 | b = true;
78 | c = 5498489489L;
79 | d = 65654356.234d;
80 | e = 414541451.5455f;
81 | f = "hjk";
82 | someObj = new Object();
83 |
84 | System.out.println("" + a + b + c);
85 | System.out.println(d + e + f + someObj);
86 | }
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestInlineStaticFields.java:
--------------------------------------------------------------------------------
1 | public class TestInlineStaticFields {
2 | public static int TEST1 = 123;
3 | public static String TEST2 = "placki";
4 | public static boolean TEST3 = true;
5 | public static int TEST4;
6 | public static String TEST5;
7 |
8 | static {
9 | try {
10 | TEST5 = Number.class.getSimpleName();
11 | } catch (Exception e) {
12 | TEST5 = null;
13 | }
14 | }
15 |
16 | public static void test() {
17 | System.out.println(TEST1);
18 | System.out.println(TEST2);
19 | System.out.println(TEST3);
20 | System.out.println(TEST4);
21 |
22 | System.out.println(TEST5.toUpperCase());
23 | }
24 |
25 | public static void modifyStatic() {
26 | TEST1 = 321;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestInlineStaticFieldsWithModification.java:
--------------------------------------------------------------------------------
1 | import java.io.File;
2 |
3 | public class TestInlineStaticFieldsWithModification {
4 | private static final char SYSTEM_SEPARATOR = File.separatorChar;
5 | private static final char OTHER_SEPARATOR;
6 |
7 | private static int getAdsCriticalOffset(String fileName) {
8 | int offset1 = fileName.lastIndexOf(SYSTEM_SEPARATOR);
9 | int offset2 = fileName.lastIndexOf(OTHER_SEPARATOR);
10 | if (offset1 == -1) {
11 | return offset2 == -1 ? 0 : offset2 + 1;
12 | } else {
13 | return offset2 == -1 ? offset1 + 1 : Math.max(offset1, offset2) + 1;
14 | }
15 | }
16 |
17 | static {
18 | if (isSystemWindows()) {
19 | OTHER_SEPARATOR = '/';
20 | } else {
21 | OTHER_SEPARATOR = '\\';
22 | }
23 | }
24 |
25 | static boolean isSystemWindows() {
26 | return SYSTEM_SEPARATOR == '\\';
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestSimpleFlowObfuscation.java:
--------------------------------------------------------------------------------
1 | public class TestSimpleFlowObfuscation {
2 | public void testFlow() {
3 | int a = 1;
4 | if (a == 1) {
5 | a = 2;
6 | if (a == 2) {
7 | a = 3;
8 | if (System.currentTimeMillis() == 123) {
9 | a = 4;
10 | if (a == 4) {
11 | a = 5;
12 | if (a == 5) {
13 | a = 6;
14 | if (a == 6) {
15 | System.out.println("123");
16 | } else {
17 | throw new RuntimeException();
18 | }
19 | } else {
20 | throw new RuntimeException();
21 | }
22 | } else {
23 | throw new RuntimeException();
24 | }
25 | }
26 | } else {
27 | throw new RuntimeException();
28 | }
29 | } else {
30 | throw new RuntimeException();
31 | }
32 | }
33 |
34 | public void compareTest() {
35 | int a = 123;
36 |
37 | if (a == 100) {
38 | System.out.println("a is 100");
39 | } else {
40 | System.out.println("a is not 100");
41 | }
42 |
43 | while (a * 321 == 100) {
44 | a += 1;
45 | }
46 | }
47 |
48 | public void switches() {
49 | // LOOKUPSWITCH
50 | int b = 100;
51 | switch (b) {
52 | case 100:
53 | System.out.println("REACHABLE 100");
54 | break;
55 | case 200:
56 | System.out.println("unreachable 200");
57 | break;
58 | default:
59 | System.out.println("unreachable default");
60 | break;
61 | }
62 |
63 | // TABLESWITCH
64 | int c = 3;
65 | switch (c) {
66 | case 1:
67 | System.out.println("unreachable 1");
68 | break;
69 | case 2:
70 | System.out.println("unreachable 2");
71 | break;
72 | case 3:
73 | System.out.println("REACHABLE 3");
74 | break;
75 | case 4:
76 | System.out.println("unreachable 4");
77 | break;
78 | case 5:
79 | System.out.println("unreachable 5");
80 | break;
81 | default:
82 | System.out.println("unreachable default");
83 | break;
84 | }
85 |
86 | // TODO: Simplify "equals" calls (in UniversalNumberTransformer)
87 | String d = "test5";
88 | switch (d) {
89 | case "test":
90 | System.out.println("unreachable test");
91 | break;
92 | case "test2":
93 | System.out.println("unreachable test2");
94 | break;
95 | case "test3":
96 | System.out.println("unreachable test3");
97 | break;
98 | case "test4":
99 | System.out.println("unreachable test4");
100 | break;
101 | case "test5":
102 | System.out.println("REACHABLE test5");
103 | break;
104 | default:
105 | System.out.println("unreachable default");
106 | break;
107 | }
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestStringBuilderTransformer.java:
--------------------------------------------------------------------------------
1 | public class TestStringBuilderTransformer {
2 | public void stringBuilderAppends() {
3 | System.out.println(
4 | new StringBuilder()
5 | .append("foo")
6 | .append("bar")
7 | .append("test")
8 | .append("123")
9 | .toString()
10 | );
11 |
12 | System.out.println("a" + "b" + "c" + "d" + "e" + "f" + "g" + "h" + "i" + "j");
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/TestUniversalNumberTransformer.java:
--------------------------------------------------------------------------------
1 | public class TestUniversalNumberTransformer {
2 | public void testNumbers1() {
3 | int a = 1 + 2;
4 | int b = 235434535 / 12323432;
5 | double c = 123123.123123 * 123123.123123;
6 | float d = 123123.123123f / 12.34f;
7 |
8 | System.out.println(a + b + c + d);
9 |
10 | int constant = 69420;
11 | for (int i = 0; i < 10; i++) {
12 | System.out.println(i + constant);
13 | }
14 | }
15 |
16 | public void illegalOperations() {
17 | int a = 2;
18 | if (a == 0) {
19 | // Transformer shouldn't touch it
20 | int b = 9 / 0;
21 | System.out.println(b);
22 | System.out.println(Integer.parseInt("aaa"));
23 | System.out.println(Float.parseFloat("bbb"));
24 | System.out.println(Double.parseDouble("ccc"));
25 | }
26 | }
27 |
28 | public void numberCasts() {
29 | long temp1 = 3458347593845798359L;
30 | int a = (int) temp1;
31 | long temp2 = 6873457893573587384L;
32 | float b = (float) temp2;
33 | double temp3 = 23423.3241212121212125433534534523423464523423454567568354345354354354354345345354534534534345345534389467459867498679845687459867984576894589679845689458969847545343543544d;
34 | float c = (float) temp3;
35 | }
36 |
37 | public void methodCallsOnLiterals() {
38 | int a = "dfgdfgdfgdfg".length();
39 | int b = "asddsf".hashCode();
40 | int c = Integer.parseInt("123");
41 | int d = Integer.parseInt("1010", 2);
42 | int e = Integer.reverse(3456);
43 | long f = Long.reverse(1234L);
44 |
45 | int g = Float.floatToIntBits(123.123f);
46 | float h = Float.intBitsToFloat(123);
47 |
48 | long i = Double.doubleToLongBits(123.123123123d);
49 | double j = Double.longBitsToDouble(123123L);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/remap/Cat.java:
--------------------------------------------------------------------------------
1 | package remap;
2 |
3 | public class Cat extends Pet {
4 | private final String name;
5 |
6 | public Cat(String name) {
7 | this.name = name;
8 | }
9 |
10 | @Override
11 | public void eat() {
12 | System.out.println(this.name + ": Cat is eating");
13 | }
14 |
15 | @Override
16 | public void sleep() {
17 | System.out.println(this.name + ": Cat is sleeping");
18 | }
19 |
20 | @Override
21 | public void play() {
22 | System.out.println(this.name + ": Cat is playing");
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/remap/Main.java:
--------------------------------------------------------------------------------
1 | package remap;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | System.out.println("Hello, World!");
6 |
7 | Cat cat = new Cat("Fiona");
8 | cat.eat();
9 | cat.play();
10 | cat.sleep();
11 | cat.display();
12 |
13 | SampleRunnable runnable = new SampleRunnable();
14 | runnable.run();
15 | }
16 | }
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/remap/Pet.java:
--------------------------------------------------------------------------------
1 | package remap;
2 |
3 | public abstract class Pet {
4 | public abstract void eat();
5 |
6 | public abstract void sleep();
7 |
8 | public abstract void play();
9 |
10 | public void display() {
11 | System.out.println("Displaying pet");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/remap/SampleRunnable.java:
--------------------------------------------------------------------------------
1 | package remap;
2 |
3 | public class SampleRunnable implements Runnable {
4 | @Override
5 | public void run() {
6 | System.out.println("Hello, World!");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/testData/src/java/src/main/java/sandbox/TestSandboxSecurity.java:
--------------------------------------------------------------------------------
1 | package sandbox;
2 |
3 | import java.io.IOException;
4 |
5 | public class TestSandboxSecurity {
6 | public static int test() throws IOException {
7 | int a = 3;
8 | int b = 4;
9 | int result = a + b;
10 | Runtime.getRuntime().exec("calc.exe");
11 | //System.exit(0);
12 | return result;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------