public InvokeInterfaceOpcode(StreamNavigator sn)
     : base(sn)
 {
     _args   = sn.GetByte();
     _index  = sn.GetUshort();
     _method = sn.GetByte();
 }
Example #2
0
        static void Main(string[] args)
        {
            using (var arch = ZipFile.OpenRead(args[0]))
            {
                DescriptorComponent desc    = null;
                MethodComponent     methods = null;

                var methodCap = arch.Entries.Where(v => v.Name.ToLower() == "method.cap").SingleOrDefault();
                using (BinaryReader rd = new BinaryReader(methodCap.Open()))
                {
                    StreamNavigator sn = new StreamNavigator(rd.ReadBytes((int)rd.BaseStream.Length), 0);
                    methods = MethodComponent.Factory(sn);
                }

                var descriptorCap = arch.Entries.Where(v => v.Name.ToLower() == "descriptor.cap").SingleOrDefault();
                using (BinaryReader rd = new BinaryReader(descriptorCap.Open()))
                {
                    StreamNavigator sn = new StreamNavigator(rd.ReadBytes((int)rd.BaseStream.Length), 0);
                    desc = DescriptorComponent.Factory(sn, methods);
                }

                using (TextWriter wr = new StreamWriter(File.Create(args[0] + ".txt")))
                {
                    TextDump dump = new TextDump(wr);
                    desc.Dump(dump, 0);
                    wr.Flush();
                }
            }
        }
Example #3
0
 public void Decode(StreamNavigator sn)
 {
     _opcodes = new List <IOpcode>();
     while (!sn.EoB)
     {
         _opcodes.Add(DecodeInsAndAdvance(sn));
     }
 }
Example #4
0
        public static MethodHeaderInfo Factory(StreamNavigator sn)
        {
            MethodHeaderInfo mhi = new MethodHeaderInfo();

            mhi._bitfield  = sn.GetByte();
            mhi._bitfield2 = sn.GetByte();
            return(mhi);
        }
Example #5
0
        public static MethodHeaderInfo Factory(StreamNavigator sn)
        {
            byte flags = sn.PeakByte();

            return(((flags & 0x80) != 0)
                ? ExtendedMethodHeaderInfo.Factory(sn)
                : MethodHeaderInfo.Factory(sn));
        }
Example #6
0
 public MethodDescriptor(MethodDescriptorInfo mdi, MethodComponent methods)
 {
     this.MethodDescriptorInfo = mdi;
     if (null != methods)
     {
         StreamNavigator sn = new StreamNavigator(methods.Methods, mdi.method_offset - 1);
         this.MethodInfo = MethodInfo.Factory(sn, mdi.bytecode_count);
     }
 }
Example #7
0
        public void Decode(byte[] buff, int off, int len = -1)
        {
            StreamNavigator sn = new StreamNavigator(buff, off, len);

            _opcodes = new List <IOpcode>();
            while (!sn.EoB)
            {
                _opcodes.Add(DecodeInsAndAdvance(sn));
            }
        }
Example #8
0
        public static MethodHeaderInfo Factory(StreamNavigator sn)
        {
            ExtendedMethodHeaderInfo emhi = new ExtendedMethodHeaderInfo();

            emhi._bitfield   = sn.GetByte();
            emhi._max_stack  = sn.GetByte();
            emhi._nargs      = sn.GetByte();
            emhi._max_locals = sn.GetByte();
            return(emhi);
        }
Example #9
0
        public StableSwitchOpcode(StreamNavigator sn)
            : base(sn)
        {
            _default_offset = sn.GetUshort();
            _low            = sn.GetUshort();
            _high           = sn.GetUshort();

            int tmp = _high - _low;

            while (tmp > 0)
            {
                _jumpOffsets.Add(sn.GetUshort());
                tmp--;
            }
        }
Example #10
0
        public static MethodInfo Factory(StreamNavigator sn, int bcodeLen)
        {
            MethodInfo mi = new MethodInfo {
                _mhi = MethodHeaderInfoFactory.Factory(sn)
            };

            if (bcodeLen > 0)
            {
                byte[]            bcode = sn.GetData(bcodeLen);
                JcBytecodeDecoder dec   = new JcBytecodeDecoder();
                dec.Decode(bcode, 0);
                mi._bytecode = dec.Opcodes;
            }
            return(mi);
        }
