java反编译工具_漫话:如何给女朋友解释什么是编译与反编译
戳藍(lán)字“CSDN云計(jì)算”關(guān)注我們哦!
來(lái)源 | 漫話(huà)編程
某天下班后,我在家里進(jìn)行電話(huà)面試,問(wèn)到面試者這樣一個(gè)問(wèn)題:"你知道使用哪些辦法可以反編譯Java代碼嗎?"。但是面試者回答的并不好,所以我在面試評(píng)價(jià)中寫(xiě)到:"對(duì)編譯原理相關(guān)知識(shí)理解的不透徹"。這時(shí),女朋友看到這句話(huà)。
計(jì)算機(jī)語(yǔ)言
計(jì)算機(jī)語(yǔ)言(Computer Language)指用于人與計(jì)算機(jī)之間通訊的語(yǔ)言。計(jì)算機(jī)語(yǔ)言是人與計(jì)算機(jī)之間傳遞信息的媒介。
計(jì)算機(jī)系統(tǒng)最大特征是指令通過(guò)一種語(yǔ)言傳達(dá)給機(jī)器。為了使電子計(jì)算機(jī)進(jìn)行各種工作,就需要有一套用以編寫(xiě)計(jì)算機(jī)程序的數(shù)字、字符和語(yǔ)法規(guī)劃,由這些字符和語(yǔ)法規(guī)則組成計(jì)算機(jī)各種指令(或各種語(yǔ)句)。這些就是計(jì)算機(jī)能接受的語(yǔ)言。
計(jì)算機(jī)語(yǔ)言包括機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言三種。
機(jī)器語(yǔ)言
機(jī)器語(yǔ)言是用二進(jìn)制代碼表示的計(jì)算機(jī)能直接識(shí)別和執(zhí)行的一種機(jī)器指令的集合。機(jī)器語(yǔ)言具有靈活、直接執(zhí)行和速度快等特點(diǎn)。但是不同型號(hào)的計(jì)算機(jī)其機(jī)器語(yǔ)言是不相通的,按著一種計(jì)算機(jī)的機(jī)器指令編制的程序,不能在另一種計(jì)算機(jī)上執(zhí)行。
因?yàn)闄C(jī)器語(yǔ)言是使用二進(jìn)制表示的,所以編出的程序全是些0和1的指令代碼。
機(jī)器語(yǔ)言的優(yōu)點(diǎn)就是可以直接被計(jì)算機(jī)識(shí)別和執(zhí)行,比較高效,但是同時(shí)也有很多缺點(diǎn),如:
1、機(jī)器只認(rèn)識(shí)0和1,程序員很難記住每個(gè)指令轉(zhuǎn)成0和1的組合是什么,需要查大量的表格來(lái)確定每個(gè)數(shù)字表示什么意思
2、因?yàn)樗臅?shū)面形式全是"密"碼,所以可讀性差,不便于交流與合作。
3、因?yàn)樗鼑?yán)重地依賴(lài)于具體的計(jì)算機(jī),所以可移植性差,重用性差。
由于機(jī)器語(yǔ)言有這么多的弊端,于是有了匯編語(yǔ)言。
匯編語(yǔ)言
匯編語(yǔ)言使用助記符(Mnemonics)來(lái)代替和表示特定低級(jí)機(jī)器語(yǔ)言的操作。
助記符(mnemonic)是便于人們記憶、并能描述指令功能和指令操作數(shù)的符號(hào),助記符是表明指令功能的英語(yǔ)單詞或其縮寫(xiě)。如用ADD表示加法、MOV表示傳送、SUB表示減法等。
但是,匯編語(yǔ)言只是讓使用者,即程序員們更加容易記住和使用,計(jì)算機(jī)并不認(rèn)識(shí)匯編語(yǔ)言,所以,想要讓計(jì)算機(jī)執(zhí)行匯編代碼,需要先將匯編程序?qū)⑺鼈冝D(zhuǎn)換成可執(zhí)行的機(jī)器語(yǔ)言代碼。這一過(guò)程被稱(chēng)為匯編過(guò)程。
由于匯編更接近機(jī)器語(yǔ)言,能夠直接對(duì)硬件進(jìn)行操作,生成的程序與其他的語(yǔ)言相比具有更高的運(yùn)行速度,占用更小的內(nèi)存,因此在一些對(duì)于時(shí)效性要求很高的程序、許多大型程序的核心模塊以及工業(yè)控制方面大量應(yīng)用。
機(jī)器語(yǔ)言和匯編語(yǔ)言,二者是幾乎很少或者完全沒(méi)有做任何語(yǔ)法抽象的,這種語(yǔ)言我們通常稱(chēng)之為低級(jí)語(yǔ)言,這種更加接近硬件,而且是不可以在不同硬件間移植的。
但是隨著現(xiàn)代軟件系統(tǒng)越來(lái)越龐大復(fù)雜,大量經(jīng)過(guò)了封裝的高級(jí)語(yǔ)言如C/C++,Pascal/Object Pascal也應(yīng)運(yùn)而生。這些新的語(yǔ)言使得程序員在開(kāi)發(fā)過(guò)程中能夠更簡(jiǎn)單,更有效率,使軟件開(kāi)發(fā)人員得以應(yīng)付快速的軟件開(kāi)發(fā)的要求。
高級(jí)語(yǔ)言
高級(jí)語(yǔ)言是高度封裝了的編程語(yǔ)言,與低級(jí)語(yǔ)言相對(duì)。
它是以人類(lèi)的日常語(yǔ)言為基礎(chǔ)的一種編程語(yǔ)言,使用一般人易于接受的文字來(lái)表示(例如漢字、不規(guī)則英文或其他外語(yǔ)),從而使程序編寫(xiě)員編寫(xiě)更容易,亦有較高的可讀性,以方便對(duì)電腦認(rèn)知較淺的人亦可以大概明白其內(nèi)容。
如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易語(yǔ)言,中文版的C語(yǔ)言習(xí)語(yǔ)言等等,這些語(yǔ)言的語(yǔ)法、命令格式都不相同。
同匯編語(yǔ)言一樣,高級(jí)語(yǔ)言離機(jī)器語(yǔ)言更加遠(yuǎn)了,計(jì)算機(jī)無(wú)法直接誒識(shí)別高級(jí)語(yǔ)言。所以,想要讓計(jì)算機(jī)執(zhí)行高級(jí)語(yǔ)言,就需要將其轉(zhuǎn)化為機(jī)器語(yǔ)言。

