Commit aacb8329 authored by YASME-Tim's avatar YASME-Tim

Added option flag to make androidmanifest.xml decompiling optional.

parent ddab4c26
...@@ -47,6 +47,9 @@ public final class JadxCLIArgs implements IJadxArgs { ...@@ -47,6 +47,9 @@ public final class JadxCLIArgs implements IJadxArgs {
@Parameter(names = {"-h", "--help"}, description = "print this help", help = true) @Parameter(names = {"-h", "--help"}, description = "print this help", help = true)
protected boolean printHelp = false; 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<File> input = new ArrayList<File>(1); private final List<File> input = new ArrayList<File>(1);
private File outputDir; private File outputDir;
...@@ -165,6 +168,11 @@ public final class JadxCLIArgs implements IJadxArgs { ...@@ -165,6 +168,11 @@ public final class JadxCLIArgs implements IJadxArgs {
} }
@Override @Override
public boolean isXMLTest() {
return xmlTest;
}
@Override
public int getThreadsCount() { public int getThreadsCount() {
return threadsCount; return threadsCount;
} }
......
...@@ -38,4 +38,9 @@ public class DefaultJadxArgs implements IJadxArgs { ...@@ -38,4 +38,9 @@ public class DefaultJadxArgs implements IJadxArgs {
public boolean isVerbose() { public boolean isVerbose() {
return false; return false;
} }
@Override
public boolean isXMLTest() {
return false;
}
} }
...@@ -16,4 +16,6 @@ public interface IJadxArgs { ...@@ -16,4 +16,6 @@ public interface IJadxArgs {
boolean isShowInconsistentCode(); boolean isShowInconsistentCode();
boolean isVerbose(); boolean isVerbose();
boolean isXMLTest();
} }
...@@ -11,6 +11,7 @@ import jadx.core.utils.exceptions.DecodeException; ...@@ -11,6 +11,7 @@ import jadx.core.utils.exceptions.DecodeException;
import jadx.core.utils.exceptions.JadxException; import jadx.core.utils.exceptions.JadxException;
import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.core.utils.exceptions.JadxRuntimeException;
import jadx.core.utils.files.InputFile; import jadx.core.utils.files.InputFile;
import jadx.core.xmlgen.BinaryXMLParser;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -202,6 +203,16 @@ public final class JadxDecompiler { ...@@ -202,6 +203,16 @@ public final class JadxDecompiler {
reset(); reset();
root = new RootNode(); root = new RootNode();
LOG.info("loading ..."); 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); root.load(inputFiles);
} }
......
...@@ -74,6 +74,29 @@ public class InputFile { ...@@ -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 { private static Dex loadFromZip(File file) throws IOException {
ZipFile zf = new ZipFile(file); ZipFile zf = new ZipFile(file);
ZipEntry dex = zf.getEntry("classes.dex"); ZipEntry dex = zf.getEntry("classes.dex");
......
...@@ -76,7 +76,27 @@ public class BinaryXMLParser { ...@@ -76,7 +76,27 @@ public class BinaryXMLParser {
die("IAE"); 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("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
bytes = xmlfilebytes;
count=0;
styleMap = new HashMap<Integer, String>();
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() { public void parse() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment