Skip to content

Commit 81a70e1

Browse files
committed
reducing duplicate CONSTANT_VALUE reads into FieldConstants
1 parent 3396417 commit 81a70e1

3 files changed

Lines changed: 33 additions & 25 deletions

File tree

src/main/java/jadx/plugins/stringdecoder/B64DeobfuscatePass.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
import java.util.stream.IntStream;
1313

1414
import jadx.api.data.CommentStyle;
15-
import jadx.api.plugins.input.data.annotations.EncodedType;
16-
import jadx.api.plugins.input.data.annotations.EncodedValue;
17-
import jadx.api.plugins.input.data.attributes.JadxAttrType;
1815
import jadx.api.plugins.pass.JadxPassInfo;
1916
import jadx.api.plugins.pass.impl.OrderedJadxPassInfo;
2017
import jadx.api.plugins.pass.types.JadxDecompilePass;
@@ -291,13 +288,9 @@ private static boolean isUsedAsBase64DecodeArg(ConstStringNode csn) {
291288
private static Set<String> collectConstantValueFieldStrings(ClassNode cls) {
292289
Set<String> result = new HashSet<>();
293290
for (FieldNode field : cls.getFields()) {
294-
EncodedValue cv = field.get(JadxAttrType.CONSTANT_VALUE);
295-
if (cv == null || cv.getType() != EncodedType.ENCODED_STRING) {
296-
continue;
297-
}
298-
Object val = cv.getValue();
299-
if (val instanceof String) {
300-
result.add((String) val);
291+
String val = FieldConstants.readStringValue(field);
292+
if (val != null) {
293+
result.add(val);
301294
}
302295
}
303296
return result.isEmpty() ? Collections.emptySet() : result;

src/main/java/jadx/plugins/stringdecoder/B64FieldInitPass.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
import java.util.TreeMap;
44

5-
import jadx.api.plugins.input.data.annotations.EncodedType;
6-
import jadx.api.plugins.input.data.annotations.EncodedValue;
7-
import jadx.api.plugins.input.data.attributes.JadxAttrType;
85
import jadx.api.plugins.pass.JadxPassInfo;
96
import jadx.api.plugins.pass.impl.OrderedJadxPassInfo;
107
import jadx.api.plugins.pass.types.JadxDecompilePass;
@@ -65,7 +62,7 @@ private void processField(FieldNode field) {
6562
return;
6663
}
6764
// static final field with literal value encoded in the class file (no <clinit>).
68-
String constStr = readConstantStringValue(field);
65+
String constStr = FieldConstants.readStringValue(field);
6966
if (constStr != null) {
7067
annotateField(field, constStr, false);
7168
}
@@ -125,7 +122,7 @@ private static String extractStringFromArg(FieldNode contextField, InsnArg arg)
125122
}
126123
if (argInsn != null && argInsn.getType() == InsnType.SGET) {
127124
FieldNode refField = resolveFieldFromSget(contextField, (IndexInsnNode) argInsn);
128-
return refField != null ? readConstantStringValue(refField) : null;
125+
return refField != null ? FieldConstants.readStringValue(refField) : null;
129126
}
130127
return null;
131128
}
@@ -171,7 +168,7 @@ private boolean annotateFromSgetReference(FieldNode consumingField, IndexInsnNod
171168
if (refField == null) {
172169
return false;
173170
}
174-
String str = readConstantStringValue(refField);
171+
String str = FieldConstants.readStringValue(refField);
175172
if (str == null || !annotateField(consumingField, str, isBase64Call)) {
176173
return false;
177174
}
@@ -190,15 +187,6 @@ private static FieldNode resolveFieldFromSget(FieldNode contextField, IndexInsnN
190187
return declCls != null ? declCls.searchField(refFieldInfo) : null;
191188
}
192189

193-
private static String readConstantStringValue(FieldNode field) {
194-
EncodedValue cv = field.get(JadxAttrType.CONSTANT_VALUE);
195-
if (cv == null || cv.getType() != EncodedType.ENCODED_STRING) {
196-
return null;
197-
}
198-
Object val = cv.getValue();
199-
return val instanceof String ? (String) val : null;
200-
}
201-
202190
private static InsnNode resolveArgInsn(InsnArg arg) {
203191
if (arg instanceof InsnWrapArg) {
204192
return ((InsnWrapArg) arg).getWrapInsn();
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package jadx.plugins.stringdecoder;
2+
3+
import jadx.api.plugins.input.data.annotations.EncodedType;
4+
import jadx.api.plugins.input.data.annotations.EncodedValue;
5+
import jadx.api.plugins.input.data.attributes.JadxAttrType;
6+
import jadx.core.dex.nodes.FieldNode;
7+
8+
/**
9+
* Reads compile-time constant values baked into a field by the class file — i.e. a {@code static
10+
* final} field's {@code CONSTANT_VALUE} attribute, as opposed to a value assigned in {@code <clinit>}
11+
* or a constructor (which {@code ExtractFieldInit} surfaces as a {@code FIELD_INIT_INSN}).
12+
*/
13+
final class FieldConstants {
14+
15+
private FieldConstants() {
16+
}
17+
18+
/** The field's {@code CONSTANT_VALUE} string literal, or null if it has none / isn't a string. */
19+
static String readStringValue(FieldNode field) {
20+
EncodedValue cv = field.get(JadxAttrType.CONSTANT_VALUE);
21+
if (cv == null || cv.getType() != EncodedType.ENCODED_STRING) {
22+
return null;
23+
}
24+
Object val = cv.getValue();
25+
return val instanceof String ? (String) val : null;
26+
}
27+
}

0 commit comments

Comments
 (0)