public InvokeInterfaceOpcode(StreamNavigator sn) : base(sn) { _args = sn.GetByte(); _index = sn.GetUshort(); _method = sn.GetByte(); }
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(); } } }
public void Decode(StreamNavigator sn) { _opcodes = new List <IOpcode>(); while (!sn.EoB) { _opcodes.Add(DecodeInsAndAdvance(sn)); } }
public static MethodHeaderInfo Factory(StreamNavigator sn) { MethodHeaderInfo mhi = new MethodHeaderInfo(); mhi._bitfield = sn.GetByte(); mhi._bitfield2 = sn.GetByte(); return(mhi); }
public static MethodHeaderInfo Factory(StreamNavigator sn) { byte flags = sn.PeakByte(); return(((flags & 0x80) != 0) ? ExtendedMethodHeaderInfo.Factory(sn) : MethodHeaderInfo.Factory(sn)); }
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); } }
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)); } }
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); }
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--; } }
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); }
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); }
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--; } }
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); }
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(); }
public SingleShortOperandOpcode(StreamNavigator sn) : base(sn) { _operand1 = sn.GetUshort(); }
public NoOperandsOpcode(StreamNavigator sn) : base(sn) { }
public UintOperandOpcode(StreamNavigator sn) : base(sn) { _operand1 = sn.GetUint(); }
public TwoBytesOperandOpcode(StreamNavigator sn) : base(sn) { _operand1 = sn.GetByte(); _operand2 = sn.GetByte(); }
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")); } ; }
public OpcodeBase(StreamNavigator sn) { _pos = sn.Position; _opcode = (JcOpcodes)sn.GetByte(); }
public ByteShortOperandOpcode(StreamNavigator sn) : base(sn) { _operand1 = sn.GetByte(); _operand2 = sn.GetUshort(); }