Java 編譯和反編譯

編程語(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主要的是提供了可視化操作,直接拖拽文件到窗口既可,效果圖如下:


image.png
如何防止反編譯

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java的編譯和反編譯 什么是編譯 編譯就是把C、C++、Java等高級(jí)語(yǔ)言轉(zhuǎn)換成匯編語(yǔ)言、機(jī)器語(yǔ)言等低級(jí)語(yǔ)言的過(guò)...
    人在碼途閱讀 6,177評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評(píng)論 25 709
  • 編譯 編程語(yǔ)言有高級(jí)和低級(jí)之分。所謂低級(jí)語(yǔ)言就是指可以被計(jì)算機(jī)理解并執(zhí)行的語(yǔ)言,例如機(jī)器語(yǔ)言。而高級(jí)語(yǔ)言計(jì)算...
    still_loving閱讀 1,890評(píng)論 0 4
  • 你,是上天派在我身邊的天使 每周約定 不論風(fēng)雨 訴衷腸 不約而同的撞衫 每天的呼叫 已經(jīng)成為彼此生命中重要的一部分...
    麗娜_靈魂有香氣的鋼琴老師閱讀 343評(píng)論 0 0
  • 沉魚(yú)浣紗魚(yú)忘游, 落雁和親雁悲留。 閉月浮云遮明月, 羞花落淚葉卷球。
    姜德馨閱讀 218評(píng)論 0 0

友情鏈接更多精彩內(nèi)容