1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*******************************************************************************
* Copyright (c) 2015 Jeff Martin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public
* License v3.0 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Contributors:
* Jeff Martin - initial API and implementation
******************************************************************************/
package cuchaz.enigma.mapping;
import cuchaz.enigma.analysis.JarIndex;
import javassist.*;
import javassist.bytecode.Descriptor;
import javassist.expr.ConstructorCall;
import javassist.expr.FieldAccess;
import javassist.expr.MethodCall;
import javassist.expr.NewExpr;
public class EntryFactory {
public static ClassEntry getClassEntry(CtClass c) {
return new ClassEntry(Descriptor.toJvmName(c.getName()));
}
public static ClassEntry getObfClassEntry(JarIndex jarIndex, ClassMapping classMapping) {
ClassEntry obfClassEntry = new ClassEntry(classMapping.getObfFullName());
return obfClassEntry.buildClassEntry(jarIndex.getObfClassChain(obfClassEntry));
}
private static ClassEntry getObfClassEntry(ClassMapping classMapping) {
return new ClassEntry(classMapping.getObfFullName());
}
public static ClassEntry getSuperclassEntry(CtClass c) {
return new ClassEntry(Descriptor.toJvmName(c.getClassFile().getSuperclass()));
}
public static FieldEntry getFieldEntry(CtField field) {
return new FieldEntry(getClassEntry(field.getDeclaringClass()), field.getName(), new Type(field.getFieldInfo().getDescriptor()));
}
public static FieldEntry getFieldEntry(FieldAccess call) {
return new FieldEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), call.getFieldName(), new Type(call.getSignature()));
}
public static FieldEntry getFieldEntry(String className, String name, String type) {
return new FieldEntry(new ClassEntry(className), name, new Type(type));
}
public static FieldEntry getObfFieldEntry(ClassMapping classMapping, FieldMapping fieldMapping) {
return new FieldEntry(getObfClassEntry(classMapping), fieldMapping.getObfName(), fieldMapping.getObfType());
}
public static MethodEntry getMethodEntry(CtMethod method) {
return new MethodEntry(getClassEntry(method.getDeclaringClass()), method.getName(), new Signature(method.getMethodInfo().getDescriptor()));
}
public static MethodEntry getMethodEntry(MethodCall call) {
return new MethodEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), call.getMethodName(), new Signature(call.getSignature()));
}
public static ConstructorEntry getConstructorEntry(CtConstructor constructor) {
if (constructor.isClassInitializer()) {
return new ConstructorEntry(getClassEntry(constructor.getDeclaringClass()));
} else {
return new ConstructorEntry(getClassEntry(constructor.getDeclaringClass()), new Signature(constructor.getMethodInfo().getDescriptor()));
}
}
public static ConstructorEntry getConstructorEntry(ConstructorCall call) {
return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), new Signature(call.getSignature()));
}
public static ConstructorEntry getConstructorEntry(NewExpr call) {
return new ConstructorEntry(new ClassEntry(Descriptor.toJvmName(call.getClassName())), new Signature(call.getSignature()));
}
public static BehaviorEntry getBehaviorEntry(CtBehavior behavior) {
if (behavior instanceof CtMethod) {
return getMethodEntry((CtMethod) behavior);
} else if (behavior instanceof CtConstructor) {
return getConstructorEntry((CtConstructor) behavior);
}
throw new Error("behavior is neither Method nor Constructor!");
}
public static BehaviorEntry getBehaviorEntry(String className, String behaviorName, String behaviorSignature) {
return getBehaviorEntry(new ClassEntry(className), behaviorName, new Signature(behaviorSignature));
}
public static BehaviorEntry getBehaviorEntry(String className) {
return new ConstructorEntry(new ClassEntry(className));
}
public static BehaviorEntry getBehaviorEntry(ClassEntry classEntry, String behaviorName, Signature behaviorSignature) {
switch (behaviorName) {
case "<init>":
return new ConstructorEntry(classEntry, behaviorSignature);
case "<clinit>":
return new ConstructorEntry(classEntry);
default:
return new MethodEntry(classEntry, behaviorName, behaviorSignature);
}
}
public static BehaviorEntry getObfBehaviorEntry(ClassEntry classEntry, MethodMapping methodMapping) {
return getBehaviorEntry(classEntry, methodMapping.getObfName(), methodMapping.getObfSignature());
}
}
|