From 7d22fc66b56547a345555cc4cfdc4b21dedcfe82 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 14 Dec 2017 09:11:08 -0500 Subject: [PATCH 1/3] Initial testing of private namespace - added sample (removed attribute names) --- .../res/decoder/AXmlResourceParser.java | 27 +++++-- .../java/brut/androlib/MinifiedArscTest.java | 76 ++++++++++++++++++ .../brut/apktool/issue1157/issue1157.apk | Bin 0 -> 5323 bytes 3 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java create mode 100644 brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java index c1e2deae..17c6f2ae 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/AXmlResourceParser.java @@ -19,6 +19,7 @@ package brut.androlib.res.decoder; import android.content.res.XmlResourceParser; import android.util.TypedValue; import brut.androlib.AndrolibException; +import brut.androlib.res.data.ResID; import brut.androlib.res.xml.ResXmlEncoders; import brut.util.ExtDataInput; import com.google.common.io.LittleEndianDataInputStream; @@ -288,16 +289,15 @@ public class AXmlResourceParser implements XmlResourceParser { return ""; } - // hacky: if the attribute names are proguarded, then so are the namespace - // I don't know where these are located yet in the file, but it is always - // this.android_ns in testing, so we will default to that for now. - // @todo figure out where proguarded namespaces are stored. + // Minifiers like removing the namespace, so we will default to default namespace + // unless the pkgId of the resource is private. We will grab the non-standard one. String value = m_strings.getString(namespace); if (value.length() == 0) { - int offsetName = getAttributeOffset(index); - int name = m_attributes[offsetName + ATTRIBUTE_IX_NAME]; - if (m_strings.getString(name).length() == 0) { + ResID resourceId = new ResID(getAttributeNameResource(index)); + if (resourceId.package_ == PRIVATE_PKG_ID) { + value = getNonDefaultNamespaceUri(); + } else { value = android_ns; } } @@ -305,6 +305,17 @@ public class AXmlResourceParser implements XmlResourceParser { return value; } + private String getNonDefaultNamespaceUri() { + int offset = m_namespaces.getCurrentCount() + 1; + String prefix = m_strings.getString(m_namespaces.get(offset, true)); + + if (! prefix.equalsIgnoreCase("android")) { + return m_strings.getString(m_namespaces.get(offset, false)); + } + + return android_ns; + } + @Override public String getAttributePrefix(int index) { int offset = getAttributeOffset(index); @@ -999,4 +1010,6 @@ public class AXmlResourceParser implements XmlResourceParser { CHUNK_XML_END_NAMESPACE = 0x00100101, CHUNK_XML_START_TAG = 0x00100102, CHUNK_XML_END_TAG = 0x00100103, CHUNK_XML_TEXT = 0x00100104, CHUNK_XML_LAST = 0x00100104; + + private static final int PRIVATE_PKG_ID = 0x7F; } diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java new file mode 100644 index 00000000..31c0fb5a --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2017 Ryszard Wiśniewski + * Copyright (C) 2017 Connor Tumbleson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package brut.androlib; + +import brut.directory.ExtFile; +import brut.common.BrutException; +import brut.util.OS; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; + +/** + * @author Connor Tumbleson + */ +public class MinifiedArscTest { + + @BeforeClass + public static void beforeClass() throws Exception { + TestUtils.cleanFrameworkFile(); + sTmpDir = new ExtFile(OS.createTempDirectory()); + TestUtils.copyResourceDir(MinifiedArscTest.class, "brut/apktool/issue1157/", sTmpDir); + + String apk = "issue1157.apk"; + sDecodedDir = new ExtFile(sTmpDir, "issue1157"); + + // decode issue1157.apk + ApkDecoder apkDecoder = new ApkDecoder(new ExtFile(sTmpDir, apk)); + apkDecoder.setOutDir(sDecodedDir); + + // this should not raise an exception: + apkDecoder.decode(); + } + + @AfterClass + public static void afterClass() throws BrutException { + OS.rmdir(sTmpDir); + } + + @Test + public void checkIfMinifiedArscLayoutFileMatchesTest() throws IOException { + String expected = TestUtils.replaceNewlines("\n" + + ""); + + byte[] encoded = Files.readAllBytes(Paths.get(sDecodedDir + File.separator + "res" + File.separator + "xml" + File.separator + "custom.xml")); + String obtained = TestUtils.replaceNewlines(new String(encoded)); + assertEquals(expected, obtained); + } + + private static ExtFile sDecodedDir; + private static ExtFile sTmpDir; +} \ No newline at end of file diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk new file mode 100644 index 0000000000000000000000000000000000000000..4c1e67202493b1675449053560b0110f140a9797 GIT binary patch literal 5323 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

