From a9ce1cf3ecff57b00c14bf86b2c688823c918a05 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 3 Jul 2012 22:36:29 -0700 Subject: [PATCH] For unknown opcodes, mention the original opcode value in a comment --- .../Format/InstructionMethodItem.java | 6 +++ .../Code/Format/UnknownInstruction.java | 47 +++++++++++++++++++ .../jf/dexlib/Code/InstructionIterator.java | 7 +-- 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 dexlib/src/main/java/org/jf/dexlib/Code/Format/UnknownInstruction.java diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java index 5e0d2249..2b1e42e3 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java @@ -32,6 +32,7 @@ import org.jf.baksmali.Adaptors.MethodItem; import org.jf.baksmali.Adaptors.ReferenceFormatter; import org.jf.baksmali.Adaptors.RegisterFormatter; import org.jf.dexlib.Code.Format.Instruction20bc; +import org.jf.dexlib.Code.Format.UnknownInstruction; import org.jf.util.IndentingWriter; import org.jf.baksmali.Renderers.LongRenderer; import org.jf.dexlib.Code.*; @@ -64,6 +65,11 @@ public class InstructionMethodItem extends MethodItem { writeTargetLabel(writer); return true; case Format10x: + if (instruction instanceof UnknownInstruction) { + writer.write("#unknown opcode: 0x"); + writer.printUnsignedLongAsHex(((UnknownInstruction) instruction).getOriginalOpcode() & 0xFFFF); + writer.write('\n'); + } writeOpcode(writer); return true; case Format11n: diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Format/UnknownInstruction.java b/dexlib/src/main/java/org/jf/dexlib/Code/Format/UnknownInstruction.java new file mode 100644 index 00000000..8c8c1874 --- /dev/null +++ b/dexlib/src/main/java/org/jf/dexlib/Code/Format/UnknownInstruction.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012, 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.dexlib.Code.Format; + +import org.jf.dexlib.Code.Opcode; + +public class UnknownInstruction extends Instruction10x { + private short originalOpcode; + + public UnknownInstruction(short originalOpcode) { + super(Opcode.NOP); + this.originalOpcode = originalOpcode; + } + + public short getOriginalOpcode() { + return originalOpcode; + } +} diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/InstructionIterator.java b/dexlib/src/main/java/org/jf/dexlib/Code/InstructionIterator.java index b3193f31..142f5e27 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Code/InstructionIterator.java +++ b/dexlib/src/main/java/org/jf/dexlib/Code/InstructionIterator.java @@ -28,10 +28,7 @@ package org.jf.dexlib.Code; -import org.jf.dexlib.Code.Format.ArrayDataPseudoInstruction; -import org.jf.dexlib.Code.Format.Instruction10x; -import org.jf.dexlib.Code.Format.PackedSwitchDataPseudoInstruction; -import org.jf.dexlib.Code.Format.SparseSwitchDataPseudoInstruction; +import org.jf.dexlib.Code.Format.*; import org.jf.dexlib.DexFile; import org.jf.dexlib.Util.ExceptionWithContext; import org.jf.dexlib.Util.Hex; @@ -55,7 +52,7 @@ public class InstructionIterator { if (opcode == null) { System.err.println(String.format("unknown opcode encountered - %x. Treating as nop.", (opcodeValue & 0xFFFF))); - instruction = new Instruction10x(Opcode.NOP, insns, insnsPosition); + instruction = new UnknownInstruction(opcodeValue); } else { if (opcode == Opcode.NOP) { byte secondByte = insns[insnsPosition + 1];