应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译

news/2024/7/7 19:37:48

概述

反编译是一个将目标代码转换成源代码的过程。而目标代码是一种用语言表示的代码 , 这种语言能通过实机或虚拟机直接执行。文本所要介绍的 JD-Eclipse 是一款反编译的开源软件,它是应用于 Eclipse 开发平台的插件,它可以帮助开发人员在调试程序的过程中显示所有的 Java 源代码,方便了开发人员的开发工作。

JD-Eclipse 的安装及配置

高级语言源程序经过编译变成可执行文件,反向编译就是其逆过程。但是由于反向编译的复杂性,通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。本文介绍了如何应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译,这种方法简单实用,运用 JD-Eclipse 插件应用于 RFT,使 RFT 具有更多方面的应用,方便了用户对 .class 文件的操作,不需要单独应用反向编译器进行方向编译的工作。

当 C 编译器编译生成一个对象的目标代码是,该目标代码是为某一个特定的硬件平台运行而产生的,在编译过程中,编译程序通过查表将所有符号的引用转换为特定的内存编译量。目标代码只能在特定的 CPU 上运行。而 Java 编译器为了保证目标代码的可移植性,并不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由 Java 虚拟机在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。由于其相对简单的 Java 虚拟机和规范的字节码格式,由 Java 字节码反编译成源代码的过程相对于 C 语言来说要简单,所以当前反编译 Java 程序非常流行。

目前有多种对于 Java 的反编译软件,下面本文将介绍一款开源的反编译软件 JD-Eclipse。JD-Eclipse 是一个插件 Eclipse 平台。它允许您调试所有的 Java 源代码。为了能够更为详实的说明 JD-Eclipse 的应用方法,下面主要介绍了 JD-Eclipse 的安装及配置过程,使开发人员能够更为快捷便利地使用。

目前有两种方式进行安装 JD-Eclipse 插件。第一种是利用 RFT 中“安装更新软件”的选项进行安装;下面本文将主要介绍手动安装的安装方法。

1. 下载相应的安装文件:jd.ide.eclipse_X.X.X.jar;jd.ide.eclipse.win32.x86_ X.X.X.jar;jd.edi.eclipse.feature_X.X.X.jar。其中 JD-Eclipse 插件提供了 Liunx,Mac 平台的相应的 jar 文件,本文以 Windows 平台为例作介绍。

2. 将 jd.ide.eclipse_X.X.X.jar;jd.ide.eclipse.win32.x86_ X.X.X.jar 这两个 jar 文件拷到安装 RFT 的文件夹中 plugins 的路径下面。

图 1. 拷入 jar 文件到 plugins 中
图 1. 拷入 jar 文件到 plugins 中

3. 将 jd.edi.eclipse.feature_X.X.X.jar 文件拷到安装 RFT 的文件夹中 features 的路径下面。

图 2. 拷入 jar 文件到 features 中
图 2. 拷入 jar 文件到 features 中

4. 重新启动 RFT。

5. 打开 RFT,Windows->Preferences->General->Editors->File Assciation,将 Class File Editor 设置为 default。

图 3. 设置默认显示
图 3. 设置默认显示

对于存在原始码的类,他不会强行反编译,也就是说他还是会用 eclipse 自带的 Class File Viewer 查看 class 文件。

 

JD-Eclipse 的使用及相关讨论

首先本节介绍了 JD-Eclipse 的应用方法,然后通过一个具体的应用实例来介绍 JD-Eclipse 的具体使用方法。文本采用 RFT 作为 Java 的开发平台,所以 JD-Eclipse 是安装在 RFT 上的一个插件进行相关讨论的。

一、JD-Eclipse 的应用方法

首先需要将反编译的文件打成 jar 的 java 包。

例如将文件 JavaTest 打成一个包,JavaTest 文件中有许多的 .class 文件。

图 4. Java 中的 .class 文件
图 4. Java 中的 .class 文件

