diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java b/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java index 49fe38c02b0b3b791315d51873e225de8ff1c198..64802084bdc1a4cc18df77730eb95059113ecf6c 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ParserConstants.java @@ -33,7 +33,8 @@ public class ParserConstants { protected static final int RES_TABLE_TYPE_SPEC_TYPE = 0x0202; // 514 protected static final int RES_TABLE_TYPE_LIBRARY = 0x0203; // 515 protected static final int RES_TABLE_TYPE_OVERLAY = 0x0204; // 516 - protected static final int RES_TABLE_TYPE_STAGED_ALIAS = 0x0206; // 517 + protected static final int RES_TABLE_TYPE_OVERLAY_POLICY = 0x0205; // 517 + protected static final int RES_TABLE_TYPE_STAGED_ALIAS = 0x0206; // 518 /** * Type constants 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 9dcae36999db21d65ddd0d771e70c6c0617aacc3..6a7adb87c796fcb34134f0ff55e186f8902562cd 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java @@ -168,8 +168,11 @@ public class ResTableParser extends CommonBinaryParser implements IResParser { parseLibraryTypeChunk(chunkStart); break; case RES_TABLE_TYPE_OVERLAY: // 0x0204 + parseOverlayTypeChunk(chunkStart); + break; + case RES_TABLE_TYPE_OVERLAY_POLICY: // 0x0205 throw new IOException( - String.format("Encountered unsupported chunk type TYPE_OVERLAY at offset 0x%x ", chunkStart)); + String.format("Encountered unsupported chunk type RES_TABLE_TYPE_OVERLAY_POLICY at offset 0x%x ", chunkStart)); case RES_TABLE_TYPE_STAGED_ALIAS: // 0x0206 throw new IOException( String.format("Encountered unsupported chunk type TYPE_STAGED_ALIAS at offset 0x%x ", chunkStart)); @@ -287,6 +290,18 @@ public class ResTableParser extends CommonBinaryParser implements IResParser { } } + private void parseOverlayTypeChunk(long chunkStart) throws IOException { + LOG.trace("parsing overlay type chunk starting at offset {}", chunkStart); + int headerSize = is.readInt16(); // usually 1032 bytes + int chunkSize = is.readInt32(); // e.g. 1056 bytes + long expectedEndPos = chunkStart + chunkSize; + String name = is.readString16Fixed(128); // 256 bytes + String actor = is.readString16Fixed(128); // 256 bytes + LOG.trace("Overlay header data: name={} actor={}", name, actor); + // the other data in the chunk header and body is unknown + is.skipToPos(expectedEndPos, "overlay chunk end"); + } + private void parseEntry(PackageChunk pkg, int typeId, int entryId, String config) throws IOException { int size = is.readInt16(); int flags = is.readInt16();