diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index bc960c8a4..662454ccc 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -47,6 +47,9 @@ public final class JadxCLIArgs implements IJadxArgs { @Parameter(names = {"-h", "--help"}, description = "print this help", help = true) protected boolean printHelp = false; + @Parameter(names = {"-x", "--xml"}, description = "try to decode the AndroidManifest.xml, save at current dir") + protected boolean xmlTest = false; + private final List input = new ArrayList(1); private File outputDir; @@ -164,6 +167,11 @@ public final class JadxCLIArgs implements IJadxArgs { return printHelp; } + @Override + public boolean isXMLTest() { + return xmlTest; + } + @Override public int getThreadsCount() { return threadsCount; diff --git a/jadx-core/src/main/java/jadx/api/DefaultJadxArgs.java b/jadx-core/src/main/java/jadx/api/DefaultJadxArgs.java index 302c59f54..66bcdfd0e 100644 --- a/jadx-core/src/main/java/jadx/api/DefaultJadxArgs.java +++ b/jadx-core/src/main/java/jadx/api/DefaultJadxArgs.java @@ -38,4 +38,9 @@ public class DefaultJadxArgs implements IJadxArgs { public boolean isVerbose() { return false; } + + @Override + public boolean isXMLTest() { + return false; + } } diff --git a/jadx-core/src/main/java/jadx/api/IJadxArgs.java b/jadx-core/src/main/java/jadx/api/IJadxArgs.java index 4aa8aeca7..32ea4fd6e 100644 --- a/jadx-core/src/main/java/jadx/api/IJadxArgs.java +++ b/jadx-core/src/main/java/jadx/api/IJadxArgs.java @@ -16,4 +16,6 @@ public interface IJadxArgs { boolean isShowInconsistentCode(); boolean isVerbose(); + + boolean isXMLTest(); } diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index ea8cd446d..539c5d942 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -11,6 +11,7 @@ import jadx.core.utils.exceptions.DecodeException; import jadx.core.utils.exceptions.JadxException; import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.core.utils.files.InputFile; +import jadx.core.xmlgen.BinaryXMLParser; import java.io.File; import java.io.IOException; @@ -202,6 +203,16 @@ public final class JadxDecompiler { reset(); root = new RootNode(); LOG.info("loading ..."); + if(this.args.isXMLTest()) { + InputFile inf = inputFiles.get(0); + try { + BinaryXMLParser bxp = new BinaryXMLParser(InputFile.loadXMLBuffer(inf.getFile()), "./AndroidManifest.xml"); + //BinaryXMLParser bxp = new BinaryXMLParser(InputFile.loadXMLBuffer(inf.getFile()), "AndroidManifest.xml"); + bxp.parse(); + } catch(IOException ioe) { + LOG.info("Decompiling AndroidManifest.xml failed!"); + } + } root.load(inputFiles); } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java index 2bf548abe..7b62a1883 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/InputFile.java @@ -74,6 +74,29 @@ public class InputFile { } } + public static byte[] loadXMLBuffer(File file) throws IOException { // FIXME: Public.. Please fix + ZipFile zf = new ZipFile(file); + ZipEntry xml = zf.getEntry("AndroidManifest.xml"); + if(null == xml) { + zf.close(); + return null; + } + ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); + InputStream in = null; + try { + in = zf.getInputStream(xml); + byte[] buffer = new byte[(int) xml.getSize()]; // FIXME: long->int conversion loss + int count; + while ((count = in.read(buffer)) != -1) { + bytesOut.write(buffer, 0, count); + } + } finally { + if(null != in) in.close(); + zf.close(); + } + return bytesOut.toByteArray(); + } + private static Dex loadFromZip(File file) throws IOException { ZipFile zf = new ZipFile(file); ZipEntry dex = zf.getEntry("classes.dex"); 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 b043469e3..4c43406ee 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/BinaryXMLParser.java @@ -76,7 +76,27 @@ public class BinaryXMLParser { die("IAE"); } } - + } + + public BinaryXMLParser(byte[] xmlfilebytes, String xmloutfilepath) { + System.out.println("XMLOUTFILEPATH: " + xmloutfilepath); + try { + writer = new PrintWriter(xmloutfilepath,"UTF-8"); + } catch(FileNotFoundException fnfe) { die("FNFE"); } + catch(UnsupportedEncodingException uee) { die("UEE"); } + if(null==writer) die("null==writer"); + writer.println(""); + bytes = xmlfilebytes; + count=0; + styleMap = new HashMap(); + if(null==styleMap) die("null==styleMap"); + for(Field f : android.R.style.class.getFields()) { + try { + styleMap.put(f.getInt(f.getType()),f.getName()); + } catch(IllegalAccessException iae) { + die("IAE"); + } + } } public void parse() {