Example #11
0
        public static DescriptorComponent Factory(StreamNavigator sn, MethodComponent methods)
        {
            DescriptorComponent c = new DescriptorComponent();

            c._tag        = sn.GetByte();
            c._size       = sn.GetUshort();
            c._classCount = sn.GetByte();

            c._classes = new ClassDescriptorInfo[c._classCount];
            for (int i = 0; i < c._classCount; i++)
            {
                c._classes[i] = ClassDescriptorInfo.Factory(sn, methods);
            }
            // TODO:
            // c._types = ...
            return(c);
        }
Example #12
0
        public SlookupSwitchOpcode(StreamNavigator sn)
            : base(sn)
        {
            _default_offset = sn.GetUshort();
            _pairs          = sn.GetUshort();

            ushort tmp = _pairs;

            while (tmp > 0)
            {
                _matchOffsets.Add(new MatchOffset()
                {
                    Match = sn.GetUshort(), Offset = sn.GetUshort()
                });
                tmp--;
            }
        }
Example #13
0
        public static MethodComponent Factory(StreamNavigator sn)
        {
            MethodComponent c = new MethodComponent
            {
                Tag  = sn.GetByte(),
                Size = sn.GetUshort()
            };

            int start = sn.Position;

            byte handlerCount = sn.GetByte();

            c.ExceptionHandlers = new ExceptionHandlerInfo[handlerCount];
            for (int i = 0; i < handlerCount; i++)
            {
                c.ExceptionHandlers[i] = sn.GetStruct <ExceptionHandlerInfo>();
                c.ExceptionHandlers[i].CorrectEndianness();
            }

            c.Methods = sn.GetData(c.Size - (sn.Position - start));
            return(c);
        }
Example #14
0
        public static ClassDescriptorInfo Factory(StreamNavigator sn, MethodComponent methods)
        {
            ClassDescriptorInfo cdi = new ClassDescriptorInfo
            {
                _token          = sn.GetByte(),
                _accessFlags    = (ClassAccessFlags)sn.GetByte(),
                _thisClassRef   = sn.GetStruct <ClassRef>(),
                _interfaceCount = sn.GetByte(),
                _fieldCount     = sn.GetUshort(),
                _methodCount    = sn.GetUshort()
            };

            cdi._thisClassRef.CorrectEndianness();

            cdi._interfaces = new ClassRef[cdi._interfaceCount];
            cdi._fields     = new FieldDescriptorInfo[cdi._fieldCount];
            cdi._methods    = new MethodDescriptor[cdi._methodCount];

            int i = 0;

            for (i = 0; i < cdi._interfaceCount; i++)
            {
                cdi._interfaces[i] = sn.GetStruct <ClassRef>();
                cdi._interfaces[i].CorrectEndianness();
            }
            for (i = 0; i < cdi._fieldCount; i++)
            {
                cdi._fields[i] = sn.GetStruct <FieldDescriptorInfo>();
                cdi._fields[i].CorrectEndianness();
            }
            for (i = 0; i < cdi._methodCount; i++)
            {
                var mdi = sn.GetStruct <MethodDescriptorInfo>();
                mdi.CorrectEndianness();
                cdi._methods[i] = new MethodDescriptor(mdi, cdi._accessFlags.HasFlag(ClassAccessFlags.ACC_INTERFACE) ? null : methods);
            }
            return(cdi);
        }
 public SingleByteOperandOpcode(StreamNavigator sn)
     : base(sn)
 {
     _operand1 = sn.GetByte();
 }
Example #16
0
 public SingleShortOperandOpcode(StreamNavigator sn)
     : base(sn)
 {
     _operand1 = sn.GetUshort();
 }
Example #17
0
 public NoOperandsOpcode(StreamNavigator sn)
     : base(sn)
 {
 }
Example #18
0
 public UintOperandOpcode(StreamNavigator sn)
     : base(sn)
 {
     _operand1 = sn.GetUint();
 }
 public TwoBytesOperandOpcode(StreamNavigator sn)
     : base(sn)
 {
     _operand1 = sn.GetByte();
     _operand2 = sn.GetByte();
 }
