From 89e6b065214d74dc892f66ddadf24f2bfdb4d38b Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 13 Sep 2014 11:50:19 -0500 Subject: [PATCH] Implement dex entry for non classes.dex files Conflicts: brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java --- .../main/java/org/jf/baksmali/baksmaliOptions.java | 1 + .../baksmali/src/main/java/org/jf/baksmali/main.java | 12 +++++++++++- .../src/main/java/org/jf/dexlib2/DexFileFactory.java | 8 ++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java index 4abe5a11..e62a20ba 100644 --- a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java +++ b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java @@ -56,6 +56,7 @@ public class baksmaliOptions { public int apiLevel = 15; public String outputDirectory = "out"; + public String dexEntry = "classes.dex"; public List bootClassPathDirs = Lists.newArrayList(); public List bootClassPathEntries = Lists.newArrayList(); diff --git a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/main.java b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/main.java index 7fe01b43..0d570b57 100644 --- a/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/main.java +++ b/brut.apktool.smali/baksmali/src/main/java/org/jf/baksmali/main.java @@ -208,6 +208,9 @@ public class main { case 't': options.useImplicitReferences = false; break; + case 'e': + options.dexEntry = commandLine.getOptionValue("e"); + break; case 'N': disassemble = false; break; @@ -251,7 +254,7 @@ public class main { } //Read in and parse the dex file - DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, options.apiLevel); + DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, options.dexEntry, options.apiLevel); if (dexFile.isOdexFile()) { if (!options.deodex) { @@ -450,6 +453,12 @@ public class main { .withArgName("FILE") .create("T"); + Option dexEntryOption = OptionBuilder.withLongOpt("dex-file") + .withDescription("looks for dex file named DEX_FILE, defaults to classes.dex") + .withArgName("DEX_FILE") + .hasArg() + .create("e"); + basicOptions.addOption(versionOption); basicOptions.addOption(helpOption); basicOptions.addOption(outputDirOption); @@ -467,6 +476,7 @@ public class main { basicOptions.addOption(jobsOption); basicOptions.addOption(resourceIdFilesOption); basicOptions.addOption(noImplicitReferencesOption); + basicOptions.addOption(dexEntryOption); debugOptions.addOption(dumpOption); debugOptions.addOption(ignoreErrorsOption); diff --git a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java index 8b2237be..d08da036 100644 --- a/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java +++ b/brut.apktool.smali/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java @@ -60,7 +60,7 @@ public final class DexFileFactory { } @Nonnull - public static DexBackedDexFile loadDexFile(File dexFile, String filename, @Nonnull Opcodes opcodes) throws IOException { + public static DexBackedDexFile loadDexFile(File dexFile, String dexEntry, @Nonnull Opcodes opcodes) throws IOException { ZipFile zipFile = null; boolean isZipFile = false; try { @@ -68,16 +68,16 @@ public final class DexFileFactory { // if we get here, it's safe to assume we have a zip file isZipFile = true; - ZipEntry zipEntry = zipFile.getEntry(filename); + ZipEntry zipEntry = zipFile.getEntry(dexEntry); if (zipEntry == null) { throw new NoClassesDexException("zip file %s does not contain a classes.dex file", dexFile.getName()); } long fileLength = zipEntry.getSize(); if (fileLength < 40) { throw new ExceptionWithContext( - "The " + filename + " file in %s is too small to be a valid dex file", dexFile.getName()); + "The " + dexEntry + " file in %s is too small to be a valid dex file", dexFile.getName()); } else if (fileLength > Integer.MAX_VALUE) { - throw new ExceptionWithContext("The " + filename + " file in %s is too large to read in", dexFile.getName()); + throw new ExceptionWithContext("The " + dexEntry + " file in %s is too large to read in", dexFile.getName()); } byte[] dexBytes = new byte[(int)fileLength]; ByteStreams.readFully(zipFile.getInputStream(zipEntry), dexBytes);