java反编译工具_漫话:如何给女朋友解释什么是编译与反编译
戳藍字“CSDN云計算”關注我們哦!
來源 | 漫話編程
某天下班后,我在家里進行電話面試,問到面試者這樣一個問題:"你知道使用哪些辦法可以反編譯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
JD-GUI是一個獨立的圖形實用程序,顯示“.class”文件的Java源代碼。您可以使用JD-GUI瀏覽重建的源代碼,以便立即訪問方法和字段。
如何防止反編譯
由于我們有工具可以對Class文件進行反編譯,所以,對開發人員來說,如何保護Java程序就變成了一個非常重要的挑戰。
但是,魔高一尺、道高一丈。當然有對應的技術可以應對反編譯。
但是,這里還是要說明一點,和網絡安全的防護一樣,無論做出多少努力,其實都只是提高攻擊者的成本而已。無法徹底防治。
典型的應對策略有以下幾種:
隔離Java程序,讓用戶接觸不到你的Class文件
對Class文件進行加密,提到破解難度
代碼混淆,將代碼轉換成功能上等價,但是難于閱讀和理解的形式
如阿里巴巴開源的分布式事務中間件的jar包就通過混淆技術進行了加密,反編譯后內容如下:

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