当前位置:首页 > Java技术 > JAVA反编译工具

JAVA反编译工具

2022年11月06日 20:01:41Java技术12
JAVA 语言是 1995 5 月由 SUN 公司发布的,由于其安全性高、代码优化、跨平台等特性,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位。
不过, JAVA 最突出的跨平台优势使得它不能被编译成本地代码,而要以中间代码的形式运行在虚拟机环境中,这使得 JAVA 的反编译要比别的高级语言容易实现,并且反编译的代码经过优化后几乎可以与源代码相媲美。
为了更好地保护知识产权,避免本公司的智力成果轻易被人窃取,开发者有必要对反编译工具深入了解,以便有针对性地采取保护措施。
目前,比较流行的 JAVA 反编译工具超过 30 种,其中有三款堪称精品:
一、         应用广泛的 JAD
在众多的 JAVA 反编译工具中,有几种非常著名的工具使用了相同的核心引擎—— JAD ,其中主要包括: Front End Plus mDeJava Decafe Pro Cavaj Java Decompiler DJ Java Decompiler NMI’s Java Class Viewer 和国产的 JAVA 源代码反编译专家等等。
JAD 本身是一个命令行工具,没有图形界面,上述的这些工具大多是在 JAD 内核的基础之上加了一个图形界面而已。这么多种产品的共同选择,足可证明 JAD JAVA 反编译领域中的尊贵地位。
笔者用来测试的 JAD 版本是 1.5.8 f。
JAD 是使用 Microsoft Visual C++ 开发的,运行速度非常快,可以处理很复杂的 JAVA 编译文件。众多的参数使 JAD 可以灵活应付多种加密手段,令反编译的代码更加优化和易读。由于 JAD 参数太多,没必要一一解释,其中有几个最常用的如下:
-d - 用于指定输出文件的目录
-s - 输出文件扩展名 ( 默认为 : .jad) ,通常都会把输出文件扩展名直接指定为 .java ,以方便修改的重新编译。
 -8       - Unicode 字符转换为 ANSI 字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。
最常用的反编译指令如下所示:
Jad –d c:/javasource –s .java -8 javatest.class
这条指令将当前目录下的 javatest.class 反编译为 javatest.java 并保存在 c:/javasource 目录里,其中的提示输出为中文,而不是 Unicode 代码。
二、         源码开放的 JODE
JODE 是全球最大的开源项目网站 Sourceforge.net 的成员,不要以为源码开放就小瞧它,在所有的 JAVA 反编译器中, JODE 的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。
JODE 本身也是纯 JAVA 开发的,最近越来越多的 JAVA 反编译软件也选择 JODE 来做它们的核心引擎,例如 JCavaj Java Decompiler BTJ (Back To Java) jEdit's JavaInsight plugin 等。
JODE 是一个可运行的 JAR 文件,在 windows 环境下双击即可运行。
需要特别说明的是, JODE 不是通过常规的 Open->File 的方式来加载 JAVA 编译后的类文件( *.class )或是类包( *.jar )的,而是通过在 Options 菜单中的 Set Classpath 来实现的,单独的类文件可以将它的上一级目录作为 Classpath 输入,然后再选择 Reload Classpath 即可。
  
新加入的类包或是类的名字会在左侧窗口出现,双击类包名可以展开目录树结构,双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。
 
三、         独树一帜的 DAVA
DAVA 不是一个独立的 JAVA 反编译器,而是 JAVA 代码优化工具 Soot 的一部分。 Soot JODE 一样是纯 JAVA 开发的,也是一个独立的 JAR 包,但却不能通过双击直接运行,而是象 JAD 一样在命令行状态运行
Soot 对环境变量的配置要求非常严格,通常情况下要对 CLASSPATH 做如下设置:
Set CLASSPATH=%CLASSPATH%;c:/sootdir/sootclasses-2.1.0.jar;.;
其中的 c:/sootdir/ 是下载的 soot 类包放置的路径, CLASSPATH 末尾的 .; 代表了当前目录,如果不加上这个的话 Soot 经常会报一个找不到类的错误。
      DAVA 是作为 Soot 的一个参数使用的,通常的用法如下:
Java soot.Main –f dava –d c:/javasource javatest
注意最后的类名不用带 .class 后缀,因为它默认是处理 class 文件,这个操作与前述的 JAD 的参数效果相同。
DAVA 采取了流程优化的方式进行反编译,与传统反编译思路不尽相同,但却对改变流程类的加密方法有独特的反编译效果。
 
上述的三种工具各有千秋,但效果都非常不错。经测试,它们基本上都可以把 JDK 自带的一些例程完全反编译,然后不加任何修改可再编译成功,并能正常运行!
(文中工具均经过本人亲手测试,当时用的是jdk1.4.2_03,现在离写文章的时候过了一年多了,jdk都出到1.5了,怕是有些程序也不太好反编了)
 

作者:shaily
来源链接:https://blog.csdn.net/shaily/article/details/1773829

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68209.html

分享给朋友:

“JAVA反编译工具” 的相关文章

两年前写的Java基础总结书

两年前写的Java基础总结书

想法衍生 两年前的我,突发奇想,把自己学的Java基础进行规范化的整理,因为自己的文档编辑能力有限,所以写的排版不是很好,参照图书排版的形式,将书籍进行整理,可以供学习Java基础的朋友参考,由于时间有限,可能也会有问题,请指出。下载地址在最后 截图如下:...

全面了解 Java 原子变量类

📦 本文以及示例源码已归档在 javacore 一、原子变量类简介 为何需要原子变量类 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。 确保线程安全最...

Java 内存模型

Java 内存模型

📦 本文以及示例源码已归档在 javacore Java 内存模型(Java Memory Model),简称 JMM。 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。...

枚举法 之Java实现凑硬币

问题? 如何利用1元五元十元凑硬币 Scanner in=new Scanner(System.in); int amout ; amout=in.nextInt(); for(int one =0;one<=amout;one+...

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看 下面语句: Object ob = new Ob...

初探设计:Java继承何时用?怎么用?

初探设计:Java继承何时用?怎么用?

Writer      :BYSocket(泥沙砖瓦浆木匠) 一、回顾继承 常见的如下: 1、依赖(”uses-a“) 2、聚合(”has-a“) 3、继承(”is-a“)类...

Java并发包基石

Java并发包基石

目录     1 基本实现原理       1.1 如何使用        1.2 设计思想     2 自定义同步器       2.1 同步器代码实现        2.2 同步器代码测试     3 源码分析       ...

Java反射机制

  往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它。当你能够解决这些问题时,便意味着你已经对这项知识入门了。 一、是什么   Java Reflaction in Action有这么一句话,可以解释。反射...

浅谈Java中的hashcode方法

 浅谈Java中的hashcode方法   哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: public native int hashCode();   根据这个...

Java集合:整体结构

Java集合:整体结构

Java中集合类是Java编程中使用最频繁、最方便的类。集合类作为容器类可以存储任何类型的数据,当然也可以结合泛型存储指定的类型(不过泛型仅仅在编译期有效,运行时是会被擦除的)。集合类中存储的仅仅是对象的引用,并不存储对象本身。集合类的容量可以在运行期间进行动态扩展,并且还提供很多很方...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。