jar 包生成方法如下面步骤所示。

1. 导入相应的工程。

2. 选择 Flie->Export->Jar file。

图 5. 选择 Jar 文件
图 5. 选择 Jar 文件

3. 将 .class 文件导入并选择存储地址。

图 6. 导入工程
图 6. 导入工程

4. 生成一个 javatest.jar 文件

图 7. 生成 Jar 文件
图 7. 生成 Jar 文件

二、JD-Eclipse 的应用实例

生成 jar 文件后需要将 jar 文件构建到工程文件中。

图 8 是没有反编译之前的所看到的文件内容。开发人员不能看到 .class 文件中的信息,对于开发人员调试代码带来的相对复杂的问题。

图 8. 反编译前的 .class 文件显示信息
图 8. 反编译前的 .class 文件显示信息

采用 JD-Eclipse 插件后,可以清楚地显示出文件内容,方便开发人员的工作,也增强了开发人员在使用 RFT 过程中的方便程度。

清单 1. 以“CapturePlayback.class”为为例显示的部分代码内容
		 import  java.awt.BasicStroke; 
		 import  java.awt.BorderLayout; 
		 import  java.awt.Color; 
		 import  java.awt.Component; 
		 import  java.awt.Container; 
		 import  java.awt.Dimension; 
		 import  java.awt.Font; 
	
		 public  CapturePlayback(){ 
		 super.setLayout(new BorderLayout()); 
		 EmptyBorder localEmptyBorder = new EmptyBorder(5, 5, 5, 5); 
		 SoftBevelBorder localSoftBevelBorder = new SoftBevelBorder(1); 
		 super.setBorder(new EmptyBorder(5, 5, 5, 5)); 
		 JPanel localJPanel1 = new JPanel(); 
		 localJPanel1.setLayout(new BoxLayout(localJPanel1, 0)); 
		 localJPanel1.add(this.formatControls); 
		 JPanel localJPanel2 = new JPanel(); 
		 localJPanel2.setBorder(localSoftBevelBorder); 
		 JPanel localJPanel3 = new JPanel(); 
		 localJPanel3.setBorder(new EmptyBorder(10, 0, 5, 0)); 
		 this.playB = addButton("Play", localJPanel3, false); 
		 this.captB = addButton("Record", localJPanel3, true); 
		 this.pausB = addButton("Pause", localJPanel3, false); 
		 this.loadB = addButton("Load...", localJPanel3, true); 
		 localJPanel2.add(localJPanel3); 
		 public class Playback implements Runnable{ 
		 SourceDataLine line; 
		 Thread thread; 
		 public void start(){ 
			 CapturePlayback.this.errStr = null; 
			 this.thread = new Thread(this); 
			 this.thread.setName("Playback"); 
			 this.thread.start(); 
		 } 
		 public void stop() { 
			 this.thread = null; 
		 } 
		 private void shutDown(String paramString) { 
			 if ((CapturePlayback.this.errStr = paramString) != null) { 
			 System.err.println(CapturePlayback.this.errStr); 
			 CapturePlayback.this.samplingGraph.repaint(); 
		 } 
		 if (this.thread != null) { 
		 this.thread = null; 
		 CapturePlayback.this.samplingGraph.stop(); 
		 CapturePlayback.this.captB.setEnabled(true); 
		 CapturePlayback.this.pausB.setEnabled(false); 
		 CapturePlayback.this.playB.setText("Play"); 
		 } 
	  } 
	 }

三、JD-GUI 的介绍

JD-Core 也提供了独立的运行软件 JD-GUI,它的功能完全与 JD-Eclipse 插件一样,方便不能使用基于 Eclipse 平台的人员查看反编译的文件。

图 9. JD-GUI 的操作界面
图 9. JD-GUI 的操作界面

将需要反编译的文件导入即可。

图 10. 导入需要反编译的文件
图 10. 导入需要反编译的文件

这款独立的运行软件提供了强大的编辑功能,方便了开发人员对于文件的编辑,处理等操作。

 

总结

本文向读者介绍了如何应用 JD-Eclipse 插件实现 RFT 中 .class 文件的反向编译,这种方法简单实用,运用 JD-Eclipse 插件应用于 RFT,使 RFT 具有更多方面的应用,方便了用户对 .class 文件的操作,不需要单独应用反向编译器进行方向编译的工作。相信 JD-Eclipse 能够帮助开发人员基于 RFT 的操作提供更为方便的插件应用,为开发人员调试程序提供一个较为便捷的方法。

参考资料

学习

  • 参考 JD-Eclipse 手册,可以了解更多的关于 JD-Eclipse 和 JD-GUI 的内容。
  • 参考 ICUJava 反编译和源代码保护,了解反编译和代码保护的相关问题。
  • 参考 JAVA 反编译技术和代码安全,了解反编译技术及代码安全的相关问题描述。
  • 随时关注 developerWorks 技术活动和网络广播。
  • 访问 developerWorks Open source 专区获得丰富的 how-to 信息、工具和项目更新以及最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
  • 加入 IBM 软件下载与技术交流群组,参与在线交流。

http://www.niftyadmin.cn/n/2574509.html

相关文章

C语言作业小学生的算术题,C语言大型作业-教小学生算数.doc

..《C语言工程训练》课程设计题目: 教小学生算数学 生 学 号 :学 生 姓 名 :指 导 教 师 :需求分析通过此系统实现以下功能做个位数,十位数的加,减,乘和除,减法不能得负数&#xff0…

Linux常用功能脚本

设置定时任务crontab -e 1 0 * * * /bin/find /mnt/tomcat/logs/ -mtime 3 -type f -name "*.log" -exec /bin/rm -rf {} \; 每天凌晨一分定时清除Tomcat的日志脚本linux下Tomcat自动备份 1、页面文件在/home/edn/tomcat6/webapps目录下,备份文件存放在/h…

c语言中哪个字母不能在数字后面表示类型,C语言程序设计(40学时)-中国大学mooc-题库零氪...

第一周:程序设计与C语言1.1 计算机和编程语言随堂测验1、计算机本身最擅长的能力是?A、推理B、想像C、重复D、分析2、编程语言是和计算机交谈的语言3、计算机(CPU)可以直接运行人类编写的程序1.2 C语言随堂测验1、关于C语言,以下说法错误的有…

结合领域驱动设计的SOA分布式软件架构 (转)

http://www.cnblogs.com/leslies2/archive/2011/12/12/2272722.html#转载于:https://www.cnblogs.com/mynameltg/p/4254991.html

数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式

阅读目录原码、反码、补码机器数 和 真值原码、反码、补码的基础Python中负数的处理负数的补码如何转成十进制位运算符 和 移位运算符基本概述妙用二进制涉及的算法原码、反码、补码 机器数 和 真值 机器数: 一个数在计算机中的二进制表示形式, 叫做这个数的机器数…

红外线stm32 c语言程序,C语言程序设计之STM32,在这里轻松学习嵌入式编程

C语言是面向过程的,而C++是面向对象的C和C的区别:C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制…

总结的一些JavaScript的冷知识

1、!!将一个值方便快速转化为布尔值 console.log( !!windowtrue );2、不声明第三个变量实现交换 var a1,b2; a[b,ba][0];//执行完这句代码之后 a的值为2 b的值为1了3、&&和||的用法 (学会了立马感觉高大尚了吧) 用代码说话吧 var day(new Date).…

数据结构与算法--迪杰斯特拉算法 Python实现迪杰斯特拉算法 一步一步带你用Python实现迪杰斯特拉算法

阅读目录基本概述图解Python实现基本概述 应用场景: (1)分析一下,虽然还是求最短路径,但是是到各个点的最短路径,假如从G点出发,除了能直接到达的:A、B、E、F,如果要到达…