美文网首页
Java 编译和反编译

Java 编译和反编译

作者: 天生小包 | 来源:发表于2018-08-28 19:18 被阅读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文件进行加密
    ● 对代码进行混淆

    相关文章

      网友评论

          本文标题:Java 编译和反编译

          本文链接:https://www.haomeiwen.com/subject/rvwqwftx.html