Lightcolour 发表于 2019-9-20 16:05

《re:从零开始的java逆向基础》#3方法(函数)

先定义一个方法public class Main {      publicstatic double getNumber() {         returnMath.random()/2;      }} 反编译 Constant pool:#1 = Methodref         #6.#15         //java/lang/Object."<init>":()V#2 = Methodref         #16.#17      //java/lang/Math.random:()D#3 = Double             2.0d#5 = Class            #18            // Main#6 = Class            #19            // java/lang/Object#7 = Utf8            <init>#8 = Utf8               ()V#9 = Utf8               Code #10 = Utf8            LineNumberTable #11 = Utf8               getNumber #12 = Utf8               ()D #13 = Utf8               SourceFile #14 = Utf8               Main.java #15 = NameAndType       #7:#8          //"<init>":()V #16 = Class            #20            // java/lang/Math #17 = NameAndType       #21:#12      // random:()D #18 = Utf8               Main #19 = Utf8            java/lang/Object #20 = Utf8            java/lang/Math #21 = Utf8               random{ 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 double getNumber();   descriptor: ()D   flags: ACC_PUBLIC, ACC_STATIC   Code:   stack=4, locals=0, args_size=0         0: invokestatic#2            // Method java/lang/Math.random:()D         3: ldc2_w      #3                  // double 2.0d         6: ddiv         7: dreturn   LineNumberTable:       line 3: 0}SourceFile: "Main.java" invokestatic #2调用常量#2定义的函数 也就是说调用了这个方法得到了一个随机数 函数名定义再常量池Methodref中 定义 类 方法 返回 2 = Methodref         #16.#17 //java/lang/Math.random:()D 也就是说 #2 是#16#17 拼接成的 #16定义了类名Method java/lang/Math #17定义了方法 random返回类型()D #17 = NameAndType       #21:#12      // random:()D 也就是说 #17 是#21#12 拼接成的 #21 定义了random 方法 #12 返回类型()D ()括号内没有东西表示没参数我们再看看返回一个String的例子 public class Main {      public staticvoid main(String[] args) {         System.out.println("Lightcolour");      }}反编译 Lastmodified 2019-9-20; size 413 bytesMD5checksum 8e45b6aafc1404a9c015f8c0f03e385c Compiled from "Main.java"public class Mainminorversion: 0majorversion: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool:   #1 =Methodref          #6.#15         //java/lang/Object."<init>":()V   #2 =Fieldref         #16.#17      //java/lang/System.out:Ljava/io/PrintStream;   #3 =String             #18            // Lightcolour   #4 =Methodref          #19.#20      //java/io/PrintStream.println:(Ljava/lang/String;)V   #5 =Class            #21            // Main   #6 =Class            #22            // java/lang/Object   #7 =Utf8               <init>   #8 =Utf8               ()V   #9 =Utf8               Code#10 =Utf8               LineNumberTable#11 =Utf8               main#12 =Utf8               (#13 =Utf8               SourceFile#14 =Utf8               Main.java#15 =NameAndType      #7:#8          // "<init>":()V#16 =Class            #23            // java/lang/System#17 =NameAndType      #24:#25      // out:Ljava/io/PrintStream;#18 =Utf8               Lightcolour#19 =Class            #26            // java/io/PrintStream#20 =NameAndType      #27:#28      // println:(Ljava/lang/String;)V#21 =Utf8               Main#22 =Utf8               java/lang/Object#23 =Utf8               java/lang/System#24 =Utf8               out#25 =Utf8               Ljava/io/PrintStream;#26 =Utf8               java/io/PrintStream#27 =Utf8               println#28 =Utf8               (Ljava/lang/String;)V{ public Main();   descriptor: ()V   flags: ACC_PUBLIC   Code:   stack=1, locals=1, args_size=1      0: aload_0      1: invokespecial #1               // Method java/lang/Object."<init>":()V      4: return   LineNumberTable:       line 1: 0 public static void main(java.lang.String[]);   descriptor: (   flags: ACC_PUBLIC, ACC_STATIC   Code:   stack=2, locals=1, args_size=1      0: getstatic   #2   // Fieldjava/lang/System.out:Ljava/io/PrintStream;      3: ldc         #3   // String Lightcolour      5: invokevirtual #4    // Methodjava/io/PrintStream.println:(Ljava/lang/String;)V      8: return   LineNumberTable:       line 3: 0       line 4: 8} getstatic#2获取System.out的引用入栈ldc将字符串“Lightcolour” 入栈invokevirtual 调用println方法 这里会进行2个操作 1、将字符串Lightcolour出栈传入(Ljava/lang/String;)V2、将System.out 出栈传入java/io/PrintStream.println 再看beep方法 public class Main {      public staticvoid main(String[] args) {         java.awt.Toolkit.getDefaultToolkit().beep();      }} 反编译 Lastmodified 2019-9-20; size 355 bytesMD5checksum 7c26b26edfdde5f4bb8410a0f05bc289 Compiled from "Main.java"public class Mainminorversion: 0majorversion: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool:   #1 =Methodref          #5.#14         //java/lang/Object."<init>":()V   #2 =Methodref          #15.#16      //java/awt/Toolkit.getDefaultToolkit:()Ljava/awt/Toolkit;   #3 =Methodref          #15.#17      // java/awt/Toolkit.beep:()V   #4 =Class            #18            // Main   #5 =Class            #19            // java/lang/Object   #6 =Utf8               <init>   #7 =Utf8               ()V   #8 =Utf8               Code   #9 =Utf8               LineNumberTable#10 =Utf8               main#11 =Utf8               (#12 =Utf8               SourceFile#13 =Utf8               Main.java#14 =NameAndType      #6:#7          // "<init>":()V#15 =Class            #20            // java/awt/Toolkit#16 =NameAndType      #21:#22      //getDefaultToolkit:()Ljava/awt/Toolkit;#17 =NameAndType      #23:#7         // beep:()V#18 =Utf8               Main#19 =Utf8               java/lang/Object#20 =Utf8               java/awt/Toolkit#21 =Utf8               getDefaultToolkit#22 =Utf8               ()Ljava/awt/Toolkit;#23 =Utf8               beep{ public Main();   descriptor: ()V    flags:ACC_PUBLIC   Code:   stack=1, locals=1, args_size=1      0: aload_0      1: invokespecial #1             //Method java/lang/Object."<init>":()V      4: return   LineNumberTable:       line 1: 0 public static void main(java.lang.String[]);   descriptor: (   flags: ACC_PUBLIC, ACC_STATIC   Code:   stack=1, locals=1, args_size=1      0: invokestatic #2// Methodjava/awt/Toolkit.getDefaultToolkit:()Ljava/awt/Toolkit;         3: invokevirtual #3            // Methodjava/awt/Toolkit.beep:()V      6: return   LineNumberTable:       line 3: 0       line 4: 6} invokestatic #2 调用java.awt.Toolkit.getDefaultToolkit()方法invokevirtual #3 调用beep()函数
本机资源word文档**** Hidden Message *****

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

你将受到所有人的崇拜!

豆0o0豆 发表于 2021-12-7 22:10

感谢分享呀

豆0o0豆 发表于 2021-12-19 00:04

感谢分享( ̄▽ ̄)"

bnjzzheng 发表于 2022-1-11 21:59

多谢分享。多谢

xujinwen 发表于 2022-1-12 20:11

谢谢大佬分享

越宝 发表于 2022-1-13 10:09

谢谢大佬!

hetao8003200 发表于 2022-1-13 11:09

感谢楼主分享

6378895 发表于 2022-1-13 12:22

{:5_189:}{:5_189:}

越宝 发表于 2022-1-13 18:08

谢谢大佬!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 《re:从零开始的java逆向基础》#3方法(函数)