From 315c07d4f68c33f1372d2cb8419cb8879f313794 Mon Sep 17 00:00:00 2001 From: skylot Date: Tue, 21 Apr 2020 22:33:35 +0300 Subject: [PATCH] feat(res): rename resources keys if contains unprintable chars or duplicates (#844) (PR #909) --- .../java/jadx/core/xmlgen/ResTableParser.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java index d286d9370..126969a1e 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import jadx.api.ICodeInfo; import jadx.core.codegen.CodeWriter; +import jadx.core.deobf.NameMapper; import jadx.core.dex.attributes.AFlag; import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.RootNode; @@ -152,6 +153,7 @@ public class ResTableParser extends CommonBinaryParser { if (keyStringsOffset != 0) { is.skipToPos(keyStringsOffset, "Expected keyStrings string pool"); keyStrings = parseStringPool(); + deobfKeyStrings(keyStrings); } PackageChunk pkg = new PackageChunk(id, name, typeStrings, keyStrings); @@ -172,6 +174,32 @@ public class ResTableParser extends CommonBinaryParser { return pkg; } + private void deobfKeyStrings(String[] keyStrings) { + int keysCount = keyStrings.length; + if (root.getArgs().isRenamePrintable()) { + for (int i = 0; i < keysCount; i++) { + String keyString = keyStrings[i]; + if (!NameMapper.isAllCharsPrintable(keyString)) { + keyStrings[i] = makeNewKeyName(i); + } + } + } + if (root.getArgs().isRenameValid()) { + Set keySet = new HashSet<>(keysCount); + for (int i = 0; i < keysCount; i++) { + String keyString = keyStrings[i]; + boolean isNew = keySet.add(keyString); + if (!isNew) { + keyStrings[i] = makeNewKeyName(i); + } + } + } + } + + private String makeNewKeyName(int idx) { + return "JADX_DEOBF_" + idx; + } + @SuppressWarnings("unused") private void parseTypeSpecChunk() throws IOException { is.checkInt16(0x0010, "Unexpected type spec header size");