谈谈JVM,最近在研究破解jar,有这方面经验的麻烦指导一下思路..

参考

参考1
指令整理

常用指令

局部变量类型

ccharchar类型
iintint类型
llonglong类型
sshortshort类型
bbytebyte类型
ffloatfloat类型
zboolean布尔类型
areference引用

方法信息

局部变量参数 LOCALVARIABLE
局部表大小 MAXLOCALS
操作数栈大小 MAXSTACK

指令

运算指令

  • 加法指令:iadd,ladd,fadd,dadd
  • 减法指令:isub,lsub,fsub,dsub
  • 乘法指令:imul,lmul,fmul,dmul
  • 除法指令:idiv,ldiv,fdiv,ddiv
  • 求余指令:irem,lrem,frem,drem
  • 取反指令:ineg,leng,fneg,dneg
  • 位移指令:ishl,ishr,iushr,lshl,lshr,lushr
  • 按位或指令:ior,lor
  • 按位与指令:iand,land
  • 按位异或指令:ixor,lxor
  • 局部变量自增指令:iinc
  • 比较指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp

加载和存储指令

  • 将一个局部变量加载到操作数栈的指令包括:iload,iload_<n>,lload、lload_<n>、float、fload_<n>、dload、dload_<n>,aload、aload_<n>。
  • 将一个数值从操作数栈存储到局部变量标的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
  • 将常量加载到操作数栈的指令:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_<i>,lconst_<l>,fconst_<f>,dconst_<d>
  • 局部变量表的访问索引指令:wide
    一部分以尖括号结尾的指令代表了一组指令,如iload_<i>,代表了iload_0,iload_1等,这几组指令都是带有一个操作数的通用指令。

运算指令

  • 加法指令:iadd,ladd,fadd,dadd
  • 减法指令:isub,lsub,fsub,dsub
  • 乘法指令:imul,lmul,fmul,dmul
  • 除法指令:idiv,ldiv,fdiv,ddiv
  • 求余指令:irem,lrem,frem,drem
  • 取反指令:ineg,leng,fneg,dneg
  • 位移指令:ishl,ishr,iushr,lshl,lshr,lushr
  • 按位或指令:ior,lor
  • 按位与指令:iand,land
  • 按位异或指令:ixor,lxor
  • 局部变量自增指令:iinc
  • 比较指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp

类型转换指令

JVM支持宽化类型转换(小范围类型向大范围类型转换):

  • int类型到long,float,double类型
  • long类型到float,double类型
  • float到double类型

对象创建与操作

  • 创建实例的指令:new
  • 创建数组的指令:newarray,anewarray,multianewarray
  • 访问字段指令:getfield,putfield,getstatic,putstatic
  • 把数组元素加载到操作数栈指令:baload,caload,saload,iaload,laload,faload,daload,aaload
  • 将操作数栈的数值存储到数组元素中执行:bastore,castore,castore,sastore,iastore,fastore,dastore,aastore
  • 取数组长度指令:arraylength
  • 检查实例类型指令:instanceof,checkcast

操作数栈管理指令

直接操作操作数栈的指令:pop,pop2,dup,dup2,dup_x1,dup2_x1,dup_x2,dup2_x2和swap

控制转移指令

  • 条件分支:ifeq,if 大专栏  谈JVM,字节码lt,ifle,ifne,ifgt,ifge,ifnull,ifnotnull,if_cmpeq,if_icmpne,if_icmlt,if_icmpgt等
  • 复合条件分支:tableswitch,lookupswitch
  • 无条件分支:goto,goto_w,jsr,jsr_w,ret

方法调用和返回指令

  • invokevirtual指令:调用对象的实例方法,根据对象的实际类型进行分派(虚拟机分派)。
  • invokeinterface指令:调用接口方法,在运行时搜索一个实现这个接口方法的对象,找出合适的方法进行调用。
  • invokespecial:调用需要特殊处理的实例方法,包括实例初始化方法,私有方法和父类方法
  • invokestatic:调用类方法(static)
  • 方法返回指令是根据返回值的类型区分的,包括ireturn(返回值是boolean,byte,char,short和int),lreturn,freturn,drturn和areturn,另外一个return供void方法,实例初始化方法,类和接口的类初始化i方法使用。

同步

Eg:

02-12 10:37