之前的笔记搬运
数组指令
array-length vA, vB : 获取 vB 引用的数组长度赋值给 vA
new-array vA, vB, type\@CCCC : 构造一个指定类型和大小的数组,并把引用赋值
Va是数组引用, VB是size, type是类型
fill-array-data作用是填充数组, 其指令二进制后4字节是一个偏移,
是指向距离当前地址的一张数组元素表, 记录了初始化的内容;
1 | IDA里数组表结构: |
调用方法
invoke-virtual, 调用可以多态的方法
invoke-direct, 调用没有多态的方法, 如私有,构造
invoke-super, 调用父类的方法
invoke-static 调用静态方法
invoke-interface 调用接口的方法
一般方法的参数列表都会小于等于5个
invoke-type/range{vA, vZ} 一旦调用超过5个参数, 就会使用range关键字;
有序SwitchCase
packed-switch vAA, +BBBBBBBB
根据+BBBBBBBB 给定的跳转偏移列表匹配 vAA寄存器值,跳转到指定指令。偏移表中的匹配值是有规律递增的。
1 | IDA里有序switch case表结构: |
无序SwitchCase
sparse-switch vAA, +BBBBBBBB
偏移表中的匹配值是无规律且可以被指定的。
1 | IDA里无序switch case表结构: |
java中SwitchCase支持字符串的原理, 就是利用算出字符串的hash值,之后使用hash值做为case, 因为hash值可能会出现冲突,所以在每个case中会再判断equal是否自己的字符串;