广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java如何进行反编译
  • 190
分享到

java如何进行反编译

java 2017-09-06 20:09:53 190人浏览 才女
摘要

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

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

Java常用反编译工具

本文主要介绍4个Java的反编译工具:javap、jad和cfr以及可视化反编译工具JD-GUI

JAVAP

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件,也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例,如我们想分析Java 7中的switch是如何支持String的,我们先有以下可以编译通过的源代码:

public class switchDemoString {
    public static void main(String[] args) {
        String str = "world";
        switch (str) {
            case "hello":
                System.out.println("hello");
                break;
            case "world":
                System.out.println("world");
                break;
            default:
                break;
        }
    }
}

执行以下两个命令:

javac Decompilation.java
javap -c Decompilation.class

生成代码如下:

Compiled from "Decompilation.java"
public class Decompilation {
  public Decompilation();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #16                 // String world
       2: astore_1
       3: aload_1
       4: dup
       5: astore_2
       6: invokevirtual #18                 // Method java/lang/String.hashCode:()I
       9: lookupswitch  { // 2
              99162322: 36
             113318802: 48
               default: 82
          }
      36: aload_2
      37: ldc           #24                 // String hello
      39: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      42: ifne          60
      45: Goto          82
      48: aload_2
      49: ldc           #16                 // String world
      51: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      54: ifne          71
      57: goto          82
      60: getstatic     #30                 // Field java/lang/System.out:Ljava/io/PrintStream;
      63: ldc           #24                 // String hello
      65: invokevirtual #36                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      68: goto          82
      71: getstatic     #30                 // Field java/lang/System.out:Ljava/io/PrintStream;
      74: ldc           #16                 // String world
      76: invokevirtual #36                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      79: goto          82
      82: return
}

javap并没有将字节码反编译成java文件,而是生成了一种我们可以看得懂字节码。其实javap生成的文件仍然是字节码,只是程序员可以稍微看得懂一些。如果你对字节码有所掌握,还是可以看得懂以上的代码的。其实就是把String转成hashcode,然后进行比较。

JAD

JAD是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。还是上面的源代码,使用jad反编译后内容如下:

命令:jad.exe Decompilation.class 会生成一个Decompilation.jad的文件

JAD反编译的结果如下:

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: Http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Decompilation.java

package com.yveshe;

import java.io.PrintStream;

public class Decompilation
{

    public Decompilation()
    {
    }

    public static void main(String args[])
    {
        String str = "world";
        String s;
        switch((s = str).hashCode())
        {
        default:
            break;

        case 99162322: 
            if(s.equals("hello"))
                System.out.println("hello");
            break;

        case 113318802: 
            if(s.equals("world"))
                System.out.println("world");
            break;
        }
    }
}

看上面的代码这不就是标准的java的源代码么。这个就很清楚的可以看到原来字符串的switch是通过equals()和hashCode()方法来实现的。

CFR

JAD很好用,但是无奈的是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比JAD来说,他的语法可能会稍微复杂一些,但是好在他可以用.

CFR将反编译现代Java特性–Java 8 lambdas(Java和更早版本中的Java beta 103),已经反编译Java 7 String,但CFR是完全用Java 6编写的.

建议大家手动通过javac Decompilation.java命令来编译生成Decompilation.class文件,再做测试.

成功的反编译结果如下:


package com.yveshe;

import java.io.PrintStream;

public class Decompilation {
    public static void main(String[] args) {
        String str;
        String s = str = "world";
        switch (s.hashCode()) {
            default: {
                break;
            }
            case 99162322: {
                if (!s.equals("hello")) break;
                System.out.println("hello");
                break;
            }
            case 113318802: {
                if (!s.equals("world")) break;
                System.out.println("world");
            }
        }
    }
}

相比Jad来说,CFR有很多参数,还是刚刚的代码,如果我们使用以下命令,输出结果就会不同:
E:CRF>java -jar cfr_0_125.jar Decompilation.class


package com.yveshe;

import java.io.PrintStream;

public class Decompilation {
    public static void main(String[] args) {
        String str;
        String s = str = "world";
        switch (s.hashCode()) {
            default: {
                break;
            }
            case 99162322: {
                if (!s.equals("hello")) break;
                System.out.println("hello");
                break;
            }
            case 113318802: {
                if (!s.equals("world")) break;
                System.out.println("world");
            }
        }
    }
}

--decodestringswitch表示对于switch支持string的细节进行解码。

类似的还有--decodeenumswitch、--decodefinally、--decodelambdas等。

--decodelambdas可以对lambda表达式进行反编译。

JD-GUI

JD-GUI 是一个用 c++ 开发的 Java反编译工具,由 Pavel Kouznetsov开发,支持windowslinux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI 基于GPLv3开源协议,对个人使用是完全免费的。JD-GUI主要的是提供了可视化操作,直接拖拽文件到窗口既可,效果图如下

1.jpg

JadClipse

在Eclipse中安装Jad插件,注意这里是安装的是Jad插件不是Jd插件~

所需要资源: net.sf.jadclipse_3.3.0.jar插件jar和JAD.exe反编译软件(在文末有下载地址)

JadClipse下载地址在官网下载插件的jar包,然后将jar包放到eclipse的plugins目录下;在打开Eclipse,Eclipse->Window->Preferences->Java,此时你会发现会比原来多了一个JadClipse的选项如下图配置JadClipse:

2.jpg

3.jpg

基本配置完毕后,我们可以设置一下class文件的默认打开方式:

