Skip to content

Commit d93ee96

Browse files
committed
Fixes
1 parent 750254f commit d93ee96

18 files changed

+1239
-34
lines changed

src/main/java/net/cvs0/Main.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public class Main implements Callable<Integer>
3737
@Option(names = {"--rename-methods"}, description = "Enable method renaming")
3838
private Boolean renameMethods;
3939

40+
41+
42+
@Option(names = {"--add-synthetic-members"}, description = "Add synthetic fields and methods")
43+
private Boolean addSyntheticMembers;
44+
4045
@Option(names = {"-v", "--verbose"}, description = "Enable verbose output")
4146
private boolean verbose;
4247

@@ -337,6 +342,12 @@ private ObfuscationConfig buildConfiguration() throws Exception
337342
builder.renameMethods(renameMethods);
338343
}
339344

345+
346+
347+
if (addSyntheticMembers != null) {
348+
builder.addSyntheticMembers(addSyntheticMembers);
349+
}
350+
340351
builder.verbose(verbose);
341352

342353
if (keepClasses != null) {
@@ -386,6 +397,7 @@ private ObfuscationConfig buildConfiguration() throws Exception
386397
.renameMethods(true);
387398
}
388399

389-
return builder.build();
400+
ObfuscationConfig config = builder.build();
401+
return config;
390402
}
391403
}

src/main/java/net/cvs0/classfile/AttributeFactory.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ public static Attribute createAttribute(String name, byte[] data)
1818
return createLineNumberTableAttribute(data);
1919
case "LocalVariableTable":
2020
return createLocalVariableTableAttribute(data);
21+
case "LocalVariableTypeTable":
22+
return createLocalVariableTypeTableAttribute(data);
23+
case "StackMapTable":
24+
return createStackMapTableAttribute(data);
25+
case "RuntimeVisibleAnnotations":
26+
return createRuntimeVisibleAnnotationsAttribute(data);
27+
case "MethodParameters":
28+
return createMethodParametersAttribute(data);
2129
case "Exceptions":
2230
return createExceptionsAttribute(data);
2331
case "ConstantValue":
@@ -215,6 +223,73 @@ private static CodeAttribute createCodeAttribute(byte[] data)
215223
}
216224
}
217225

