Java中的编译、反编译和反编译工具全家桶分享

前言

本文介绍到的反编译工具下载地址:反编译工具全家桶 , 提取码:oxor

编程语言

编程语言分为低级语言和高级语言

1
2
3
4
5
6
graph LR
编程语言-->低级语言
编程语言-->高级语言
低级语言-->机器语言
低级语言-->汇编语言
高级语言-->C/C++/Java/Python....

最早的程序员都是用机器语言在写代码,那时候应该不叫代码,叫写十六进制串,这样的编程十分复杂不方便而且出错率高

后来有一个偷懒的程序员把机器语言中一组一组通用的十六进制用助记符来代替,这种通过助记符的方式被称作汇编语言,用助记符和部分机器语编写程序,最终执行前让汇编器将助记符转换成机器语言。

然鹅,无论是机器语言还是汇编语言,后来的程序员觉得还是很麻烦,于是又有几个偷懒的程序员他们先后创造了c、c++、java、python…

编译

程序员编程是通过高级语言,而计算机执行程序只认识机器语言,那么将高级语言翻译成机器语言的过程就叫做编译。负责执行这一过程的工具叫做编译器

举个例子:

Java语言属于高级语言,计算机不认识

.class文件属于编译后的Java虚拟机认识的字节码文件

Java文件通过Java语言中的编译器javac编译后生成.class字节码文件

说明:字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是Java虚拟机做的,这个过程也叫编译。是更深层次的编译。

反编译

反编译当然就是编译的逆向操作了,将机器认识的机器语言转换成程序员认识的高级语言。

举个例子:
Java种将.class文件转换成Java文件,这一过程就是反编译。

Java中常用的反编译工具

javap

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。

用法:javap <options> <classes>

javap命令算是java自己原装的反编译工具,但是他反编译后的代码阅读性不太好,我们也可以用其他方式进行反编译。

JD-GUI

JD-GUI是一个独立的图形实用程序,支持Windows、Linux和苹果Mac Os三个平台,可对“.class”文件进行反编译。可以使用JD-GUI浏览重建的源代码,以便即时访问方法和字段。

jd-dui官方示意图

JD-GUI在1.4.0版本后停止更新了很久,当时的版本对于Java1.7以后的代码兼容性很差,不过最近JD-GUI的恢复更新,并兼容Java9
JD-GUI现在最新的版本是1.5.1,下载jd-gui-1.5.1.jar直接双击执行即可。

github地址

CFR

在JD-GUI断更期间,CFR就被大家广泛使用了。

CFR will decompile modern Java features - up to and including much of Java 9, 10, 12 and beyond, but is written entirely in Java 6, so will work anywhere!

作者表示,CFR可以反编译目前Java 9,10,12及更高版本的大部分功能,但完全用Java 6编写,因此可以在任何地方使用!

CFR的使用也是十分方便,直接下载jar包,通过java -jar执行即可,如下:

java -jar cfr-0.144.jar Demo.class  

最新jar包下载和其他参数使用可参考CFR官网

Procyon

Procyon就很有趣了,它的作者和CFR作者就职同一公司,他们俩在进行一场友谊赛,看看谁能提供更好的反编译器。

Procyon-Decompiler支持JDK1.8类的反编译,并且支持:字符串的Switch、枚举声明方面、注解方面、匿名类、内部类、Java8新接口规范、Java8 Lambda表达式、Java8 方法传递等。

Procyon和CFR的运行方式相同,如下:

java -jar procyon-decompiler-0.5.30.jar Demo.class

最新jar包下载和其他参数使用可参考Procyon地址

Procyon拥有一款第三方的GUI:luyten

如果你习惯像JD-GUI那样操作方便的GUI的话,你可以选择使用Luyten,它是基于Procyon的一款反编译工具,推荐使用哦~
Luyten官方网址

Luyten官方示意图

Fernflower

Fernflower相信经常使用IDEA的同学应该很眼熟叭,他是IDEA自带的反编译工具,我们通过IDEA看到的.class文件内容都是通过Fernflower反编译后的。IDEA中效果如下:

Fernflower.jar下载地址,也可以拉取官方的项目自己在本地进行gradle构建

下好fernflower.jar后也准备好需要编译的jar包。

使用命令行 java -jar fernflower.jar <目标>.jar <文件夹名>/

java -jar fernflower.jar Demo.jar demo/

编译成功后demo文件夹下是一个<文件名>.jar。

可以看到比刚才的目标jar包小一些,解压此jar包就可以查看源码了!

Fernflower github地址

bytecode-viewer(逆向必备!!!)

bytecode-viewer(字节码查看器)一款轻量级的Java字节码查看器,它可以反编译jar包,.class文件、Android APK,并且支持多种反编译器

你可以用CFR、Procyon、Fernflower等同时编译同一个.class文件,并进行结果查看和对比。如下:

是不是很方便呐,github地址 快去下载试试吧。

在线反编译

Java decompiler online

JAVA反向工程网

ps:
部分官网和仓库需要翻墙才可以下载,我这边已经为大家准备好了反编译工具全家桶 , 提取码:oxor

总结

了解编译和反编译的基本概念后,其实反编译可以使我们更好的了解Java代码真实的面目,Java中有很多的语法糖,通过反编译可以很好的了解和学习这些语法糖的实现原理。

---------- 😏本文结束  感谢您的阅读😏 ----------
评论