《re:从零开始的java逆向基础》#2操作数栈
操作数栈在执行字节码指令的时候使用,它和通用寄存器在 native CPU 中使用的方式类似。大多数 JVM 字节码通过 pushing,popping,duplicating,swapping,或生产消费值的操作使用操作数栈 我们先运行一个例子 比如return 一个 a/2 public class Main{ public static int main(int a) { return a /2; } }Java -c -verbose 反编译Code: stack=2, locals=1, args_size=1 0: iload_0 1: iconst_2 2: idiv 3: ireturn LineNumberTable: line 3: 0 iload_0 就是aiconst_2 也就是2idiv 前面两个数相除ireturn 返回值、 我们再写复杂点returna / 2.0d返回一个双浮点 public class Main{ public static double main(double a) { return a / 2.0d; } } Java -c -verbose 反编译 Code: stack=4, locals=2, args_size=1 0: dload_0 1: ldc2_w #2 // double 2.0d 4: ddiv 5: dreturn LineNumberTable: line 3: 0 dload_0 就是a ldc2_w 就是2.0dddiv 两个相除dreturn 返回值 在看看两个参数 public class Main{ public static int main(int a,int b) { return a + b; } } Java -c -verbose 反编译 Code: stack=2, locals=2, args_size=2 0: iload_0 1: iload_1 2: iadd 3: ireturn LineNumberTable: line 3: 0 iload_0 就是 a iload_1 就是 biadd 两数相加ireturn 返回值 再看看长整型 public class Main{ public static long main(long a,longb) { return a + b; } } Java -c -verbose 反编译 Code: stack=4, locals=4, args_size=2 0: lload_0 1: lload_2 2: ladd 3: lreturn LineNumberTable: line 3: 0 lload_0 就是alload_2 就是 bladd 两数相加lreturn 返回值 再写一个混合 public class Main{ public static int main(int a,intb,int c) { return c*a + b; } } Java -c -verbose 反编译 Code: stack=2, locals=3, args_size=3 0: iload_2 1: iload_0 2: imul 3: iload_1 4: iadd 5: ireturn LineNumberTable: line 3: 0 iload_2 就是ciload_ 就是 aimul 两数相乘iload_1 就是biadd 两数相加ireturn 返回值本集资源word文档**** Hidden Message *****你将受到所有人的崇拜! 你将受到所有人的崇拜!
感谢分享,学习一下 谢谢分享 感谢楼主分享。 感谢楼主 [快捷回复]-学破解防逆向,知进攻懂防守! 感谢楼主 谢谢分享