Java开发必会的反编译知识

1. 编程语言分类

在这里插入图片描述

2. 什么是编译

将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的机器语言的程序的过程就是编译。

负责这一过程的处理的工具叫做编译器。

不同的语言都有自己的编译器,Java语言中的编译器可以通过一个命令来调用:javac

javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

当我们写完一个HelloWorld.java文件后,我们可以使用javac HelloWorld.java命令来生成HelloWorld.class文件,这个class类型的文件是JVM可以识别的文件。

通常我们认为这个过程叫做Java语言的编译。其实,class文件仍然不是机器能够识别的语言,因为机器只能识别机器语言,还需要JVM再将这种class文件类型字节码转换成机器可以识别的机器码。

3. 什么是反编译

反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码,就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。

4. 两个反编译工具

4.1. javap命令

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。

javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件。

示例代码如下:

package cn.zdy.design_pattern;

public class Test {
    public static void main(String[] args) {
        String message = "Hello World!";
        System.out.println(message);
    }
}

执行:javap -c Test.class
我们可以得到:

public class cn.zdy.design_pattern.Test {
  public cn.zdy.design_pattern.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #7                  // String Hello World!
       2: astore_1
       3: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      10: return
}

显然,javap并没有将字节码反编译成java文件,而是生成了一种我们可以看得懂的字节码。

一般情况下我们会用到javap命令的时候不多,只有在真的需要看字节码的时候才会用到。

值得注意的是,字节码中间暴露的东西是最全的,肯定有机会用到。比如在分析synchronized的原理的时候就用得上javap。通过javap生成的字节码,可以发现synchronized底层依赖了ACC_SYNCHRONIZED标记和monitorenter、monitorexit两个指令来实现同步。

4.2. jd-gui

可以直接搜索下载,安装后将class文件拖入进来就可以看,非常方便。

package cn.zdy.design_pattern;

import java.io.PrintStream;

public class Test
{
  public static void main(String[] args)
  {
    String message = "Hello World!";
    System.out.println(message);
  }
}

5. 简单聊一下防止反编译

由于我们有工具可以对Class文件进行反编译,所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。

这里还是要说明一点,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已,无法彻底防治。

典型的应对策略有以下几种:

  1. 隔离Java程序,让用户接触不到你的Class文件
  2. 对Class文件进行加密,提到破解难度
  3. 代码混淆,将代码转换成功能上等价,但是难于阅读和理解的形式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋名RG

请我喝杯咖啡,让我更有动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值