編程語(yǔ)言
編程語(yǔ)言(Programming Language)分為低級(jí)語(yǔ)言(Low-level Language)和高級(jí)語(yǔ)言(High-level Language)。
低級(jí)語(yǔ)言: 機(jī)器語(yǔ)言(Machine Language)和匯編語(yǔ)言(Assembly Language),直接用計(jì)算機(jī)指令編寫(xiě)程序。
高級(jí)語(yǔ)言: C、C++、Java、Python等屬于高級(jí)語(yǔ)言,用語(yǔ)句(Statement)編寫(xiě)程序,語(yǔ)句是計(jì)算機(jī)指令的抽象表示。
編譯
將便于人編寫(xiě)、閱讀、維護(hù)的高級(jí)計(jì)算機(jī)語(yǔ)言所寫(xiě)成的源代碼程序,翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低階機(jī)器語(yǔ)言的程序的過(guò)程就是編譯。負(fù)責(zé)這一過(guò)程的處理的工具叫做編譯器。Java語(yǔ)言中負(fù)責(zé)編譯的編譯器是一個(gè)命令:javac 。
javac是收錄于JDK中的Java語(yǔ)言編譯器。該工具可以將后綴名為.java的源文件編譯為后綴名為.class的可以運(yùn)行于Java虛擬機(jī)的字節(jié)碼。
反編譯
反編譯的過(guò)程與編譯剛好相反,就是將已編譯好的編程語(yǔ)言還原到未編譯的狀態(tài),也就是找出程序語(yǔ)言的源代碼。就是將機(jī)器看得懂的語(yǔ)言轉(zhuǎn)換成程序員可以看得懂的語(yǔ)言。Java語(yǔ)言中的反編譯一般指將class文件轉(zhuǎn)換成java文件。
Java常用反編譯工具
JAVAP
javap是jdk自帶的一個(gè)工具,可以對(duì)代碼反編譯,也可以查看java編譯器生成的字節(jié)碼。javap和其他兩個(gè)反編譯工具最大的區(qū)別是他生成的文件并不是java文件,也不像其他工具生成代碼那樣更容易理解。
javap并沒(méi)有將字節(jié)碼反編譯成java文件,而是生成了一種我們可以看得懂字節(jié)碼。其實(shí)javap生成的文件仍然是字節(jié)碼,只是程序員可以稍微看得懂一些。如果你對(duì)字節(jié)碼有所掌握,還是可以看得懂。其實(shí)就是把String轉(zhuǎn)成hashcode,然后進(jìn)行比較。
JAD
JAD是一個(gè)比較不錯(cuò)的反編譯工具,只要下載一個(gè)執(zhí)行工具,就可以實(shí)現(xiàn)對(duì)class文件的反編譯。 由于已經(jīng)很久未更新,反編譯java8時(shí)會(huì)出現(xiàn)編譯失敗,比如lambda表達(dá)式。
命令:jad.exe xxx.class 會(huì)生成一個(gè)xxx.jad的文件
CFR
CFR是一個(gè)不錯(cuò)的選擇,相比JAD來(lái)說(shuō),他的語(yǔ)法可能會(huì)稍微復(fù)雜一些,但是好在他可以用。
java -jar cfr_0_110.jar xxxx.class --decodestringswitch false
--decodestringswitch 表示對(duì)于switch支持string的細(xì)節(jié)進(jìn)行解碼
--decodelambdas 對(duì)lambda表達(dá)式進(jìn)行反編譯。
JD-GUI
JD-GUI 是一個(gè)用 C++ 開(kāi)發(fā)的 Java反編譯工具,由 Pavel Kouznetsov開(kāi)發(fā),支持Windows、Linux和蘋(píng)果Mac Os三個(gè)平臺(tái)。而且提供了Eclipse平臺(tái)下的插件JD-Eclipse。JD-GUI 基于GPLv3開(kāi)源協(xié)議,對(duì)個(gè)人使用是完全免費(fèi)的。JD-GUI主要的是提供了可視化操作,直接拖拽文件到窗口既可,效果圖如下:

如何防止反編譯
提供幾種思路:
● 隔離Java程序
● 對(duì)Class文件進(jìn)行加密
● 對(duì)代碼進(jìn)行混淆