程序設(shè)計(jì)語(yǔ)言從機(jī)器語(yǔ)言到高級(jí)語(yǔ)言的抽象,帶來(lái)的主要好處主要有以下幾個(gè)方面:
1、高級(jí)語(yǔ)言接近算法語(yǔ)言,易學(xué)、易掌握,一般工程技術(shù)人員只要幾周時(shí)間的培訓(xùn)就可以勝任程序員的工作;
2、高級(jí)語(yǔ)言為程序員提供了結(jié)構(gòu)化程序設(shè)計(jì)的環(huán)境和工具,使得設(shè)計(jì)出來(lái)的程序可讀性好,可維護(hù)性強(qiáng),可靠性高;
3、高級(jí)語(yǔ)言遠(yuǎn)離機(jī)器語(yǔ)言,與具體的計(jì)算機(jī)硬件關(guān)系不大,因而所寫(xiě)出來(lái)的程序可移植性好,重用率高;
4、由于把繁雜瑣碎的事務(wù)交給了編譯程序去做,所以自動(dòng)化程度高,開(kāi)發(fā)周期短,且程序員得到解脫,可以集中時(shí)間和精力去從事對(duì)于他們來(lái)說(shuō)更為重要的創(chuàng)造性勞動(dòng),以提高程序的質(zhì)量。
編譯
上面提到語(yǔ)言有兩種,一種低級(jí)語(yǔ)言,一種高級(jí)語(yǔ)言。可以這樣簡(jiǎn)單的理解:低級(jí)語(yǔ)言是計(jì)算機(jī)認(rèn)識(shí)的語(yǔ)言、高級(jí)語(yǔ)言是程序員認(rèn)識(shí)的語(yǔ)言。
那么,怎么把程序員寫(xiě)出來(lái)的高級(jí)語(yǔ)言轉(zhuǎn)換成計(jì)算機(jī)認(rèn)識(shí)的低級(jí)語(yǔ)言然后讓計(jì)算機(jī)執(zhí)行呢?
這個(gè)過(guò)程其實(shí)就是編譯!
編譯的主要的目的是將便于人編寫(xiě)、閱讀、維護(hù)的高級(jí)語(yǔ)言所寫(xiě)作的源代碼程序,翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低級(jí)語(yǔ)言的程序,也就是可執(zhí)行文件。
Java語(yǔ)言的編譯
Java語(yǔ)言作為一種高級(jí)語(yǔ)言,想要被執(zhí)行,就需要通過(guò)編譯的手段將其轉(zhuǎn)換為機(jī)器語(yǔ)言。
Java語(yǔ)言的源文件是一個(gè)java文件,要將一個(gè)java文件,轉(zhuǎn)換為二進(jìn)制文件一共要經(jīng)過(guò)兩個(gè)步驟。

