学破解论坛

 ★找回密码★
 ★免费注册★

QQ登录

绑定QQ,免密登录

查看: 202|回复: 1

[原创逆向图文] 《re:从零开始的java逆向基础》#3方法(函数)

[复制链接] |关注本帖

签到天数: 4

该用户今日未签到




先定义一个方法
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 bytes
  MD5checksum 8e45b6aafc1404a9c015f8c0f03e385c
Compiled from "Main.java"
public class Main
  minorversion: 0
  majorversion: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant 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               ([Ljava/lang/String;)V
  #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: ([Ljava/lang/String;)V
   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;)V  2、将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 bytes
  MD5checksum 7c26b26edfdde5f4bb8410a0f05bc289
Compiled from "Main.java"
public class Main
  minorversion: 0
  majorversion: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant 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               ([Ljava/lang/String;)V
  #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: ([Ljava/lang/String;)V
   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文档
游客,当前主题有一部分内容已经设置隐藏,需要回复才能查看全部内容。


评分


每日系统赠送“免费评分”
评分不仅是免费的,还能提升你自己账号的活跃度。既感谢了楼主,又提升了自己。可谓一箭双雕!何乐而不为?评分安排上!

参与人数 2HB +21 THX +2 收起 理由
Shark恒 + 20 + 1 [快捷评语]--你将受到所有人的崇拜!
GEEKCRACK + 1 + 1 [快捷评语]--你将受到所有人的崇拜!

查看评分详情

学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!

签到天数: 18

该用户今日未签到




你将受到所有人的崇拜!
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
您需要登录后才可以回帖 登录 | 立即注册

获得更多积分,阅读本版加分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者其他任何非法用途!否则,一切后果请用户自负!

站长邮箱:SharkHeng#iCloud.com


站长微信号:SharkHeng|联系Email|鲨鱼逆向|无图版|手机版|小黑屋|FAQ|VIP破解教程|学破解论坛 ( 京公网安备 11011502002737号 | 京ICP备14042738号 ) 

GMT+8, 2019-12-12 09:37

快速回复 返回顶部 返回列表