本文经授权转载自漫话编程(ID:mhcoding)

某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?"。但是面试者回答的并不好,所以我在面试评价中写到:"对编译原理相关知识理解的不透彻"。这时,女朋友看到这句话。

计算机语言 

计算机语言(Computer Language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。

计算机系统最大特征是指令通过一种语言传达给机器。为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句)。这些就是计算机能接受的语言。

计算机语言包括机器语言、汇编语言和高级语言三种。

机器语言

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。机器语言具有灵活、直接执行和速度快等特点。但是不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。

因为机器语言是使用二进制表示的,所以编出的程序全是些0和1的指令代码。

机器语言的优点就是可以直接被计算机识别和执行,比较高效,但是同时也有很多缺点,如:

  • 1、机器只认识0和1,程序员很难记住每个指令转成0和1的组合是什么,需要查大量的表格来确定每个数字表示什么意思

  • 2、因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。

  • 3、因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。

由于机器语言有这么多的弊端,于是有了汇编语言。

汇编语言

汇编语言使用助记符(Mnemonics)来代替和表示特定低级机器语言的操作。

助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。如用ADD表示加法、MOV表示传送、SUB表示减法等。

但是,汇编语言只是让使用者,即程序员们更加容易记住和使用,计算机并不认识汇编语言,所以,想要让计算机执行汇编代码,需要先将汇编程序将它们转换成可执行的机器语言代码。这一过程被称为汇编过程。

由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。

机器语言和汇编语言,二者是几乎很少或者完全没有做任何语法抽象的,这种语言我们通常称之为低级语言,这种更加接近硬件,而且是不可以在不同硬件间移植的。

但是随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。

高级语言

高级语言是高度封装了的编程语言,与低级语言相对。

它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。

如流行的Java、C、C++、C#、Pascal、Python、Lisp、Prolog、FoxPro、易语言、中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。

同汇编语言一样,高级语言离机器语言更加远了,计算机无法直接诶识别高级语言。所以,想要让计算机执行高级语言,就需要将其转化为机器语言。

程序设计语言从机器语言到高级语言的抽象,带来的主要好处主要有以下几个方面:

  • 1、高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;

  • 2、高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;

  • 3、高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;

  • 4、由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高程序的质量。

编译 

上面提到语言有两种,一种低级语言,一种高级语言。可以这样简单的理解:低级语言是计算机认识的语言、高级语言是程序员认识的语言。

那么,怎么把程序员写出来的高级语言转换成计算机认识的低级语言然后让计算机执行呢?

这个过程其实就是编译!编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序,翻译为计算机能解读、运行的低级语言的程序,也就是可执行文件。

Java语言的编译

Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。

Java语言的源文件是一个Java文件,要将一个Java文件,转换为二进制文件一共要经过两个步骤。

首先经过前端编译器,将Java文件编译成中间代码,这种中间代码就是Class文件,即字节码文件。

然后,在经过后端编译器,将Class字节码文件,编译成机器语言。

Java的前端编译器主要是JavaC, Eclipse JDT 中的增量式编译器 ECJ 等。

Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。

反编译

前面讲过,我们可以通过编译器,把高级语言的源代码编译成低级语言,那么反之,我们亦可以通过低级语言进行反向工程,获取其源代码。这个过程,就叫做反编译。

我们虽然很难将机器语言反编译成源代码,但是,我们还是可以把中间代码进行反编译的。就像我们虽然不能把经过虚拟机编译后的机器语言进行反编译,但是我们把Javac编译得到的class进行反编译还是可行的。

所以,我们说Java的反编译,一般是将Class文件转换成Java文件。

反编译的作用

首先,反编译对于学习Java来说是一个很好的手段。

因为Java作为一种编程语言,提供了很多语法糖,如泛型、自动装箱与拆箱等,而这些语法糖Java虚拟机是不认识的,所以在Javac编译的时候,就会进行解糖,而得到的class文件中就是解糖后的代码,这时候我们把这种解糖后的class文件进行反编译,就可以得到一份Java文件,从这份Java文件中,我们就可以学习到这些语法糖到底是如何实现的。

其次,有了反编译的工具,我们就可以把别人的代码进行反编译,然后学习别人的代码是怎么实现的。或者可以通过源代码查找Bug,制作外挂等。

反编译的工具

Java中有很多反编译工具,这里简单介绍几种:

Javap

Javap是JDK自带的一个工具,可以对代码反编译,也可以查看Java编译器生成的字节码。Javap生成的文件并不是Java文件,而是程序员可以看得懂的class字节码文件。

JAD

JAD是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。

JAD是可以把class文件反编译成Java文件的。

但是,JAD已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败。

地址:http://www.javadecompilers.com/jad

