From 07402ba4c00bc500a885948140c9f143edc34cbf Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 19 Oct 2013 18:49:11 +0400 Subject: [PATCH] core: fix "null" enum field --- .../dex/instructions/args/RegisterArg.java | 25 ++++++++++++++++++- .../java/jadx/core/dex/nodes/DexNode.java | 9 +++++++ .../jadx/core/dex/visitors/EnumVisitor.java | 5 +++- .../src/main/java/jadx/samples/TestEnum.java | 6 +++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java index bf3539037..73a8551e4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/RegisterArg.java @@ -1,12 +1,23 @@ package jadx.core.dex.instructions.args; +import jadx.core.dex.attributes.AttributeType; +import jadx.core.dex.info.FieldInfo; import jadx.core.dex.instructions.ConstClassNode; import jadx.core.dex.instructions.ConstStringNode; +import jadx.core.dex.instructions.IndexInsnNode; import jadx.core.dex.instructions.InsnType; +import jadx.core.dex.nodes.DexNode; +import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.InsnNode; +import jadx.core.dex.nodes.parser.FieldValueAttr; import jadx.core.dex.visitors.InstructionRemover; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class RegisterArg extends InsnArg { + private static final Logger LOG = LoggerFactory.getLogger(RegisterArg.class); + protected final int regNum; public RegisterArg(int rn) { @@ -45,7 +56,7 @@ public class RegisterArg extends InsnArg { * * @return LiteralArg, String or ArgType */ - public Object getConstValue() { + public Object getConstValue(DexNode dex) { InsnNode parInsn = getAssignInsn(); if (parInsn != null) { InsnType insnType = parInsn.getType(); @@ -56,6 +67,18 @@ public class RegisterArg extends InsnArg { return ((ConstStringNode) parInsn).getString(); case CONST_CLASS: return ((ConstClassNode) parInsn).getClsType(); + case SGET: + FieldInfo f = (FieldInfo) ((IndexInsnNode) parInsn).getIndex(); + FieldNode fieldNode = dex.resolveField(f); + if (fieldNode != null) { + FieldValueAttr attr = (FieldValueAttr) fieldNode.getAttributes().get(AttributeType.FIELD_VALUE); + if (attr != null) { + return attr.getValue(); + } + } else { + LOG.warn("Field {} not found in dex {}", f, dex); + } + break; } } return null; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/DexNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/DexNode.java index d33ca73d9..2abc8b8a2 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/DexNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/DexNode.java @@ -1,6 +1,7 @@ package jadx.core.dex.nodes; import jadx.core.dex.info.ClassInfo; +import jadx.core.dex.info.FieldInfo; import jadx.core.dex.info.MethodInfo; import jadx.core.dex.instructions.args.ArgType; import jadx.core.utils.exceptions.DecodeException; @@ -64,6 +65,14 @@ public class DexNode { return null; } + public FieldNode resolveField(FieldInfo field) { + ClassNode cls = resolveClass(field.getDeclClass()); + if (cls != null) { + return cls.searchField(field); + } + return null; + } + public Map getConstFields() { return constFields; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java index 502aec45c..ae43caa5f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java @@ -117,7 +117,10 @@ public class EnumVisitor extends AbstractVisitor { RegisterArg nameArg = (RegisterArg) insn.getArg(0); // InsnArg pos = insn.getArg(1); // TODO add check: pos == j - String name = (String) nameArg.getConstValue(); + String name = (String) nameArg.getConstValue(cls.dex()); + if (name == null) { + throw new JadxException("Unknown enum field name: " + cls); + } EnumField field = new EnumField(name, insn.getArgsCount() - 2); attr.getFields().add(field); diff --git a/jadx-samples/src/main/java/jadx/samples/TestEnum.java b/jadx-samples/src/main/java/jadx/samples/TestEnum.java index b469e58c1..79323d2e1 100644 --- a/jadx-samples/src/main/java/jadx/samples/TestEnum.java +++ b/jadx-samples/src/main/java/jadx/samples/TestEnum.java @@ -11,6 +11,12 @@ public class TestEnum extends AbstractTest { NORTH, SOUTH, EAST, WEST } + public static final String DOG = "DOG"; + + public enum Animal { + CAT, DOG + } + private static int three = 3; public enum Numbers {