《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 *****
你将受到所有人的崇拜! 感谢分享呀 感谢分享( ̄▽ ̄)" 多谢分享。多谢 谢谢大佬分享 谢谢大佬! 感谢楼主分享 {:5_189:}{:5_189:} 谢谢大佬!