CFR

JAD很好用,但是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比JAD来说,他的语法可能会稍微复杂一些,但是好在它可以work。

地址:http://www.benf.org/other/cfr/index.html

JD-GUI

Python 第一地位稳了!微软正式拥抱 Python !

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。

如何防止反编译

由于我们有工具可以对Class文件进行反编译,所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。

但是,魔高一尺、道高一丈。当然有对应的技术可以应对反编译。

但是,这里还是要说明一点,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已。无法彻底防治。

典型的应对策略有以下几种:

  • 隔离Java程序,让用户接触不到你的Class文件

  • 对Class文件进行加密,提到破解难度

  • 代码混淆,将代码转换成功能上等价,但是难于阅读和理解的形式

如阿里巴巴开源的分布式事务中间件的JAR包就通过混淆技术进行了加密,反编译后内容如下:

【END】

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

 热 文 推 荐 

☞快应用 434 天

☞任正非反对制裁苹果;华为海思或发布麒麟新处理器;字节跳动或造智能手机?| 极客头条

☞“Go 仅是 Google 的编程语言,而不是程序员的!”

☞比特币冲到9000美元, 你就能找个好工作?

☞1000 万个“AI 名师”:用机器算法“解剖”应试教育

阿里面试,我挂在了第四轮……

☞10个爬虫工程师必备的工具了解一下

☞为什么说深耕AI领域绕不开知识图谱?

☞如何快速深入理解监控知识? | 技术干货

☞大神!这段代码让程序员躺赚200W,源码简单,你怎么看?

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

漫画:如何给女朋友解释什么是编译与反编译相关推荐

  1. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  2. Java——编译与反编译

    ** 一.基础知识 ** 1.1 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级 ...

  3. 《编译与反编译技术实战 》一2.3 编译器的设计与实现概述

    本节书摘来自华章出版社<编译与反编译技术实战 >一书中的第2章,第2.3节,庞建民 主编 ,刘晓楠 陶红伟 岳 峰 戴超 编著,更多章节内容可以访问云栖社区"华章计算机" ...

  4. 《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

    本节书摘来自华章计算机<编译与反编译技术实战>一书中的第1章,第1.1节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...

  5. 《编译与反编译技术实战》——2.1节编译器、解释器及其工作方式

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章,第2.1节编译器.解释器及其工作方式,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区&quo ...

  6. python源代码的后缀名是_Python代码编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  7. 《编译与反编译技术》——第一章 引论 1.1节编译器与解释器

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.1节,作者庞建民,陶红伟,刘晓楠,岳峰.更多章节内容可以访问云栖社区"华章计算机"公众号查看. 人类之间 ...

  8. 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译

    反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载; -- CSDN 下载地址 : http://download.csdn.net/detai ...

  9. 《编译与反编译技术实战》——第2章编译器实践概述

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章编译器实践概述,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区"公众号查看 第2章 ...

  10. Java代码的编译与反编译那些事儿

    GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...

最新文章

  1. 【转】RelativeLayout和LinearLayout及FrameLayout性能分析
  2. Qt Creator使用3D组件
  3. mcse 2000 认证介绍
  4. ABB 机器人 添加多任务
  5. just for rest~
  6. html tab与jQuery,使用jquery实现div的tab切换实例代码
  7. oracle 查询dbid,查看oracle 数据库的DBID
  8. 怎么去掉网页上复制到word的文章中各种符号例如向下箭头(↓)?
  9. python计算器算法_Python数学运算入门把Python当作计算器
  10. jquery省市县三级导航栏
  11. DW个人网站设计 练习作业
  12. mysql只读模式_mysql 只读模式详解
  13. MySQL数据库出现unknown error 1449错误原因及其解决办法
  14. root用户无法启动vscode的解决方法
  15. VS2008向工具箱中添加控件解决 未能实例化 设计时授权
  16. Oracle常用函数(zzl)
  17. 【微观】需求、供给和均衡价格
  18. 2016 HCTF web writeup
  19. 当地的新员工入职培训
  20. 人本是猴子,该七十二变

热门文章

  1. [Ubuntu] 软链接
  2. [算法] 已知前序和中序遍历,建立二叉树
  3. 【OpenCV应用】python处理行李图像匹配项目——图像特征点
  4. php oci_bind_array_by_name查询,PHP - 函数:OCIBindByName()
  5. python示例异常处理与程序调试_Python错误处理及代码调试方
  6. opencv给视频打马赛克
  7. fastjson反序列化map_最新fastjson反序列化漏洞分析
  8. java spi机制_Java 双亲委派机制的破坏—SPI机制
  9. Python DearPyGui 项目实践
  10. Flutter基础—根据用户输入改变控件