java编译和反编译,java 反编译器

  java编译和反编译,java 反编译器

  如何解决写爬虫IP受阻的问题?立即使用。

  反编译的过程正好和编译相反,就是把编译好的编程语言恢复到未编译的状态,也就是找出编程语言的源代码。就是把机器能理解的语言转换成程序员能理解的语言。java语言中的反编译一般是指将类文件转换成Java文件。

  Java常用反编译工具

  本文主要介绍四种Java反编译工具:javap、jad和cfr,以及可视化反编译工具JD-GUI。

  JAVAP

  Javap是jdk附带的一个工具。它可以反编译代码或者查看java编译器生成的字节码。java和其他两个反编译工具最大的区别就是Java生成的文件不是Java文件,不像其他两个工具生成的代码那么容易理解。以一段简单的代码为例。例如,如果我们想分析Java 7中的switch是如何支持String的,我们首先有以下可以编译和传递的源代码:

  公共类switchDemoString {

  公共静态void main(String[] args) {

  String str= world

  开关(字符串){

  case hello :

  system . out . println( hello );

  打破;

  案例“世界”:

  system . out . println( world );

  打破;

  默认值:

  打破;

  }

  }

  }执行以下两个命令:

  贾瓦茨Decompilation.java

  javap -c Decompilation.class生成的代码如下:

  从“Decompilation.java”编译

  公共类反编译{

  公共反编译();

  代码:

  0: aload_0

  1: invokespecial #8 //方法java/lang/Object。init:()V

  4:退货

  公共静态void main(Java . lang . string[]);

  代码:

  0: ldc #16 //字符串世界

  2:故事1

  3: aload_1

  4: dup

  5:阿斯托雷_2

  6: invokevirtual #18 //方法java/lang/String.hashCode:()I

  9: lookupswitch { //2

  99162322: 36

  113318802: 48

  默认值:82

  }

  36: aload_2

  37: ldc #24 //String你好

  39: invokevirtual #26 //方法Java/lang/string . equals:(Ljava/lang/Object;)Z

  42: ifne 60

  45:转到82

  48: aload_2

  49: ldc #16 //弦乐世界

  51: invokevirtual #26 //方法Java/lang/string . equals:(Ljava/lang/Object;)Z

  54: ifne 71

  57:转到82

  60:get static # 30//Field Java/lang/system . out:Ljava/io/PrintStream;

  63: ldc #24 //String hello

  65: invokevirtual #36 //方法Java/io/printstream . println:(Ljava/lang/String;)V

  68:转到82

  71:get static # 30//Field Java/lang/system . out:Ljava/io/PrintStream;

  74: ldc #16 //弦乐世界

  76: invokevirtual #36 //方法Java/io/printstream . println:(Ljava/lang/String;)V

  79:转到82

  82:返回

  }javap没有把字节码反编译成java文件,而是生成了一个我们能理解的字节码。其实javap生成的文件还是字节码,只是程序员稍微能看懂一点。如果你对字节码有一定的了解,还是可以理解上面的代码的。其实就是把String转换成hashcode,然后进行比较。

  JAD

  JAD是一个很好的反编译工具。你可以通过下载一个执行工具来反编译类文件。还是上面的源代码。用jad反编译后,内容如下:

  命令:jad.exe decompilation . class将生成一个Decompilation.jad文件

  JAD反编译的结果如下:

  //由Jad v1.5.8g反编译,版权所有2001 Pavel Kouznetsov。

  //Jad主页:http://www.kpdus.com/jad.html

  //反编译器选项:packimports(3)

  //源文件名:Decompilation.java

  package com.yveshe

  导入Java . io . printstream;

  公共类反编译

  {

  公共反编译()

  {

  }

  公共静态void main(String args[])

  {

  String str= world

  字符串s;

  开关((s=str)。hashCode())

  {

  默认值:

  打破;

  案例99162322:

  if(s.equals(hello ))

  system . out . println( hello );

  打破;

  案例113318802:

  if(s.equals(world ))

  system . out . println( world );

  打破;

  }

  }

  }看看上面的代码。这不就是标准的java源代码吗?可以清楚的看到,原字符串的切换是通过equals()和hashCode()方法实现的。

  CFR

  JAD很好用,可惜很久没更新了,只能换个新工具了。CFR是个不错的选择。和JAD相比,他的语法可能稍微复杂一点,不过还好,他会用。

  现代的Java特性——Java 8 lambdas(Java和早期版本的Java beta 103)会被CFR反编译,Java 7 String已经反编译,但是CFR完全是用Java 6写的。

  建议您通过JavaC Decompilation.java命令手动编译生成Decompilation.class文件,然后进行测试。

  的成功反编译结果如下:

  /*

  *用CFR 0_125反编译。

  */

  package com.yveshe

  导入Java . io . printstream;

  公共类反编译{

  公共静态void main(String[] args) {

  字符串str

  String s=str= world

  switch (s.hashCode()) {

  默认值:{

  打破;

  }

  案例99162322: {

  如果(!s . equals( hello ))break;

  system . out . println( hello );

  打破;

  }

  案例113318802: {

  如果(!s . equals( world ))break;

  system . out . println( world );

  }

  }

  }

  }和Jad相比,CFR的参数很多,而且只是代码。如果我们使用以下命令,输出结果将会不同:

  E:\CRFjava -jar cfr_0_125.jar反编译. class

  /*

  *用CFR 0_125反编译。

  */

  package com.yveshe

  导入Java . io . printstream;

  公共类反编译{

  公共静态void main(String[] args) {

  字符串str

  String s=str= world

  switch (s.hashCode()) {

  默认值:{

  打破;

  }

  案例99162322: {

  如果(!s . equals( hello ))break;

  system . out . println( hello );

  打破;

  }

  案例113318802: {

  如果(!s . equals( world ))break;

  system . out . println( world );

  }

  }

  }

  }-DecoderStringswitch表示解码交换机支持字符串的细节。

  类似的还有- decodeenumswitch,-decodefinedly,- decodelambdas等。

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

  JD-GUI

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

  JadClipse

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

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

  JadClipse下载地址在官网下载插件的jar包,然后把jar包放到eclipse的plugins目录下;打开Eclipse,Eclipse-窗口-首选项-Java。这个时候你会发现JadClipse比以前多了一个选项。如下图所示配置JadClipse:

  基本配置完成后,我们可以设置类文件的默认打开方式:

  eclipse-Window-Preferences-General-Editors-File Associations我们可以看到打开类文件有两种方式。这里设置了JadClipse和Eclipse自己的类文件查看器,默认设置为JadClipse。

  配置完成。现在我们可以查看源代码,选择要查看的类,按F3查看源代码。如果JadClipse不是缺省设置,可以将其设置为缺省设置。

  更多java知识,请关注java基础课程专栏。这就是java反编译的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: