Lightcolour 发表于 2019-9-20 01:28

《re:从零开始的java逆向基础》#1常量入栈指令

本帖最后由 Lightcolour 于 2019-9-20 01:30 编辑

Java中最简单的“方法”(java中不存在函数function)也就是返回一值比如public String getName() {return “Lightcolour”;} 这个方法返回了一个String 也就是字符串 “Lightcolour” 常量入栈指令有iconst、bipush、sipush、ldc、ldc2_w

在一个主类(class)中的方法public class Main {      publicstatic int main () {      return 0;}} 这个方法会返回一个值 int型 整数型 4字节 返回值为 0 我们在记事本上写一个这样的java文件:javac Main.java使用java的标准反编译工具javap -c -verbose Main.class Last modified 2019-9-20; size 235 bytes MD5 checksum 29925e418a0454c00c9ecfeac55db6b4 Compiled from "Main.java"public class Main minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool:#1 = Methodref         #3.#12         //java/lang/Object."<init>":()V#2 = Class            #13            // Main#3 = Class            #14            // java/lang/Object#4 = Utf8            <init>#5 = Utf8               ()V#6 = Utf8               Code#7 = Utf8            LineNumberTable#8 = Utf8               main#9 = Utf8               ()I #10 = Utf8            SourceFile #11 = Utf8               Main.java #12 = NameAndType       #4:#5          //"<init>":()V #13 = Utf8               Main #14 = Utf8               java/lang/Object{ public Main();   descriptor: ()V   flags: ACC_PUBLIC   Code:   stack=1, locals=1, args_size=1         0: aload_0         1: invokespecial #1                  // Methodjava/lang/Object."<init>":()V         4: return   LineNumberTable:       line 1: 0 public static int main();   descriptor: ()I   flags: ACC_PUBLIC, ACC_STATIC   Code:   stack=1, locals=0, args_size=0         0: iconst_0         1: ireturn   LineNumberTable:       line 3: 0}SourceFile: "Main.java" 在程序中最常见的就是0因为区分短一个短字节的 iconst_0也是0的入栈ireturn指令 i 就是 integer

我们接着返回一个 int 为 123

public class Main {      publicstatic int main () {      return 123;}} 编译然后反编译   Code:   stack=1, locals=0, args_size=0         0: bipush      123         2: ireturn 那么为什么这次变成了bipush 而不是 iconst_0了呢 那就是int 的范围 当 int 的范围 在 0 ~ 5的时候 指令是 iconst_0 ~ iconst_5-1 是iconst_m1在 -128 ~ 127 的时候 指令是 bipush在 -32768 ~ 32767 的时候 指令是sipush 我们接着返回 1234 试试 编译然后反编译 Code:   stack=1, locals=0, args_size=0         0: sipush      1234         3: ireturn   LineNumberTable:       line 3: 0 看到一定范围的时候指令就会变就会变 我列了一张表
各变量当在一定范围的时候指令的变化 我们接着看看其他反编译的 boolean false iconst_0boolean true iconst_1也就是说 false 用常量 0 表示 true 用常量 1表示 short 1234 sipush char ‘A’ bipuch 65char ‘啊’ sipush 21834         注意这里记事本保存为ANSI byte 123 bipuch long 12345678901234567891 0: ldc2_w #2 double 123.456d ldc2_w #2 float 123.456f ldc #2

本集资源

**** Hidden Message *****

zzcl558 发表于 2019-9-20 01:39

谢谢分享!

寒冰苏雪 发表于 2019-9-20 02:25

学习了,这个学的真好,顶

50311048 发表于 2019-9-20 23:17

谢谢分享!

fawcgzmg 发表于 2019-9-23 21:33

谢谢分享,学习一下

w59541511 发表于 2019-10-19 23:09

感谢楼主分享

lijiu 发表于 2019-10-31 15:36

感谢分享,学习一下

wuqingpojie 发表于 2019-11-2 18:51

谢谢分享!

godp 发表于 2019-12-11 07:35

感谢分享

菜猫牧屿 发表于 2020-2-16 09:18

菜鸟学习
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 《re:从零开始的java逆向基础》#1常量入栈指令