|K^ZbI5aQWishIPE@Z6_d>ED?l9h zbTAd|)j_)GqBS~MIroOvV|i&uNT1t}^sU5qWq@wjFZnMIy?gq#?D`{Ai}KR1aQ)V< z$`5-S4;*bR@DwbXob?S09UFcVP4%`TY*d>*=Qw6r7~41Ehr`l3-{>lr=_*pnX}eu= z8VkQm=-=gX;+e{MkX6{;*wJ!{`$~suz^z6PC1O==X!u}^1na%b@~-lg?PZ@vi%^5m zTK}@z=?E9bIS0j9whHPCSEf?uq<1*+0t)WIHEo}!+9L`N$oVq+4khba43|cfs0433 zXRV}}JGO4bYT>bfw^$cZSem=EwDCpTOkqf6+rG6rzASiZpR7>ETmA#rS(`$P<*KV? zzeIR%u{AUmz~d5BU%PAgztmtt_{gj49eo*S>x!Kg*K4VKKpVW1zhu@;FmuktFvuR= z&>I$xDb5ydUkJI7dwr-$H`6UXwC~OSpk2*Ge2 z9cfC5nP@(Io)kL^SX${mpaRm} zaQ!HWjwWcLok4E>r96M=3@LzzenTc^0<1R*l0*b#7$hwy1R_BPrxuRXiCm?FKqx5z z2{}m?31&F#3%vIfosJ!2xl%}OUJCwWX# zTJo6m326ySRyt`g3;O$>{m&hT=ltGB2qgduj{_vaW1!*TK-!2HWxnhM>;MhR{;Lyp zs8HbWfp4v)XBrisGJIhuL0fS1kGw9v5E^WiyE6^}Dws#rDoruRc}n*)Rt^ zyPpG}Jllj;>s!xi?WvZz33GFP*PXMC4J~cQKAC0IJh6cTorj5$mvch8FbJ22EH@!& zz1=F=#hjL)6j3OM{GSlQzFls7|a!|rIcm}&C951BeDZYYLjrPxTBe_UpC;EomZ zz9w3Ti<0dNrYyf|sikur?r!N}e1xg{rxgwrM|(#Pa5@sMJb)xvrO!-PgPl;y4)cZnk!396*_>3m{zr&yPF@gdnzdps-7Wc>eIgLHlIRR*2lj<-cf>?eD*`II%>V&*U*vPe-EYuD&=l2q{sPviD^>NNi- zCN1^7ZDFKpcl*vlj7x9QNX}xoMe=5MNWi1$?O}#>VU`^rJh}NB;+S8S&PRD6S-u^5 z!}M{3sB^_j^&fN%3_R?(CWosydO5hG zq>mZvL%;<`PX9it{9Z_@clr}dxV+b?Sf&2QGf1#^FT`123oFArqtxBr1;!|#RP$NlFO{Fh-B scp?4g1@o8v_nLpd*Z#5wfV?lZi~oWD19oqi^8f$< literal 0 HcmV?d00001 From 2838d292a00115c175101dc28180fcfb7f7fd7f6 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 14 Dec 2017 10:55:11 -0500 Subject: [PATCH 2/3] new test apk --- .../brut/apktool/issue1157/issue1157.apk | Bin 5323 -> 6636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk index 4c1e67202493b1675449053560b0110f140a9797..ae279f496036df4767777a96bba9d5cd155ec10e 100644 GIT binary patch delta 3937 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 From 895af9c97579cb7f81cf3d146def27d48c726583 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Thu, 14 Dec 2017 14:07:32 -0500 Subject: [PATCH 3/3] refactor test --- .../java/brut/androlib/MinifiedArscTest.java | 10 +++++----- .../brut/apktool/issue1157/issue1157.apk | Bin 6636 -> 8993 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java index 31c0fb5a..bae8dcc0 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/MinifiedArscTest.java @@ -46,6 +46,7 @@ public class MinifiedArscTest { // decode issue1157.apk ApkDecoder apkDecoder = new ApkDecoder(new ExtFile(sTmpDir, apk)); + apkDecoder.setForceDelete(true); apkDecoder.setOutDir(sDecodedDir); // this should not raise an exception: @@ -60,11 +61,10 @@ public class MinifiedArscTest { @Test public void checkIfMinifiedArscLayoutFileMatchesTest() throws IOException { String expected = TestUtils.replaceNewlines("\n" + - ""); + "\n" + + " \n" + + ""); byte[] encoded = Files.readAllBytes(Paths.get(sDecodedDir + File.separator + "res" + File.separator + "xml" + File.separator + "custom.xml")); String obtained = TestUtils.replaceNewlines(new String(encoded)); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/issue1157/issue1157.apk index ae279f496036df4767777a96bba9d5cd155ec10e..b5645a2e2b12e1f28ce8d377b44533377fb5db00 100644 GIT binary patch delta 3017 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