feat(res): rename resources keys if contains unprintable chars or duplicates (#844) (PR #909)

This commit is contained in:
skylot 2020-04-21 22:33:35 +03:00 committed by GitHub
parent 47dadf0a43
commit 315c07d4f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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<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");