Eclipse->Window->Preferences->General->Editors->File Associations 我们可以看到class文件的打开方式有两个,这里设置JadClipse和Eclipse自带的Class File Viewer,而JadClipse是默认的。

全部配置完成,下面我们可以查看源码了,选择需要查看的类,按F3即可查看源码.如果JadClipse不是默认设置,设置成默认设置既可.

更多java知识请关注Java基础教程栏目。

--结束END--

本文标题: java如何进行反编译

本文链接: https://www.lsjlt.com/news/2024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java如何进行反编译
    反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。Java常用反编译工具本...
    99+
    2017-09-06
    java
  • java如何反编译
    什么是反编译反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。 (...
    99+
    2021-03-04
    java教程 java
  • 如何使用java编译器进行编译
    使用Java编译器进行编译可以通过以下步骤:1. 确保已经安装了Java Development Kit (JDK)。可以通过在命令...
    99+
    2023-09-06
    java
  • Java进阶:如何反编译jar包获取源码
    0.引言 某些没有提供源码的历史遗留项目,或者第三方jar包,我们常常需要进行二开,但是又没有源码,这时就需要进行反编译获取到项目源码。 当然也不是所有的jar都能反编译的,某些做了防编译处理的则不能,但对于我们历史遗留的项目进行反编译则是...
    99+
    2023-08-19
    java jar macos
  • 如何进行SQLite编译
    这期内容当中小编将会给大家带来有关如何进行SQLite编译,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。上周,我一直在做一个 SQL 网站。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例...
    99+
    2023-06-16
  • java反编译class命令如何使用
    要使用Java反编译class命令,你需要安装并配置Java的反编译工具,比如JD-GUI或Jad。然后,可以按照以下步骤使用反编译...
    99+
    2023-10-20
    java
  • PHP中如何进行代码反编译和逆向工程?
    随着互联网技术的快速发展,网站和应用程序的开发越来越成熟,越来越复杂。其中,PHP语言是最受欢迎的开发语言之一,在各种Web应用程序和网站中都得到了广泛应用。然而,PHP语言的开源性导致了代码容易被恶意用户或黑客攻击,因此保护PHP代码的安...
    99+
    2023-05-14
    PHP代码反编译 PHP逆向工程 反编译工具
  • 关于.java编译成.class 与 .class反编译成.java问题
    目录了解下这两个文件类型1. 首先反编译器就是jd-gui这个软件了2. 怎么把.class转成.java文件呢?3. eclipse里面怎么看.class文件?4. 怎么编译单个的...
    99+
    2022-11-13
  • 安卓反编译入门03-dex2jar反编译apk得到Java源代码
    1.获取工具 dex2jar下载地址:http://sourceforge.net/projects/dex2jar/files/ 直接下载 ...
    99+
    2023-10-24
    APP逆向 安卓破解 Powered by 金山文档
  • Java反编译工具有哪些
    这篇文章主要介绍“Java反编译工具有哪些”,在日常操作中,相信很多人在Java反编译工具有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java反编译工具有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-04
  • idea:jar包反编译成java文件
    步骤: 根据安装的idea找到如下路径 将所需的jar包放到同目录下,并创建与jar包名称相同的空文件夹  在java-decompiler.jar包中在导航栏输入cmd进入命令提示符中 4。在命令提示符中输入如下代码:         ...
    99+
    2023-09-01
    jar intellij-idea java
  • jar包反编译工具(java-decompiler)
    五种反编译工具 1.jd-gui 下载地址:http://java-decompiler.github.io/ 优点:反编译的源代码基本符合,没有乱七八糟新增的修饰符 缺点:反编译过程耗时较长(50MB需要10分钟左右)       ...
    99+
    2023-08-31
    jar java
  • 如何反编译class文件
    要反编译一个class文件,需要使用Java反编译工具。以下是一些常用的Java反编译工具:1. JD-GUI:JD-GUI是一个免...
    99+
    2023-09-28
    class
  • 如何使用java反编译字节码文件
    本篇文章给大家分享的是有关如何使用java反编译字节码文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We...
    99+
    2023-06-14
  • 如何将class文件反编译成java文件
    这篇文章给大家分享的是有关如何将class文件反编译成java文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对...
    99+
    2023-06-14
  • ubuntu如何用make进行编译
    ubuntu用make进行编译的示例:比如用make编译安装sqlite。下载sqlite源代码,地址:https://www.sqlite.org/download.html。进入源代码根目录,打开终端执行。./configure –pr...
    99+
    2022-10-11
  • 如何进行gcc动态编译
    如何进行gcc动态编译,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。优点:体积小,编译快 缺点:依赖性高 代码如下:[root@74-82-173-217 shared]#...
    99+
    2023-06-13
  • 详解如何进行Java环境配置与编译运行
    小编这次要给大家分享的是详解如何进行Java环境配置与编译运行,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。一、开篇通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印象的了解了...
    99+
    2023-05-31
    java ava
  • 【Java可执行命令】(四)反编译工具javap:深入解析应用程序反编译工具javap ~
    Java可执行命令详解之javap 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.1.1 可选参数:-l3.1.2 可选参数:-c3.1.3 可选参数:-s3.1.4 可选参数...
    99+
    2023-09-16
    java python 开发语言 java-ee jvm 后端
  • java反编译指令有什么用
    Java反编译指令是用来将已经编译过的Java字节码文件(.class文件)转换回Java源代码文件(.java文件)。这个过程称为...
    99+
    2023-10-26
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作