Skip to content

Commit

Permalink
feat(res): rename resources keys if contains unprintable chars or dup…
Browse files Browse the repository at this point in the history
…licates (#844) (PR #909)
  • Loading branch information
skylot committed Apr 21, 2020
1 parent 47dadf0 commit 315c07d
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

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;
Expand Down Expand Up @@ -152,6 +153,7 @@ private PackageChunk parsePackage() throws IOException {
if (keyStringsOffset != 0) {
is.skipToPos(keyStringsOffset, "Expected keyStrings string pool");
keyStrings = parseStringPool();
deobfKeyStrings(keyStrings);
}

PackageChunk pkg = new PackageChunk(id, name, typeStrings, keyStrings);
Expand All @@ -172,6 +174,32 @@ private PackageChunk parsePackage() throws IOException {
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<String> 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");
Expand Down

0 comments on commit 315c07d

Please sign in to comment.