226+
private static LocalVariableTypeTableAttribute createLocalVariableTypeTableAttribute(byte[] data)
227+
{
228+
try
229+
{
230+
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
231+
LocalVariableTypeTableAttribute attribute = new LocalVariableTypeTableAttribute();
232+
233+
int numberOfLocalVariableTypes = dis.readUnsignedShort();
234+
for (int i = 0; i < numberOfLocalVariableTypes; i++)
235+
{
236+
int startPc = dis.readUnsignedShort();
237+
int length = dis.readUnsignedShort();
238+
int nameIndex = dis.readUnsignedShort();
239+
int signatureIndex = dis.readUnsignedShort();
240+
int index = dis.readUnsignedShort();
241+
242+
attribute.addLocalVariableType(new LocalVariableTypeTableAttribute.LocalVariableTypeInfo(
243+
startPc, length, nameIndex, signatureIndex, index));
244+
}
245+
246+
dis.close();
247+
return attribute;
248+
}
249+
catch (IOException e)
250+
{
251+
throw new RuntimeException("Failed to parse LocalVariableTypeTable attribute", e);
252+
}
253+
}
254+
255+
private static StackMapTableAttribute createStackMapTableAttribute(byte[] data)
256+
{
257+
StackMapTableAttribute attribute = new StackMapTableAttribute();
258+
attribute.addFrame(new StackMapTableAttribute.StackMapFrame(0, data));
259+
return attribute;
260+
}
261+
262+
private static RuntimeVisibleAnnotationsAttribute createRuntimeVisibleAnnotationsAttribute(byte[] data)
263+
{
264+
RuntimeVisibleAnnotationsAttribute attribute = new RuntimeVisibleAnnotationsAttribute();
265+
return attribute;
266+
}
267+
268+
private static MethodParametersAttribute createMethodParametersAttribute(byte[] data)
269+
{
270+
try
271+
{
272+
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
273+
MethodParametersAttribute attribute = new MethodParametersAttribute();
274+
275+
int numberOfParameters = dis.readUnsignedByte();
276+
for (int i = 0; i < numberOfParameters; i++)
277+
{
278+
int nameIndex = dis.readUnsignedShort();
279+
int access = dis.readUnsignedShort();
280+
281+
attribute.addParameter("param" + i, access);
282+
}
283+
284+
dis.close();
285+
return attribute;
286+
}
287+
catch (IOException e)
288+
{
289+
throw new RuntimeException("Failed to parse MethodParameters attribute", e);
290+
}
291+
}
292+
218293
public static class UnknownAttribute extends Attribute
219294
{
220295
private final byte[] data;
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package net.cvs0.classfile;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.DataOutputStream;
5+
import java.io.IOException;
6+
import java.util.List;
7+
import java.util.ArrayList;
8+
9+
public class LocalVariableTypeTableAttribute extends Attribute
10+
{
11+
private List<LocalVariableTypeInfo> localVariableTypes;
12+
13+
public LocalVariableTypeTableAttribute()
14+
{
15+
super("LocalVariableTypeTable");
16+
this.localVariableTypes = new ArrayList<>();
17+
}
18+
19+
public List<LocalVariableTypeInfo> getLocalVariableTypes()
20+
{
21+
return localVariableTypes;
22+
}
23+
24+
public void addLocalVariableType(LocalVariableTypeInfo localVariableType)
25+
{
26+
this.localVariableTypes.add(localVariableType);
27+
}
28+
29+
public void addLocalVariableType(int startPc, int length, String name, String signature, int index)
30+
{
31+
this.localVariableTypes.add(new LocalVariableTypeInfo(startPc, length, name, signature, index));
32+
}
33+
34+
@Override
35+
public byte[] getData()
36+
{
37+
try
38+
{
39+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
40+
DataOutputStream dos = new DataOutputStream(baos);
41+
42+
dos.writeShort(localVariableTypes.size());
43+
44+
for (LocalVariableTypeInfo localVariableType : localVariableTypes)
45+
{
46+
dos.writeShort(localVariableType.getStartPc());
47+
dos.writeShort(localVariableType.getLength());
48+
dos.writeShort(localVariableType.getNameIndex());
49+
dos.writeShort(localVariableType.getSignatureIndex());
50+
dos.writeShort(localVariableType.getIndex());
51+
}
52+
53+
dos.close();
54+
return baos.toByteArray();
55+
}
56+
catch (IOException e)
57+
{
58+
throw new RuntimeException("Failed to serialize LocalVariableTypeTable attribute", e);
59+
}
60+
}
61+
62+
@Override
63+
public int getLength()
64+
{
65+
return 2 + (localVariableTypes.size() * 10);
66+
}
67+
68+
public static class LocalVariableTypeInfo
69+
{
70+
private int startPc;
71+
private int length;
72+
private String name;
73+
private String signature;
74+
private int index;
75+
private int nameIndex;
76+
private int signatureIndex;
77+
78+
public LocalVariableTypeInfo(int startPc, int length, String name, String signature, int index)
79+
{
80+
this.startPc = startPc;
81+
this.length = length;
82+
this.name = name;
83+
this.signature = signature;
84+
this.index = index;
85+
}
86+
87+
public LocalVariableTypeInfo(int startPc, int length, int nameIndex, int signatureIndex, int index)
88+
{
89+
this.startPc = startPc;
90+
this.length = length;
91+
this.nameIndex = nameIndex;
92+
this.signatureIndex = signatureIndex;
93+
this.index = index;
94+
}
95+
96+
public int getStartPc() { return startPc; }
97+
public void setStartPc(int startPc) { this.startPc = startPc; }
98+
public int getLength() { return length; }
99+
public void setLength(int length) { this.length = length; }
100+
public String getName() { return name; }
101+
public void setName(String name) { this.name = name; }
102+
public String getSignature() { return signature; }
103+
public void setSignature(String signature) { this.signature = signature; }
104+
public int getIndex() { return index; }
105+
public void setIndex(int index) { this.index = index; }
106+
public int getNameIndex() { return nameIndex; }
107+
public void setNameIndex(int nameIndex) { this.nameIndex = nameIndex; }
108+
public int getSignatureIndex() { return signatureIndex; }
109+
public void setSignatureIndex(int signatureIndex) { this.signatureIndex = signatureIndex; }
110+
111+
@Override
112+
public String toString()
113+
{
114+
return "LocalVariableTypeInfo{startPc=" + startPc + ", length=" + length + ", name='" + name + "', signature='" + signature + "', index=" + index + "}";
115+
}
116+
}
117+
118+
@Override
119+
public String toString()
120+
{
121+
return "LocalVariableTypeTableAttribute{localVariableTypes=" + localVariableTypes.size() + "}";
122+
}
123+
}

src/main/java/net/cvs0/classfile/MethodParametersAttribute.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,22 @@ public Parameter getParameter(int index)
3636
@Override
3737
public byte[] getData()
3838
{
39-
return new byte[0];
39+
try {
40+
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
41+
java.io.DataOutputStream dos = new java.io.DataOutputStream(baos);
42+
43+
dos.writeByte(parameters.size());
44+
45+
for (Parameter param : parameters) {
46+
dos.writeShort(0);
47+
dos.writeShort(param.getAccess());
48+
}
49+
50+
dos.close();
51+
return baos.toByteArray();
52+
} catch (java.io.IOException e) {
53+
throw new RuntimeException("Failed to serialize MethodParameters attribute", e);
54+
}
4055
}
4156

4257
@Override
@@ -47,7 +62,7 @@ public int getLength()
4762

4863
public static class Parameter
4964
{
50-
private final String name;
65+
private String name;
5166
private final int access;
5267

5368
public Parameter(String name, int access)
@@ -61,6 +76,11 @@ public String getName()
6176
return name;
6277
}
6378

79+
public void setName(String name)
80+
{
81+
this.name = name;
82+
}
83+
6484
public int getAccess()
6585
{
6686
return access;

src/main/java/net/cvs0/classfile/ProgramField.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
package net.cvs0.classfile;
22

33
import org.objectweb.asm.Type;
4+
import java.util.ArrayList;
45
import java.util.HashMap;
6+
import java.util.List;
57
import java.util.Map;
68

79
public class ProgramField extends ProgramMember
810
{
911
private final Object value;
1012
private final Type type;
1113
private final Map<String, Object> annotations;
14+
private final List<Attribute> attributes;
1215

1316
public ProgramField(int access, String name, String descriptor, String signature, Object value)
1417
{
1518
super(access, name, descriptor, signature);
1619
this.value = value;
1720
this.type = Type.getType(descriptor);
1821
this.annotations = new HashMap<>();
22+
this.attributes = new ArrayList<>();
1923
}
2024

2125
public Object getValue()
@@ -103,6 +107,16 @@ public boolean hasAnnotation(String descriptor)
103107
return annotations.containsKey(descriptor);
104108
}
105109

110+
public List<Attribute> getAttributes()
111+
{
112+
return new ArrayList<>(attributes);
113+
}
114+
115+
public void addAttribute(Attribute attribute)
116+
{
117+
attributes.add(attribute);
118+
}
119+
106120
@Override
107121
public String toString()
108122
{

0 commit comments

Comments
 (0)