213 lines
8.5 KiB
C++
213 lines
8.5 KiB
C++
/*
|
|
* Interactive disassembler (IDA)
|
|
* Copyright (c) 1990-98 by Ilfak Guilfanov.
|
|
* E-mail: ig@datarescue.com
|
|
* JVM module.
|
|
* Copyright (c) 1995-2006 by Iouri Kharon.
|
|
* E-mail: yjh@styx.cabel.net
|
|
*
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
*/
|
|
|
|
#ifndef _CLASSFIL_HPP_
|
|
#define _CLASSFIL_HPP_
|
|
//
|
|
// Java File definition
|
|
//
|
|
#define MAGICNUMBER 0xcafebabeUL // magic number
|
|
|
|
// Oracle's Java Virtual Machine implementation in JDK release 1.0.2
|
|
// supports class file format versions 45.0 through 45.3 inclusive. JDK
|
|
// releases 1.1.* support class file format versions in the range 45.0
|
|
// through 45.65535 inclusive. For k >= 2, JDK release 1.k supports class
|
|
// file format versions in the range 45.0 through 44+k.0 inclusive.
|
|
|
|
#define JDK_1_02_MINOR 2 // (45.2) JDK1.0
|
|
#define JDK_1_1_MINOR 3 // (45.3) JDK1.1
|
|
#define JDK_MIN_MAJOR 45 // JDK1.0/JDK1.1
|
|
#define JDK_MAX_MAJOR (44+11)// JDK1.11(JDK11): Java11?
|
|
//
|
|
// access_flags
|
|
//
|
|
#define ACC_PUBLIC 0x0001 // Visible to everyone
|
|
#define ACC_PRIVATE 0x0002 // Visible only to the defning
|
|
#define ACC_PROTECTED 0x0004 // Visible to subclasses
|
|
#define ACC_STATIC 0x0008 // Variable or method is static Method
|
|
#define ACC_FINAL 0x0010 // No further subclassing, overriding, or
|
|
// assignment after initialization
|
|
#define ACC_SYNCHRONIZED 0x0020 // Wrap use in monitor lock
|
|
#define ACC_SUPER 0x0020 // invoke by the 'invokespecial' (deprecated)
|
|
#define ACC_VOLATILE 0x0040 // Can't cache (field)
|
|
#define ACC_BRIDGE 0x0040 // Bridge method (java5) (generate by compiler)
|
|
#define ACC_TRANSIENT 0x0080 // Not to be written or read by
|
|
// a persistent object manager (field)
|
|
#define ACC_VARARGS 0x0080 // Method with variable number of arguments
|
|
// (java5)
|
|
#define ACC_NATIVE 0x0100 // Implemented in a language otherthan Java
|
|
#define ACC_INTERFACE 0x0200 // Is an interface
|
|
#define ACC_ABSTRACT 0x0400 // No body provided
|
|
#define ACC_STRICT 0x0800 // Delcared strictfp (floating-point mode
|
|
// is FP-strict) (method)
|
|
#define ACC_SYNTHETIC 0x1000 // Generate by compiler (no present in source)
|
|
// (java2)
|
|
#define ACC_ANNOTATION 0x2000 // only with INTERFACE (annotated) (java5)
|
|
#define ACC_ENUM 0x4000 // Class or BaseClass is enum (java5)
|
|
/* jdk1.5
|
|
ACC_BRIDGE, ACC_VARARGS, ACC_STRICT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM
|
|
*/
|
|
//
|
|
#define ACC_ACCESS_MASK (ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE)
|
|
#define _ACC_ALLTP (ACC_ACCESS_MASK | ACC_STATIC | ACC_FINAL \
|
|
| ACC_SYNTHETIC)
|
|
|
|
#define ACC_THIS_MASK (ACC_PUBLIC | ACC_FINAL | ACC_SUPER | ACC_INTERFACE \
|
|
| ACC_ABSTRACT | ACC_SYNTHETIC | ACC_ANNOTATION \
|
|
| ACC_ENUM)
|
|
#define ACC_NESTED_MASK (_ACC_ALLTP | ACC_INTERFACE | ACC_ABSTRACT \
|
|
| ACC_ANNOTATION | ACC_ENUM)
|
|
#define ACC_FIELD_MASK (_ACC_ALLTP | ACC_VOLATILE | ACC_TRANSIENT | ACC_ENUM)
|
|
#define ACC_METHOD_MASK (_ACC_ALLTP | ACC_SYNCHRONIZED | ACC_BRIDGE \
|
|
| ACC_VARARGS | ACC_NATIVE | ACC_ABSTRACT \
|
|
| ACC_STRICT)
|
|
|
|
//-----------------------------------
|
|
// base type
|
|
//
|
|
#define j_byte 'B' // signed byte
|
|
#define j_char 'C' // unicode character
|
|
#define j_double 'D' // double precision IEEE float
|
|
#define j_float 'F' // single precision IEEE foat
|
|
#define j_int 'I' // integer
|
|
#define j_long 'J' // long integer
|
|
#define j_class 'L' // <fullclassname>;
|
|
// ... an object of the given class
|
|
#define j_endclass ';' // tag for end of classname
|
|
#define j_parm_list_start '(' // start of function parameters
|
|
#define j_parm_list_end ')' // end of function parameters
|
|
#define j_short 'S' // signed short
|
|
#define j_bool 'Z' // boolean true or false
|
|
#define j_array '[' // <length><field sig> ... array
|
|
#define j_void_ret 'V' // return no value
|
|
//----------- make as mnemonic in new version
|
|
#define j_field_dlm '.' // use as field delimiter
|
|
#define j_clspath_dlm '/' // use as classpath delimeter
|
|
//#define j_legacy_dlm '$' // mechanically generated & legacy systems
|
|
//----------- jdk1.5
|
|
// signatures
|
|
#define j_typeref 'T' // TypeVariable signature
|
|
#define j_throw '^' // ThrowsSignature start
|
|
#define j_wild '*' // wildcard(unknown) <?>
|
|
#define j_wild_e '+' // wildcard(extends) <+name>
|
|
#define j_wild_s '-' // wildcard(super) <-name>
|
|
// type declaration syntax: <name:typesign>
|
|
// iface declaration syntax: <name:typesign:ifacesign>
|
|
// super declaration syntax:
|
|
#define j_sign '<' // formal type parameter start
|
|
#define j_endsign '>' // formal type parameter end
|
|
#define j_tag ':' // delimeter
|
|
|
|
// annotation tags
|
|
// possible const types is: B, C, D, F, I, J, S, Z, [
|
|
// additional annotation tag types
|
|
#define j_string 's' // constant string
|
|
#define j_enumconst 'e' // enum (type + name)
|
|
#define j_class_ret 'c' // return type descriptor
|
|
#define j_annotation '@' // nested annotation
|
|
|
|
//-----------------------------------------------------
|
|
// Constant Pool
|
|
//
|
|
#define CONSTANT_Asciz 1 // jdk1.1
|
|
#define CONSTANT_Utf8 1 // jdk1.x
|
|
#define CONSTANT_Unicode 2 // unused if jdk >= 1.0 (45.2)
|
|
#define CONSTANT_Integer 3
|
|
#define CONSTANT_Float 4
|
|
#define CONSTANT_Long 5
|
|
#define CONSTANT_Double 6
|
|
#define CONSTANT_Class 7
|
|
#define CONSTANT_String 8
|
|
#define CONSTANT_Fieldref 9
|
|
#define CONSTANT_Methodref 10
|
|
#define CONSTANT_InterfaceMethodref 11
|
|
#define CONSTANT_NameAndType 12
|
|
#define MAX_CONSTANT_TYPE 12 // Check in Loader flag
|
|
// JDK1.7 (JSR 292) -- dynamic for multiLanguage (python, ruby, etc)
|
|
#define CONSTANT_MethodHandle 15
|
|
#define CONSTANT_MethodType 16
|
|
// JDK 1.8
|
|
#define CONSTANT_InvokeDynamic 18
|
|
#define CONSTANT_LAST CONSTANT_InvokeDynamic
|
|
|
|
// JVM_CONSTANT_MethodHandle subtypes
|
|
#define JVM_REF_getField 1
|
|
#define JVM_REF_getStatic 2
|
|
#define JVM_REF_putField 3
|
|
#define JVM_REF_putStatic 4
|
|
#define JVM_REF_invokeVirtual 5
|
|
#define JVM_REF_invokeStatic 6
|
|
#define JVM_REF_invokeSpecial 7
|
|
#define JVM_REF_newInvokeSpecial 8
|
|
#define JVM_REF_invokeInterface 9
|
|
|
|
//-------------------------------------------------------
|
|
// Array Type (newarray)
|
|
//
|
|
#define T_BOOLEAN 4
|
|
#define T_CHAR 5
|
|
#define T_FLOAT 6
|
|
#define T_DOUBLE 7
|
|
#define T_BYTE 8
|
|
#define T_SHORT 9
|
|
#define T_INT 10
|
|
#define T_LONG 11
|
|
|
|
//--------------------------------------------------------
|
|
// StackMapTable records
|
|
#define JDK_SMF_MAJOR_MIN 50 // minimal version (previous: CLDC)
|
|
// offset for record 0 == offset, else previous_offset + offset + 1;
|
|
#define SMT_SAME_FRM_S0_min 0 // off_dt=type, loc=prev, stack=empty
|
|
#define SMT_SAME_FRM_S0_max 63
|
|
#define SMT_SAME_FRM_S1_min 64 // off_dt=type-min, loc=prev, stack=1
|
|
#define SMT_SAME_FRM_S1_max 127 // [ + verinf[1] ]
|
|
#define SMT_reserved_min 128
|
|
#define SMT_reserved_max 246
|
|
#define SMT_SAME_FRM_S1 247 // loc=prev, stack=1 [ + off_d, verinf[1] ]
|
|
#define SMT_CHOP_FRM_S0_min 248 // stack=empty, loc=prev-((max+1)-type)
|
|
#define SMT_CHOP_FRM_S0_max 250 // [ + off_dt ]
|
|
#define SMT_SAME_FRM_S0 251 // stack=empty, loca=prev [ + off_dt ]
|
|
#define SMT_APPE_FRM_S0_min 252 // stack=empty, loc+=prev+(type-(min-1))
|
|
#define SMT_APPE_FRM_S0_max 254 // [ + off_dt, { verinf[n] } ]
|
|
#define SMT_FULL_FRAME 255 // see below
|
|
/*
|
|
struct sm_full
|
|
{
|
|
u1 type; // for JDK16 or higher
|
|
u2 off_dt; // for StackMap - off
|
|
u2 nloc;
|
|
verinf locs[nlocks];
|
|
u2 nstk;
|
|
verinf stks[nstk];
|
|
};
|
|
*/
|
|
// Initial stack map frame: off=0, stack is free, max_locals, max_stack;
|
|
|
|
// StackMap types
|
|
enum SM_ITEM // u1
|
|
{
|
|
ITEM_Bogus = 0, // unused (unknown type -- can't used directly)
|
|
ITEM_Integer,
|
|
ITEM_Float,
|
|
ITEM_Double,
|
|
ITEM_Long,
|
|
ITEM_Null,
|
|
ITEM_UnitializedThis,
|
|
ITEM_Object, // +pool_index
|
|
ITEM_Uninitialized, // +offset (u2)
|
|
// additional for out
|
|
ITEM_BADOBJECT,
|
|
ITEM_CURCLASS
|
|
};
|
|
|
|
#endif
|