diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java index 76ce75fe..8e1f3900 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java @@ -248,7 +248,7 @@ public class MethodDefinition { return methodItems; } - if (baksmali.registerInfo != 0 || baksmali.deodex) { + if (baksmali.registerInfo != 0 || baksmali.deodex || baksmali.verify) { methodAnalyzer.analyze(); ValidationException validationException = methodAnalyzer.getValidationException(); @@ -256,6 +256,15 @@ public class MethodDefinition { methodItems.add(new CommentMethodItem(stg, String.format("ValidationException: %s" ,validationException.getMessage()), validationException.getCodeAddress(), Integer.MIN_VALUE)); + } else if (baksmali.verify) { + methodAnalyzer.verify(); + + validationException = methodAnalyzer.getValidationException(); + if (validationException != null) { + methodItems.add(new CommentMethodItem(stg, + String.format("ValidationException: %s" ,validationException.getMessage()), + validationException.getCodeAddress(), Integer.MIN_VALUE)); + } } } List instructions = methodAnalyzer.getInstructions(); diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/baksmali.java index 5f54f6b6..aa9447e1 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java +++ b/baksmali/src/main/java/org/jf/baksmali/baksmali.java @@ -46,13 +46,15 @@ public class baksmali { public static boolean outputDebugInfo = true; public static boolean addCodeOffsets = false; public static boolean deodex = false; + public static boolean verify = false; public static int registerInfo = 0; public static String bootClassPath; public static void disassembleDexFile(DexFile dexFile, boolean deodex, String outputDirectory, String[] classPathDirs, String bootClassPath, boolean noParameterRegisters, boolean useLocalsDirective, boolean useSequentialLabels, - boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo) + boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo, + boolean verify) { baksmali.noParameterRegisters = noParameterRegisters; baksmali.useLocalsDirective = useLocalsDirective; @@ -62,8 +64,9 @@ public class baksmali { baksmali.deodex = deodex; baksmali.registerInfo = registerInfo; baksmali.bootClassPath = bootClassPath; + baksmali.verify = verify; - if (registerInfo != 0 || deodex) { + if (registerInfo != 0 || deodex || verify) { try { ClassPath.InitializeClassPath(classPathDirs, bootClassPath==null?null:bootClassPath.split(":"), dexFile); } catch (Exception ex) { diff --git a/baksmali/src/main/java/org/jf/baksmali/main.java b/baksmali/src/main/java/org/jf/baksmali/main.java index c46eba89..21ec2585 100644 --- a/baksmali/src/main/java/org/jf/baksmali/main.java +++ b/baksmali/src/main/java/org/jf/baksmali/main.java @@ -102,6 +102,7 @@ public class main { boolean outputDebugInfo = true; boolean addCodeOffsets = false; boolean deodex = false; + boolean verify = false; int registerInfo = 0; @@ -216,6 +217,9 @@ public class main { case 'F': fixRegisters = true; break; + case 'V': + verify = true; + break; default: assert false; } @@ -262,7 +266,7 @@ public class main { baksmali.disassembleDexFile(dexFile, deodex, outputDirectory, bootClassPathDirsArray, bootClassPath, noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, addCodeOffsets, - registerInfo); + registerInfo, verify); } if ((doDump || write) && !dexFile.isOdex()) { @@ -417,6 +421,10 @@ public class main { .withDescription("add comments to the disassembly containing the code offset for each address") .create("f"); + Option verifyDexOption = OptionBuilder.withLongOpt("verify") + .withDescription("perform bytecode verification") + .create("V"); + basicOptions.addOption(versionOption); basicOptions.addOption(helpOption); basicOptions.addOption(outputDirOption); @@ -435,6 +443,7 @@ public class main { debugOptions.addOption(writeDexOption); debugOptions.addOption(sortOption); debugOptions.addOption(fixSignedRegisterOption); + debugOptions.addOption(verifyDexOption); for (Object option: basicOptions.getOptions()) {