首先經(jīng)過(guò)前端編譯器,將java文件編譯成中間代碼,這種中間代碼就是class文件,即字節(jié)碼文件。
然后,在經(jīng)過(guò)后端編譯器,將class字節(jié)碼文件,編譯成機(jī)器語(yǔ)言。
Java的前端編譯器主要是javac, Eclipse JDT 中的增量式編譯器 ECJ 等。
Java的后端編譯器主要是各大虛擬機(jī)實(shí)現(xiàn)的,如HotSpot中的JIT編譯器。
反編譯
前面講過(guò),我們可以通過(guò)編譯器,把高級(jí)語(yǔ)言的源代碼編譯成低級(jí)語(yǔ)言,那么反之,我們亦可以通過(guò)低級(jí)語(yǔ)言進(jìn)行反向工程,獲取其源代碼。這個(gè)過(guò)程,就叫做反編譯。
我們雖然很難將機(jī)器語(yǔ)言反編譯成源代碼,但是,我們還是可以把中間代碼進(jìn)行反編譯的。就像我們雖然不能把經(jīng)過(guò)虛擬機(jī)編譯后的機(jī)器語(yǔ)言進(jìn)行反編譯,但是我們把javac編譯得到的class進(jìn)行反編譯還是可行的。
所以,我們說(shuō)Java的反編譯,一般是將class文件轉(zhuǎn)換成java文件。
反編譯的作用
首先,反編譯對(duì)于學(xué)習(xí)Java來(lái)說(shuō)是一個(gè)很好的手段。
因?yàn)镴ava作為一種編程語(yǔ)言,提供了很多語(yǔ)法糖,如泛型、自動(dòng)裝箱與拆箱等,而這些語(yǔ)法糖Java虛擬機(jī)是不認(rèn)識(shí)的,所以在javac編譯的時(shí)候,就會(huì)進(jìn)行解糖,而得到的class文件中就是解糖后的代碼,這時(shí)候我們把這種解糖后的class文件進(jìn)行反編譯,就可以得到一份java文件,從這份java文件中,我們就可以學(xué)習(xí)到這些語(yǔ)法糖到底是如何實(shí)現(xiàn)的。
其次,有了反編譯的工具,我們就可以把別人的代碼進(jìn)行反編譯,然后學(xué)習(xí)別人的代碼是怎么實(shí)現(xiàn)的。或者可以通過(guò)源代碼查找bug,制作外掛等。
反編譯的工具
Java中有很多反編譯工具,這里簡(jiǎn)單介紹幾種
javap
javap是jdk自帶的一個(gè)工具,可以對(duì)代碼反編譯,也可以查看java編譯器生成的字節(jié)碼。javap生成的文件并不是java文件,而是程序員可以看得懂的class字節(jié)碼文件。
jad
jad是一個(gè)比較不錯(cuò)的反編譯工具,只要下載一個(gè)執(zhí)行工具,就可以實(shí)現(xiàn)對(duì)class文件的反編譯了。
jad是可以把class文件反編譯成java文件的。
但是,jad已經(jīng)很久不更新了,在對(duì)Java7生成的字節(jié)碼進(jìn)行反編譯時(shí),偶爾會(huì)出現(xiàn)不支持的問(wèn)題,在對(duì)Java 8的lambda表達(dá)式反編譯時(shí)就徹底失敗。
地址:http://www.javadecompilers.com/jad
CFR
jad很好用,但是很久沒(méi)更新了,所以只能用一款新的工具替代他,CFR是一個(gè)不錯(cuò)的選擇,相比jad來(lái)說(shuō),他的語(yǔ)法可能會(huì)稍微復(fù)雜一些,但是好在他可以work。
地址:http://www.benf.org/other/cfr/index.html
JD-GUI
JD-GUI是一個(gè)獨(dú)立的圖形實(shí)用程序,顯示“.class”文件的Java源代碼。您可以使用JD-GUI瀏覽重建的源代碼,以便立即訪問(wèn)方法和字段。
如何防止反編譯
由于我們有工具可以對(duì)Class文件進(jìn)行反編譯,所以,對(duì)開(kāi)發(fā)人員來(lái)說(shuō),如何保護(hù)Java程序就變成了一個(gè)非常重要的挑戰(zhàn)。
但是,魔高一尺、道高一丈。當(dāng)然有對(duì)應(yīng)的技術(shù)可以應(yīng)對(duì)反編譯。
但是,這里還是要說(shuō)明一點(diǎn),和網(wǎng)絡(luò)安全的防護(hù)一樣,無(wú)論做出多少努力,其實(shí)都只是提高攻擊者的成本而已。無(wú)法徹底防治。
典型的應(yīng)對(duì)策略有以下幾種:
隔離Java程序,讓用戶(hù)接觸不到你的Class文件
對(duì)Class文件進(jìn)行加密,提到破解難度
代碼混淆,將代碼轉(zhuǎn)換成功能上等價(jià),但是難于閱讀和理解的形式
如阿里巴巴開(kāi)源的分布式事務(wù)中間件的jar包就通過(guò)混淆技術(shù)進(jìn)行了加密,反編譯后內(nèi)容如下:

福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計(jì)算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
推薦閱讀:
IEEE 回應(yīng)禁止華為系審稿人;WiFi聯(lián)盟、藍(lán)牙聯(lián)盟已恢復(fù)華為成員資格;中國(guó)計(jì)算機(jī)學(xué)會(huì):暫時(shí)中止與IEEE通信學(xué)會(huì)合作……
ARM 發(fā)布新一代 CPU 和 GPU,實(shí)現(xiàn) 20% 性能提升!
前端開(kāi)發(fā) 20 年變遷史
北漂杭漂的程序員,是如何買(mǎi)到第一套房子?
“愛(ài)裝X”開(kāi)源組織:“教科書(shū)級(jí)”AI知識(shí)樹(shù)究竟長(zhǎng)什么樣?
500行Python代碼打造刷臉考勤系統(tǒng)
權(quán)游播完了, 你在罵爛尾, 有人卻悄悄解鎖了新操作……
真香,朕在看了!
總結(jié)
以上是生活随笔為你收集整理的java反编译工具_漫话:如何给女朋友解释什么是编译与反编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java变量设置_java的安装与环境变
- 下一篇: 通过电脑给继电器发送指令_三菱FX PL