diff options
Diffstat (limited to 'baksmali/src/main/java/org/jf/baksmali/DumpCommand.java')
-rw-r--r-- | baksmali/src/main/java/org/jf/baksmali/DumpCommand.java | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java new file mode 100644 index 00000000..433be125 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java @@ -0,0 +1,106 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.raw.RawDexFile; +import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; +import org.jf.util.ConsoleUtil; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.*; +import java.util.List; + +@Parameters(commandDescription = "Prints an annotated hex dump for the given dex file") +@ExtendedParameters( + commandName = "dump", + commandAliases = "du") +public class DumpCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information for this command.") + private boolean help; + + public DumpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + try { + dump(dexFile, System.out); + } catch (IOException ex) { + System.err.println("There was an error while dumping the dex file"); + ex.printStackTrace(System.err); + } + } + + /** + * Writes an annotated hex dump of the given dex file to output. + * + * @param dexFile The dex file to dump + * @param output An OutputStream to write the annotated hex dump to. The caller is responsible for closing this + * when needed. + * + * @throws IOException + */ + public static void dump(@Nonnull DexBackedDexFile dexFile, @Nonnull OutputStream output) + throws IOException { + Writer writer = new BufferedWriter(new OutputStreamWriter(output)); + + int consoleWidth = ConsoleUtil.getConsoleWidth(); + if (consoleWidth <= 0) { + consoleWidth = 120; + } + + RawDexFile rawDexFile = new RawDexFile(dexFile.getOpcodes(), dexFile); + DexAnnotator annotator = new DexAnnotator(rawDexFile, consoleWidth); + annotator.writeAnnotations(writer); + } +} |