From 261ba4645d47b9ea7fbd07510e190acea44b77a9 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 16 Sep 2015 21:23:55 +0300 Subject: [PATCH] resources: support text chuck in binary xml (fix #84) --- .../java/jadx/core/utils/StringUtils.java | 19 ++++++++++++++ .../jadx/core/xmlgen/BinaryXMLParser.java | 25 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/jadx-core/src/main/java/jadx/core/utils/StringUtils.java b/jadx-core/src/main/java/jadx/core/utils/StringUtils.java index 621f349f..2f707d07 100644 --- a/jadx-core/src/main/java/jadx/core/utils/StringUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/StringUtils.java @@ -95,4 +95,23 @@ public class StringUtils { } return sb.toString(); } + + public static String escapeXML(String str) { + int len = str.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = str.charAt(i); + switch (c) { + case '&': sb.append("&"); break; + case '<': sb.append("<"); break; + case '>': sb.append(">"); break; + case '"': sb.append("""); break; + case '\'': sb.append("'"); break; + default: + sb.append(c); + break; + } + } + return sb.toString(); + } } diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java index 238ce9ba..cce1ca17 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java @@ -6,6 +6,7 @@ import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.RootNode; +import jadx.core.utils.StringUtils; import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.core.xmlgen.entry.ValuesParser; @@ -123,6 +124,9 @@ public class BinaryXMLParser extends CommonBinaryParser { case RES_XML_START_NAMESPACE_TYPE: parseNameSpace(); break; + case RES_XML_CDATA_TYPE: + parseCData(); + break; case RES_XML_END_NAMESPACE_TYPE: parseNameSpaceEnd(); break; @@ -181,6 +185,27 @@ public class BinaryXMLParser extends CommonBinaryParser { nsURI = strings[endURI]; } + private void parseCData() throws IOException { + if (is.readInt16() != 0x10) { + die("CDATA header is not 0x10"); + } + if (is.readInt32() != 0x1C) { + die("CDATA header chunk is not 0x1C"); + } + int lineNumber = is.readInt32(); + is.skip(4); + + int strIndex = is.readInt32(); + String str = strings[strIndex]; + + writer.startLine().addIndent(); + writer.attachSourceLine(lineNumber); + writer.add(StringUtils.escapeXML(str.trim())); // TODO: wrap into CDATA for easier reading + + int size = is.readInt16(); + is.skip(size - 2); + } + private void parseElement() throws IOException { if (firstElement) { firstElement = false; -- GitLab