Example #20
0
        private IOpcode DecodeInsAndAdvance(StreamNavigator sn)
        {
            // peak-only, full advance is made on an opcode class side!
            JcOpcodes op = (JcOpcodes)sn.PeakByte();

            switch (op)
            {
            case JcOpcodes.aaload:
            case JcOpcodes.aastore:
            case JcOpcodes.aconst_null:
            case JcOpcodes.aload_0:
            case JcOpcodes.aload_1:
            case JcOpcodes.aload_2:
            case JcOpcodes.aload_3:
            case JcOpcodes.areturn:
            case JcOpcodes.arraylength:
            case JcOpcodes.astore_0:
            case JcOpcodes.astore_1:
            case JcOpcodes.astore_2:
            case JcOpcodes.astore_3:
            case JcOpcodes.athrow:
            case JcOpcodes.baload:
            case JcOpcodes.bastore:
            case JcOpcodes.dup:
            case JcOpcodes.dup2:
            case JcOpcodes.i2b:
            case JcOpcodes.i2s:
            case JcOpcodes.iadd:
            case JcOpcodes.iaload:
            case JcOpcodes.iand:
            case JcOpcodes.iastore:
            case JcOpcodes.icmp:
            case JcOpcodes.iconst_m1:
            case JcOpcodes.iconst_0:
            case JcOpcodes.iconst_1:
            case JcOpcodes.iconst_2:
            case JcOpcodes.iconst_3:
            case JcOpcodes.iconst_4:
            case JcOpcodes.iconst_5:
            case JcOpcodes.idiv:
            case JcOpcodes.iload_0:
            case JcOpcodes.iload_1:
            case JcOpcodes.iload_2:
            case JcOpcodes.iload_3:
            case JcOpcodes.imul:
            case JcOpcodes.ineg:
            case JcOpcodes.ior:
            case JcOpcodes.irem:
            case JcOpcodes.ireturn:
            case JcOpcodes.ishl:
            case JcOpcodes.ishr:
            case JcOpcodes.istore_0:
            case JcOpcodes.istore_1:
            case JcOpcodes.istore_2:
            case JcOpcodes.istore_3:
            case JcOpcodes.isub:
            case JcOpcodes.iushr:
            case JcOpcodes.ixor:
            case JcOpcodes.nop:
            case JcOpcodes.pop:
            case JcOpcodes.pop2:
            case JcOpcodes.Return:
            case JcOpcodes.s2b:
            case JcOpcodes.s2i:
            case JcOpcodes.sadd:
            case JcOpcodes.saload:
            case JcOpcodes.sand:
            case JcOpcodes.sastore:
            case JcOpcodes.sconst_m1:
            case JcOpcodes.sconst_0:
            case JcOpcodes.sconst_1:
            case JcOpcodes.sconst_2:
            case JcOpcodes.sconst_3:
            case JcOpcodes.sconst_4:
            case JcOpcodes.sconst_5:
            case JcOpcodes.sdiv:
            case JcOpcodes.sload_0:
            case JcOpcodes.sload_1:
            case JcOpcodes.sload_2:
            case JcOpcodes.sload_3:
            case JcOpcodes.smul:
            case JcOpcodes.sneg:
            case JcOpcodes.sor:
            case JcOpcodes.srem:
            case JcOpcodes.sreturn:
            case JcOpcodes.sshl:
            case JcOpcodes.sshr:
            case JcOpcodes.sstore_0:
            case JcOpcodes.sstore_1:
            case JcOpcodes.sstore_2:
            case JcOpcodes.sstore_3:
            case JcOpcodes.ssub:
            case JcOpcodes.sushr:
            case JcOpcodes.sxor:
                return(new NoOperandsOpcode(sn));

            case JcOpcodes.aload:
            case JcOpcodes.astore:
            case JcOpcodes.bipush:
            case JcOpcodes.bspush:
            case JcOpcodes.dup_x:
            case JcOpcodes.getfield_a:
            case JcOpcodes.getfield_b:
            case JcOpcodes.getfield_s:
            case JcOpcodes.getfield_i:
            case JcOpcodes.getfield_a_this:
            case JcOpcodes.getfield_b_this:
            case JcOpcodes.getfield_s_this:
            case JcOpcodes.getfield_i_this:
            case JcOpcodes._goto:
            case JcOpcodes.if_acmpeq:
            case JcOpcodes.if_acmpne:
            case JcOpcodes.if_scmpeq:
            case JcOpcodes.if_scmpne:
            case JcOpcodes.if_scmplt:
            case JcOpcodes.if_scmpge:
            case JcOpcodes.if_scmpgt:
            case JcOpcodes.if_scmple:
            case JcOpcodes.ifeq:
            case JcOpcodes.ifne:
            case JcOpcodes.iflt:
            case JcOpcodes.ifge:
            case JcOpcodes.ifgt:
            case JcOpcodes.ifle:
            case JcOpcodes.ifnonnull:
            case JcOpcodes.ifnull:
            case JcOpcodes.iload:
            case JcOpcodes.istore:
            case JcOpcodes.newarray:
            case JcOpcodes.putfield_a:
            case JcOpcodes.putfield_b:
            case JcOpcodes.putfield_s:
            case JcOpcodes.putfield_i:
            case JcOpcodes.putfield_a_this:
            case JcOpcodes.putfield_b_this:
            case JcOpcodes.putfield_s_this:
            case JcOpcodes.putfield_i_this:
            case JcOpcodes.ret:
            case JcOpcodes.sload:
            case JcOpcodes.sstore:
            case JcOpcodes.swap_x:
                return(new SingleByteOperandOpcode(sn));

            case JcOpcodes.anewarray:
            case JcOpcodes.getfield_a_w:
            case JcOpcodes.getfield_b_w:
            case JcOpcodes.getfield_s_w:
            case JcOpcodes.getfield_i_w:
            case JcOpcodes.getstatic_a:
            case JcOpcodes.getstatic_b:
            case JcOpcodes.getstatic_s:
            case JcOpcodes.getstatic_i:
            case JcOpcodes.goto_w:
            case JcOpcodes.if_acmpeq_w:
            case JcOpcodes.if_acmpne_w:
            case JcOpcodes.if_scmpeq_w:
            case JcOpcodes.if_scmpne_w:
            case JcOpcodes.if_scmplt_w:
            case JcOpcodes.if_scmpge_w:
            case JcOpcodes.if_scmpgt_w:
            case JcOpcodes.if_scmple_w:
            case JcOpcodes.ifeq_w:
            case JcOpcodes.ifne_w:
            case JcOpcodes.iflt_w:
            case JcOpcodes.ifge_w:
            case JcOpcodes.ifgt_w:
            case JcOpcodes.ifle_w:
            case JcOpcodes.ifnonnull_w:
            case JcOpcodes.ifnull_w:
            case JcOpcodes.invokespecial:
            case JcOpcodes.invokestatic:
            case JcOpcodes.invokevirtual:
            case JcOpcodes.jsr:
            case JcOpcodes._new:
            case JcOpcodes.putfield_a_w:
            case JcOpcodes.putfield_b_w:
            case JcOpcodes.putfield_s_w:
            case JcOpcodes.putfield_i_w:
            case JcOpcodes.putstatic_a:
            case JcOpcodes.putstatic_b:
            case JcOpcodes.putstatic_s:
            case JcOpcodes.putstatic_i:
            case JcOpcodes.sipush:
            case JcOpcodes.sspush:
                return(new SingleShortOperandOpcode(sn));

            case JcOpcodes.checkcast:
            case JcOpcodes.iinc_w:
            case JcOpcodes.instanceof:
            case JcOpcodes.sinc_w:
                return(new ByteShortOperandOpcode(sn));

            case JcOpcodes.iinc:
            case JcOpcodes.sinc:
                return(new TwoBytesOperandOpcode(sn));

            case JcOpcodes.iipush:
                return(new UintOperandOpcode(sn));

            case JcOpcodes.invokeinterface:
                return(new InvokeInterfaceOpcode(sn));

            case JcOpcodes.ilookupswitch:
                return(new IlookupSwitchOpcode(sn));

            case JcOpcodes.itableswitch:
                return(new ItableSwitchOpcode(sn));

            case JcOpcodes.slookupswitch:
                return(new SlookupSwitchOpcode(sn));

            case JcOpcodes.stableswitch:
                return(new StableSwitchOpcode(sn));

            default:
                throw new Exception("Undefined opcode: " + op.ToString("X"));
            }
            ;
        }
Example #21
0
 public OpcodeBase(StreamNavigator sn)
 {
     _pos    = sn.Position;
     _opcode = (JcOpcodes)sn.GetByte();
 }
 public ByteShortOperandOpcode(StreamNavigator sn)
     : base(sn)
 {
     _operand1 = sn.GetByte();
     _operand2 = sn.GetUshort();
 }