OSDN Git Service

initial version (daily commit), not work yet
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 27 Nov 2008 09:54:00 +0000 (09:54 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Thu, 27 Nov 2008 09:54:00 +0000 (09:54 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk@323 acee48c3-7b26-0410-bdac-b3d0e5314bbc

wsp/pom.xml [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/LabelOpcode.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/Opcode.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionFinishListener.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionMethodVisitor.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeManager.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparator.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkExtractor.java [new file with mode: 0644]
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkService.java [new file with mode: 0644]
wsp/src/main/resources/META-INF/bytecode.def [new file with mode: 0644]

diff --git a/wsp/pom.xml b/wsp/pom.xml
new file mode 100644 (file)
index 0000000..48846ee
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?><project>
+  <parent>
+    <artifactId>plugins</artifactId>
+    <groupId>jp.sourceforge.stigmata</groupId>
+    <version>1.0</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>jp.sourceforge.stigmata.plugins</groupId>
+  <artifactId>wsp</artifactId>
+  <name>wsp</name>
+  <version>1.0.0-SNAPSHOT</version>
+  <url>http://maven.apache.org</url>
+
+  <dependencies>
+    <dependency>
+      <groupId>jp.sourceforge</groupId>
+      <artifactId>stigmata</artifactId>
+      <version>2.0.0-SNAPSHOT</version>
+      <scope>compile</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/LabelOpcode.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/LabelOpcode.java
new file mode 100644 (file)
index 0000000..8eecb4b
--- /dev/null
@@ -0,0 +1,27 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import org.objectweb.asm.Label;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class LabelOpcode extends Opcode{
+    private static final long serialVersionUID = -346783431316464L;
+
+    private Label label;
+
+    public LabelOpcode(Label label){
+        super(-1, "targeter", 0, 0, Category.TARGETER);
+        this.label = label;
+    }
+
+    public Label getLabel(){
+        return label;
+    }
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/Opcode.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/Opcode.java
new file mode 100644 (file)
index 0000000..d167fb4
--- /dev/null
@@ -0,0 +1,95 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.objectweb.asm.Label;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class Opcode implements Serializable{
+    private static final long serialVersionUID = -2349834745416345564L;
+
+    public static enum Category{
+        NORMAL, BRANCH, OBJECT, INVOKE, TARGETER,
+    };
+    private int opcode;
+    private String name;
+    private int argumentCount;
+    private int act;
+    private Category category;
+    private List<Label> labels = new ArrayList<Label>();
+
+    public Opcode(Opcode opcode){
+        this(opcode.getOpcode(), opcode.getName(), opcode.getArgumentCount(), opcode.getAct(), opcode.getCategory());
+    }
+
+    public Opcode(int opcode, String name, int argumentCount, int act, String category){
+        this(opcode, name, argumentCount, act, Category.valueOf(category));
+    }
+
+    public Opcode(int opcode, String name, int argumentCount, int act, Category category){
+        this.opcode = opcode;
+        this.name = name;
+        this.argumentCount = argumentCount;
+        this.act = act;
+        this.category = category;
+    }
+
+    public int getOpcode(){
+        return opcode;
+    }
+
+    public String getName(){
+        return name;
+    }
+
+    public int getArgumentCount(){
+        return argumentCount;
+    }
+
+    public void addLabel(Label label){
+        if(category != Category.BRANCH){
+            throw new IllegalStateException("this method allows only branch category");
+        }
+        labels.add(label);
+    }
+
+    public void setLabels(Label[] labelArray){
+        if(category != Category.BRANCH){
+            throw new IllegalStateException("this method allows only branch category");
+        }
+        for(Label label: labelArray){
+            labels.add(label);
+        }
+    }
+
+    public Iterator<Label> labels(){
+        return Collections.unmodifiableList(labels).iterator();
+    }
+
+    public void setAct(int act){
+        if(category != Category.OBJECT && category != Category.INVOKE){
+            throw new IllegalStateException("setAct can be called only object and invoke category.");
+        }
+        this.act = act;
+    }
+
+    public int getAct(){
+        return act;
+    }
+
+    public Category getCategory(){
+        return category;
+    }
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionFinishListener.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionFinishListener.java
new file mode 100644 (file)
index 0000000..459d422
--- /dev/null
@@ -0,0 +1,7 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+import java.util.List;
+
+public interface OpcodeExtractionFinishListener{
+    public void finishExtractionOpcodes(List<Opcode> opcodes);
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionMethodVisitor.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeExtractionMethodVisitor.java
new file mode 100644 (file)
index 0000000..02daaa1
--- /dev/null
@@ -0,0 +1,171 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+/**
+ * 
+ * @author Haruaki TAMADA
+ * @version $Revision$ 
+ */
+public class OpcodeExtractionMethodVisitor extends MethodAdapter{
+    private List<Opcode> opcodes;
+    private OpcodeManager manager = OpcodeManager.getInstance();
+    private List<OpcodeExtractionFinishListener> listeners = new ArrayList<OpcodeExtractionFinishListener>();
+
+    public OpcodeExtractionMethodVisitor(MethodVisitor visitor){
+        this(visitor, new ArrayList<Opcode>());
+    }
+
+    public OpcodeExtractionMethodVisitor(MethodVisitor visitor, List<Opcode> opcodes){
+        super(visitor);
+        this.opcodes = opcodes;
+    }
+
+    public void addOpcodeExtractionFinishListener(OpcodeExtractionFinishListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeOpcodeExtractionFinishListener(OpcodeExtractionFinishListener listener){
+        listeners.add(listener);
+    }
+
+    @Override
+    public void visitFieldInsn(int opcode, String owner, String name, String desc){
+        Opcode field = manager.getOpcode(opcode);
+        Opcode o = new Opcode(field);
+        int size = Type.getType(desc).getSize();
+        switch(opcode){
+        case Opcodes.PUTFIELD:
+            size = -1 - size;
+            break;
+        case Opcodes.PUTSTATIC:
+            size = 0 - size;
+            break;
+        case Opcodes.GETFIELD:
+            size = -1 + size;
+            break;
+        case Opcodes.GETSTATIC:
+            size = 0 + size;
+            break;
+        }
+        o.setAct(size);
+        opcodes.add(o);
+        super.visitFieldInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitIincInsn(int var, int increment){
+        opcodes.add(manager.getOpcode(Opcodes.IINC));
+        super.visitIincInsn(var, increment);
+    }
+
+    @Override
+    public void visitInsn(int opcode){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitInsn(opcode);
+    }
+
+    @Override
+    public void visitLabel(Label label){
+        opcodes.add(new LabelOpcode(label));
+    }
+
+    @Override
+    public void visitIntInsn(int opcode, int operand){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitIntInsn(opcode, operand);
+    }
+
+    @Override
+    public void visitJumpInsn(int opcode, Label label){
+        Opcode o = manager.getOpcode(opcode);
+        o.addLabel(label);
+        opcodes.add(o);
+        super.visitJumpInsn(opcode, label);
+    }
+
+    @Override
+    public void visitLdcInsn(Object value){
+        opcodes.add(manager.getOpcode(Opcodes.LDC));
+        super.visitLdcInsn(value);
+    }
+
+    @Override
+    public void visitTableSwitchInsn(int min, int max, Label defaultLabel, Label[] labels){
+        Opcode tableSwitch = new Opcode(manager.getOpcode(Opcodes.TABLESWITCH));
+        tableSwitch.setLabels(labels);
+        tableSwitch.addLabel(defaultLabel);
+
+        opcodes.add(tableSwitch);
+        super.visitTableSwitchInsn(min, max, defaultLabel, labels);
+    }
+
+    @Override
+    public void visitLookupSwitchInsn(Label defaultHandle, int[] keys, Label[] labels){
+        Opcode lookupSwitch = new Opcode(manager.getOpcode(Opcodes.LOOKUPSWITCH));
+        lookupSwitch.setLabels(labels);
+        lookupSwitch.addLabel(defaultHandle);
+        
+        opcodes.add(lookupSwitch);
+        super.visitLookupSwitchInsn(defaultHandle, keys, labels);
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String desc){
+        Opcode methodOpcode = new Opcode(manager.getOpcode(opcode));
+        Type[] types = Type.getArgumentTypes(desc);
+        int argumentSize = 0;
+        for(Type type: types) argumentSize = type.getSize();
+        int size = Type.getReturnType(desc).getSize();
+        switch(opcode){
+        case Opcodes.INVOKESTATIC:
+            size = size - argumentSize;
+            break;
+        case Opcodes.INVOKEINTERFACE:
+        case Opcodes.INVOKESPECIAL:
+        case Opcodes.INVOKEVIRTUAL:
+            size = size - argumentSize - 1;
+            break;
+        }
+        methodOpcode.setAct(size);
+
+        opcodes.add(methodOpcode);
+        super.visitMethodInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitMultiANewArrayInsn(String desc, int dims){
+        opcodes.add(manager.getOpcode(Opcodes.MULTIANEWARRAY));
+        super.visitMultiANewArrayInsn(desc, dims);
+    }
+
+    @Override
+    public void visitTypeInsn(int opcode, String desc){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitTypeInsn(opcode, desc);
+    }
+
+    @Override
+    public void visitVarInsn(int opcode, int var){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitVarInsn(opcode, var);
+    }
+
+    @Override
+    public void visitEnd(){
+        for(OpcodeExtractionFinishListener listener: listeners){
+            listener.finishExtractionOpcodes(opcodes);
+        }
+    }
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeManager.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/OpcodeManager.java
new file mode 100644 (file)
index 0000000..3c79490
--- /dev/null
@@ -0,0 +1,61 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import jp.sourceforge.talisman.csvio.CsvLine;
+import jp.sourceforge.talisman.csvio.CsvParser;
+
+/** 
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class OpcodeManager{
+    private static final Map<Integer, Opcode> OPCODE_MAP = new HashMap<Integer, Opcode>();
+    private static OpcodeManager manager = new OpcodeManager();
+
+    static{
+        try{
+            URL location = StackPatternBasedBirthmarkExtractor.class.getResource("/META-INF/bytecode.def");
+            BufferedReader in = new BufferedReader(new InputStreamReader(location.openStream()));
+            CsvParser parser = new CsvParser(in);
+            while(parser.hasNext()){
+                CsvLine line = parser.next();
+                String[] values = line.getValues();
+                if(values.length == 5){
+                    Opcode def = new Opcode(
+                        Integer.parseInt(values[0]), values[1],
+                        Integer.parseInt(values[2]),
+                        Integer.parseInt(values[3]), values[4]
+                    );
+                    OPCODE_MAP.put(def.getOpcode(), def);
+                }
+            }
+        } catch(IOException e){
+            throw new InternalError(e.getMessage());
+        }
+    }
+
+    /**
+     * private constructor for singleton pattern.
+     */
+    private OpcodeManager(){
+    }
+
+    public static OpcodeManager getInstance(){
+        return manager;
+    }
+
+    public Opcode getOpcode(int opcode){
+        return OPCODE_MAP.get(opcode);
+    }
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparator.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparator.java
new file mode 100644 (file)
index 0000000..a01a493
--- /dev/null
@@ -0,0 +1,27 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.birthmarks.comparators.AbstractBirthmarkComparator;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class StackPatternBasedBirthmarkComparator extends AbstractBirthmarkComparator{
+    public StackPatternBasedBirthmarkComparator(BirthmarkSpi spi){
+        super(spi);
+    }
+
+    @Override
+    public double compare(Birthmark b1, Birthmark b2){
+        // TODO implement this method.
+        return 0;
+    }
+
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkExtractor.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkExtractor.java
new file mode 100644 (file)
index 0000000..8cb1f43
--- /dev/null
@@ -0,0 +1,104 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkElement;
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.stigmata.ExtractionUnit;
+import jp.sourceforge.stigmata.birthmarks.ASMBirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
+import jp.sourceforge.stigmata.spi.BirthmarkSpi;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class StackPatternBasedBirthmarkExtractor extends ASMBirthmarkExtractor{
+
+    @Override
+    public BirthmarkExtractVisitor createExtractVisitor(ClassWriter writer, Birthmark birthmark, BirthmarkEnvironment environment){
+        return new Visitor(writer, birthmark, environment);
+    }
+
+    public StackPatternBasedBirthmarkExtractor(BirthmarkSpi service){
+        super(service);
+    }
+
+    @Override
+    public ExtractionUnit[] getAcceptableUnits(){
+        return new ExtractionUnit[] {
+            ExtractionUnit.ARCHIVE, ExtractionUnit.PACKAGE, ExtractionUnit.CLASS,
+        };
+    }
+
+    private BirthmarkElement[] buildElement(List<Opcode> opcodes){
+        List<BirthmarkElement> elements = new ArrayList<BirthmarkElement>();
+        Map<Label, Integer> tableMap = new HashMap<Label, Integer>();
+
+        int currentDepth = 0;
+        for(Opcode opcode: opcodes){
+            Integer forwardedStatus = null;
+            if(opcode.getCategory() != Opcode.Category.TARGETER){
+                forwardedStatus = tableMap.get(((LabelOpcode)opcode).getLabel());
+            }
+            if(forwardedStatus == null){
+                currentDepth += opcode.getAct();
+            }
+            else{
+                currentDepth = forwardedStatus + opcode.getAct(); 
+            }
+            if(opcode.getCategory() == Opcode.Category.BRANCH){
+                for(Iterator<Label> i = opcode.labels(); i.hasNext(); ){
+                    Label label = i.next();
+                    tableMap.put(label, currentDepth);
+                }
+            }
+        }
+
+        return elements.toArray(new BirthmarkElement[elements.size()]);
+    }
+
+    private class Visitor extends BirthmarkExtractVisitor{
+        public Visitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkEnvironment environment){
+            super(visitor, birthmark, environment);
+        }
+
+        public void visitEnd(){
+        }
+
+        @Override
+        public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){
+            MethodVisitor visitor = super.visitMethod(arg0, arg1, arg2, arg3, arg4);
+            OpcodeExtractionMethodVisitor opcodeVisitor = new OpcodeExtractionMethodVisitor(visitor);
+            opcodeVisitor.addOpcodeExtractionFinishListener(new OpcodeExtractionFinishListener(){
+                @Override
+                public void finishExtractionOpcodes(List<Opcode> opcodes){
+                    BirthmarkElement[] elements = buildElement(opcodes);
+
+                    for(BirthmarkElement be: elements){
+                        addElement(be);
+                    }
+                }
+            });
+
+            return opcodeVisitor;
+        }
+    };
+
+
+}
diff --git a/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkService.java b/wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkService.java
new file mode 100644 (file)
index 0000000..8d557c0
--- /dev/null
@@ -0,0 +1,52 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import jp.sourceforge.stigmata.BirthmarkComparator;
+import jp.sourceforge.stigmata.BirthmarkExtractor;
+import jp.sourceforge.stigmata.birthmarks.AbstractBirthmarkService;
+
+/**
+ * Weighted Stack Pattern based birthmark.
+ * 
+ * this birthmark is proposed by LIM et al. in following papers.
+ * <ul>
+ * <li>Hyun-il Lim, Heewan Park, Seokwoo Choi, Taisook Han, ``Detecting Theft
+ * of Java Applications via a Static Birthmark Based on Weighted Stack
+ * Patterns,'' IEICE Transactions on Information and Systems, Vol.E91-D No.9
+ * pp.2323-2332, September 2008.</li>
+ * <li>Heewan Park, Hyun-il Lim, Seokwoo Choi and Taisook Han, ``A Static Java
+ * Birthmark Based on Operand Stack Behaviors,'' In Proc. of 2008 International
+ * Conference on Information Security and Assurance, pp.133-136, April 2008.</li>
+ * </ul>
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class StackPatternBasedBirthmarkService extends AbstractBirthmarkService{
+    private BirthmarkComparator comparator = new StackPatternBasedBirthmarkComparator(this);
+    private BirthmarkExtractor extractor = new StackPatternBasedBirthmarkExtractor(this);
+
+    @Override
+    public String getDefaultDescription(){
+        return "Weighted stack pattern based birthmark";
+    }
+
+    @Override
+    public String getType(){
+        return "wsp";
+    }
+
+    @Override
+    public BirthmarkComparator getComparator(){
+        return comparator;
+    }
+
+    @Override
+    public BirthmarkExtractor getExtractor(){
+        return extractor;
+    }
+
+}
diff --git a/wsp/src/main/resources/META-INF/bytecode.def b/wsp/src/main/resources/META-INF/bytecode.def
new file mode 100644 (file)
index 0000000..a617e97
--- /dev/null
@@ -0,0 +1,256 @@
+0,nop,0,0,NORMAL\r
+1,aconst_null,0,1,NORMAL\r
+2,iconst_m1,0,1,NORMAL\r
+3,iconst_0,0,1,NORMAL\r
+4,iconst_1,0,1,NORMAL\r
+5,iconst_2,0,1,NORMAL\r
+6,iconst_3,0,1,NORMAL\r
+7,iconst_4,0,1,NORMAL\r
+8,iconst_5,0,1,NORMAL\r
+9,lconst_0,0,2,NORMAL\r
+10,lconst_1,0,2,NORMAL\r
+11,fconst_0,0,1,NORMAL\r
+12,fconst_1,0,1,NORMAL\r
+13,fconst_2,0,1,NORMAL\r
+14,dconst_0,0,2,NORMAL\r
+15,dconst_1,0,2,NORMAL\r
+16,bipush,1,1,NORMAL\r
+17,sipush,2,1,NORMAL\r
+17,ldc,1,1,NORMAL\r
+19,ldc_w,2,1,NORMAL\r
+20,ldc2_w,2,2,NORMAL\r
+21,iload,1,1,NORMAL\r
+22,lload,1,2,NORMAL\r
+23,fload,1,1,NORMAL\r
+24,dload,1,2,NORMAL\r
+25,aload,1,1,NORMAL\r
+26,iload_0,0,1,NORMAL\r
+27,iload_1,0,1,NORMAL\r
+28,iload_2,0,1,NORMAL\r
+29,iload_3,0,1,NORMAL\r
+30,lload_0,0,2,NORMAL\r
+31,lload_1,0,2,NORMAL\r
+32,lload_2,0,2,NORMAL\r
+33,lload_3,0,2,NORMAL\r
+34,fload_0,0,1,NORMAL\r
+35,fload_1,0,1,NORMAL\r
+36,fload_2,0,1,NORMAL\r
+37,fload_3,0,1,NORMAL\r
+38,dload_0,0,2,NORMAL\r
+39,dload_1,0,2,NORMAL\r
+40,dload_2,0,2,NORMAL\r
+41,dload_3,0,2,NORMAL\r
+42,aload_0,0,1,NORMAL\r
+43,aload_1,0,1,NORMAL\r
+44,aload_2,0,1,NORMAL\r
+45,aload_3,0,1,NORMAL\r
+46,iaload,0,-1,NORMAL\r
+47,laload,0,0,NORMAL\r
+48,faload,0,-1,NORMAL\r
+49,daload,0,0,NORMAL\r
+50,aaload,0,-1,NORMAL\r
+51,baload,0,-1,NORMAL\r
+52,caload,0,-1,NORMAL\r
+53,saload,0,-1,NORMAL\r
+54,istore,1,-1,NORMAL\r
+55,lstore,1,-2,NORMAL\r
+56,fstore,1,-1,NORMAL\r
+57,dstore,1,-2,NORMAL\r
+58,astore,1,-1,NORMAL\r
+59,istore_0,0,-1,NORMAL\r
+60,istore_1,0,-1,NORMAL\r
+61,istore_2,0,-1,NORMAL\r
+62,istore_3,0,-1,NORMAL\r
+63,lstore_0,0,-2,NORMAL\r
+64,lstore_1,0,-2,NORMAL\r
+65,lstore_2,0,-2,NORMAL\r
+66,lstore_3,0,-2,NORMAL\r
+67,fstore_0,0,-1,NORMAL\r
+68,fstore_1,0,-1,NORMAL\r
+69,fstore_2,0,-1,NORMAL\r
+70,fstore_3,0,-1,NORMAL\r
+71,dstore_0,0,-2,NORMAL\r
+72,dstore_1,0,-2,NORMAL\r
+73,dstore_2,0,-2,NORMAL\r
+74,dstore_3,0,-2,NORMAL\r
+75,astore_0,0,-1,NORMAL\r
+76,astore_1,0,-1,NORMAL\r
+77,astore_2,0,-1,NORMAL\r
+78,astore_3,0,-1,NORMAL\r
+79,iastore,0,-3,NORMAL\r
+80,lastore,0,-3,NORMAL\r
+81,fastore,0,-3,NORMAL\r
+82,dastore,0,-3,NORMAL\r
+83,aastore,0,-3,NORMAL\r
+84,bastore,0,-3,NORMAL\r
+85,castore,0,-3,NORMAL\r
+86,sastore,0,-3,NORMAL\r
+87,pop,0,-1,NORMAL\r
+88,pop2,0,-2,NORMAL\r
+89,dup,0,1,NORMAL\r
+90,dup_x1,0,1,NORMAL\r
+91,dup_x2,0,1,NORMAL\r
+92,dup2,0,2,NORMAL\r
+93,dup2_x1,0,2,NORMAL\r
+94,dup2_x2,0,2,NORMAL\r
+95,swap,0,0,NORMAL\r
+96,iadd,0,-1,NORMAL\r
+97,ladd,0,-2,NORMAL\r
+98,fadd,0,-1,NORMAL\r
+99,dadd,0,-2,NORMAL\r
+100,isub,0,-1,NORMAL\r
+101,lsub,0,-2,NORMAL\r
+102,fsub,0,-1,NORMAL\r
+103,dsub,0,-2,NORMAL\r
+104,imul,0,-1,NORMAL\r
+105,lmul,0,-2,NORMAL\r
+106,fmul,0,-1,NORMAL\r
+107,dmul,0,-2,NORMAL\r
+108,idiv,0,-1,NORMAL\r
+109,ldiv,0,-2,NORMAL\r
+110,fdiv,0,-1,NORMAL\r
+111,ddiv,0,-2,NORMAL\r
+112,irem,0,-1,NORMAL\r
+113,lrem,0,-2,NORMAL\r
+114,frem,0,-1,NORMAL\r
+115,drem,0,-2,NORMAL\r
+116,ineg,0,0,NORMAL\r
+117,lneg,0,0,NORMAL\r
+118,fneg,0,0,NORMAL\r
+119,dneg,0,0,NORMAL\r
+120,ishl,0,-1,NORMAL\r
+121,lshl,0,-1,NORMAL\r
+122,ishr,0,-1,NORMAL\r
+123,lshr,0,-1,NORMAL\r
+124,iushr,0,-1,NORMAL\r
+125,lushr,0,-2,NORMAL\r
+126,iand,0,-1,NORMAL\r
+127,land,0,-2,NORMAL\r
+128,ior,0,-1,NORMAL\r
+129,lor,0,-2,NORMAL\r
+130,ixor,0,-1,NORMAL\r
+131,lxor,0,-2,NORMAL\r
+132,iinc,2,0,NORMAL\r
+133,i2l,0,1,NORMAL\r
+134,i2f,0,0,NORMAL\r
+135,i2d,0,1,NORMAL\r
+136,l2i,0,-1,NORMAL\r
+137,l2f,0,-1,NORMAL\r
+138,l2d,0,0,NORMAL\r
+139,f2i,0,0,NORMAL\r
+140,f2l,0,1,NORMAL\r
+141,f2d,0,1,NORMAL\r
+142,d2i,0,-1,NORMAL\r
+143,d2l,0,0,NORMAL\r
+144,d2f,0,-1,NORMAL\r
+145,i2b,0,0,NORMAL\r
+146,i2c,0,0,NORMAL\r
+147,i2s,0,0,NORMAL\r
+148,lcmp,0,-3,NORMAL\r
+149,fcmpl,0,-1,NORMAL\r
+150,fcmpg,0,-1,NORMAL\r
+151,dcmpl,0,-3,NORMAL\r
+152,dcmpg,0,-3,NORMAL\r
+153,ifeq,2,-1,BRANCH\r
+154,ifne,2,-1,BRANCH\r
+155,iflt,2,-1,BRANCH\r
+156,ifge,2,-1,BRANCH\r
+157,ifgt,2,-1,BRANCH\r
+158,ifle,2,-1,BRANCH\r
+159,if_icmpeq,2,-2,BRANCH\r
+160,if_icmpne,2,-2,BRANCH\r
+161,if_icmplt,2,-2,BRANCH\r
+162,if_icmpge,2,-2,BRANCH\r
+163,if_icmpgt,2,-2,BRANCH\r
+164,if_icmple,2,-2,BRANCH\r
+165,if_acmpeq,2,-2,BRANCH\r
+166,if_acmpne,2,-2,BRANCH\r
+167,goto,2,-1,BRANCH\r
+168,jsr,2,-1,BRANCH\r
+169,ret,1,0,NORMAL\r
+170,tableswitch,-1,-1,BRANCH\r
+171,lookupswitch,-1,-1,BRANCH\r
+172,ireturn,0,-1,NORMAL\r
+173,lreturn,0,-2,NORMAL\r
+174,freturn,0,-1,NORMAL\r
+175,dreturn,0,-2,NORMAL\r
+176,areturn,0,-1,NORMAL\r
+177,return,0,0,NORMAL\r
+178,getstatic,2,0,OBJECT\r
+179,putstatic,2,0,OBJECT\r
+180,getfield,2,0,OBJECT\r
+181,putfield,2,0,OBJECT\r
+182,invokevirtual,2,0,INVOKE\r
+183,invokespecial,2,0,INVOKE\r
+184,invokestatic,2,0,INVOKE\r
+185,invokeinterface,2,0,INVOKE\r
+186,__unused,0\r
+187,new,2,1,NORMAL\r
+188,newarray,1,0,NORMAL\r
+189,anewarray,2,0,NORMAL\r
+190,arraylength,0,0,NORMAL\r
+191,athrow,0,-1,NORMAL\r
+192,checkcast,2,0,NORMAL\r
+193,instanceof,2,0,NORMAL\r
+194,monitorenter,0,-1,NORMAL\r
+195,monitorexit,0,-1,NORMAL\r
+196,wide,-1,0,NORMAL\r
+197,multianewarray,3,-1,NORMAL\r
+198,ifnull,2,-1,BRANCH\r
+199,ifnonnull,2,-1,BRANCH\r
+200,goto_w,4,-1,BRANCH\r
+201,jsr_w,4,-1,BRANCH\r
+202,breakpoint,0\r
+203,ldc_quick,1\r
+204,__unused,0\r
+205,ldc2_w_quick,2\r
+206,getfield_quick,2\r
+207,putfield_quick,2\r
+208,getfield2_quick,2\r
+209,putfield2_quick,2\r
+210,__unused,0\r
+211,putstatic_quick,2\r
+212,getstatic2_quick,2\r
+213,putstatic2_quick,2\r
+214,invokevirtual_quick,2\r
+215,invokenonvirtual_quick,2\r
+216,invokesuper_quick,2\r
+217,invokestatic_quick,2\r
+218,invokeinterface_quick,2\r
+219,invokevirtualobject_quick,2\r
+220,__unused,0\r
+221,new_quick,2\r
+222,anewarray_quick,2\r
+223,multianewarray_quick,3\r
+224,checkcast_quick,2\r
+225,instanceof_quick,2\r
+226,invokevirtual_quick_w,4\r
+227,getfield_quick_w,4\r
+228,putfield_quick_w,4\r
+229,__unused,0\r
+230,__unused,0\r
+231,__unused,0\r
+232,__unused,0\r
+233,__unused,0\r
+234,__unused,0\r
+235,__unused,0\r
+236,__unused,0\r
+237,__unused,0\r
+238,__unused,0\r
+239,__unused,0\r
+240,__unused,0\r
+241,__unused,0\r
+242,__unused,0\r
+243,__unused,0\r
+244,__unused,0\r
+245,__unused,0\r
+246,__unused,0\r
+247,__unused,0\r
+248,__unused,0\r
+249,__unused,0\r
+250,__unused,0\r
+251,__unused,0\r
+252,__unused,0\r
+253,__unused,0\r
+254,impdep1,0\r
+255,impdep2,0\r