Java 编译和反编译

2018-08-28  本文已影响0人  天生小包

编程语言

编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language)。

低级语言: 机器语言(Machine Language)和汇编语言(Assembly Language),直接用计算机指令编写程序。
高级语言: C、C++、Java、Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

编译

将便于人编写、阅读、维护的高级计算机语言所写成的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序的过程就是编译。负责这一过程的处理的工具叫做编译器。Java语言中负责编译的编译器是一个命令:javac 。

javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

反编译

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

Java常用反编译工具

JAVAP

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件,也不像其他工具生成代码那样更容易理解。

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

JAD

JAD是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译。 由于已经很久未更新,反编译java8时会出现编译失败,比如lambda表达式。

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

CFR

CFR是一个不错的选择,相比JAD来说,他的语法可能会稍微复杂一些,但是好在他可以用。

java -jar cfr_0_110.jar xxxx.class --decodestringswitch false 

--decodestringswitch 表示对于switch支持string的细节进行解码
--decodelambdas 对lambda表达式进行反编译。

JD-GUI

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


image.png
如何防止反编译

提供几种思路:
● 隔离Java程序
● 对Class文件进行加密
● 对代码进行混淆

上一篇下一篇

猜你喜欢

热点阅读