2008-11-07 146 views
542

我可以使用什麼程序來反編譯類文件?我真的會得到Java代碼,還是隻是JVM彙編代碼?如何「反編譯」Java類文件?

關於本站點上的Java性能問題,我經常看到有人對Java類文件進行了「反編譯」,以瞭解編譯器如何優化特定的東西。

+4

「反編譯」的藝術也可以被認爲是逆向工程。儘管有時在逆向工程時,您並不總是可以訪問二進制文件。 – Makach 2009-06-13 10:53:08

+0

沒有人提到https://bytecodeviewer.com/,它可以反編譯爲java源代碼和字節碼(對於java源代碼是基於JAD的)。 – 2018-01-08 16:32:44

回答

576

更新2016年2月:

www.javadecompilers.com名單JAD的存在:

最流行的Java反編譯器,但主要只是這個時代的。用C++編寫,非常快速。
過時,不支持,不正確編譯Java 5的,後來

所以你的里程可能與近期的JDK變化(7,8)。

相同的網站列表其他工具。

而且javadecompiler,由Salvador Valenciathe comments(9月2017)指出,提供在那裏你將.class文件上傳到雲中的SaaS和返回你反編譯的代碼。


原來的答覆:2008年10月

  • JSR 176的最終版本,定義J2SE 5.0(Java SE的5)的主要特點,已發表於9月30日,2004年
  • 由Pavel Kouznetsov先生編寫的着名Java反編譯器JAD支持的最新Java版本是JDK 1.3
  • 今天從互聯網上下載的大多數Java反編譯器,比如「DJ Java Decompiler」或「Cavaj Java Decompiler」,都是由JAD支持的:它們不能顯示Java 5源代碼。

Java Decompiler(另一種快速的Java反編譯器)有:

  • 反編譯和分析的Java 5+「.class」文件的明確支持。
  • 一個漂亮的GUI:

它的工作原理與JDK 1.1.8編譯器高達JDK 1.7.0,和其他人(JikesJRockit等)。

它具有實際功能完全正常的在線live demo version!您只需在頁面上放置一個jar文件,然後查看反編譯的源代碼,而無需安裝任何內容。

+4

+1值得一提的是它也是模塊化的,所以核心(用C++ )可以在其他地方使用。 – 2010-05-05 04:02:28

+1

jd-gui-0.3.3也可以[這裏](http://code.google.com/p/innlab/downloads/detail?name=jd-gui-0.3.3.windows.zip&can=2&q=) – amaidment 2012-07-03 07:55:16

6

看看cavaj

+3

這也使用下面的`jad`。 – 2009-09-18 23:47:16

51

要查看Java源代碼,請查看一些反編譯器。去搜索jad

如果要查看字節碼,只需使用javap隨JDK提供。

+4

我會推薦其中一個開源反編譯器,因爲它們是積極開發的。使用[Procyon](https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler),[CFR反編譯器](http://www.benf.org/other/cfr/)或[Krakatau]( https://開頭github上。com/Storyyeller/Krakatau)(Python)。 – 2013-08-22 11:26:40

98

有幾個反編譯器有...快速搜索率:

  1. Procyon:開源(Apache 2的),並積極開發
  2. Krakatau:開源(GPL第三版)積極開發
  3. CFR:開源(MIT),並積極開發
  4. JAD
  5. DJ Java Decompiler
  6. Mocha

還有更多。

這些產生Java代碼。 Java帶有一些讓你看到JVM字節碼的東西(javap)。

+2

我還可以補充一點,Procyon,CFR,JAD和DJ可以作爲網絡服務使用:http://www.javadecompilers.com/ – 2015-12-12 11:21:33

+0

http://www.javadecompilers.com/ - lifesaver bro! – MarcoZen 2016-02-08 20:50:40

+0

http://www.kpdus.com/jad.html是一些廣告鏈接 – marcinj 2016-11-07 15:15:05

10

有幾個程序可以使用。您將獲得實際的Java代碼,但有時代碼會被混淆,因此方法以一個字母或數字或隨機組合的字母和數字命名。

DJ Decompiler Mocha

9

Java的大多數反編譯器基於JAD。這是一個很棒的工具,但不幸的是一段時間沒有更新,並且不能很好地處理Java 1.5+類。我還沒有看到任何能夠正確處理1.5+課程的工具。

+3

在這裏你:我剛剛發佈了一個答案你的答案;)支持JDK1.5和更多! – VonC 2008-11-07 16:19:16

+0

「我還沒有看到任何能夠正確處理1.5個以上類的工具」 - Procion,Fernflower,JDCore和CFR(這個可以處理Java 8!) – 2015-08-11 15:56:41

13

Soot是較新Java代碼的選項。至少它的優勢仍然是最近維護...

另外,Java Decompiler是一個反編譯器,同時具有獨立的GUI和Eclipse集成。

最後,Jdec還沒有被提及,雖然它沒有像其他選項一樣精緻。

5
  • JAD是一個工作,很簡單。

  • 另外,如果你只是想看到的方法,使用javap。

12

JD-GUI確實不錯。您可以打開一個JAR文件並瀏覽代碼,就好像您正在使用IDE的 一樣。好東西。

6

到目前爲止所列出的所有JAD鏈接似乎都被破壞了,所以我找到了這個網站。很好用(至少對於Linux來說)!在Ubuntu 11.10上,我不得不下載任何原因的靜態文件。

http://www.varaneckas.com/jad

5

如果你想看到Java編譯器如何做某些事情,你不想反編譯,想要拆卸。反編譯涉及到將字節碼轉換爲Java源代碼,這意味着很多低級信息都會丟失,如果您想知道編譯器優化的問題,這可能是您感興趣的信息。

無論如何,我會發生寫了一個open source Java disassembler。與Javap不同的是,即使在高度病態的類上也是如此,所以你可以看到什麼模糊處理工具正在爲你的類做些什麼。它也可以反編譯,儘管我不推薦它。

13

Procyon包括反編譯器。這是FOSS。

4

JAD不適用於我(Ubuntu 11.10版本),所以我已經向前移動並在JODO上擦拭。至少它有Open Java源代碼,並且能夠正確地反編譯我的.class

我推薦先查看'branches/generic'分支。樹幹不穩定。

28

我試了幾次,而Procyon似乎對我最好。它正處於積極的發展階段,並且支持最新版本的Java的許多功能。

這是我試過的人:

  • CFR
    • 看好,但往往失敗的方法反編譯。我會密切關注這一點。還積極開發支持最新的Java功能。
  • Krakatau
    • 採用不同的方法,因爲它會嘗試,而不是試圖重建原始源,它具有使之成爲混淆代碼更好的潛力,同等輸出的Java代碼。從我的測試結果來看,它大致與普羅西恩相差無幾,但仍然很高興擁有不同的東西。我確實必須使用-skip命令行標誌,因此它不會因錯誤而停止。積極開發,有趣的是它是用Python編寫的。
  • JD-GUI
  • JAD
    • 工作,但只支持Java 1.4及以下。也可作爲Eclipse plugin。不再發展中。
9

這裏是爲2015年2月的反編譯器的列表:

南河,開源,https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR,自由,沒有可用的源代碼,http://www.benf.org/other/cfr/

JD,免費用於非商業用途僅有英文,http://jd.benow.ca/

Fernflower,開源,https://github.com/fesh0r/fernflower

JAD - 在這裏給出的只是由於歷史的原因。免費,無源代碼可用,http://varaneckas.com/jad/ 過時,不受支持,並且不能正確反編譯Java 5及更高版本。

你可以在線測試上述反編譯器,不需要安裝,並做出自己的教育選擇。

的Java反編譯器在雲:http://www.javadecompilers.com/

1

隨着AndroChef Java Decompiler可以APK反編譯,DEX,罐子和Java類文件。這很簡單,容易。 AndroChef JD基於FernFlower。你可以評估它在10個免費的用途。

AndroChef支持Java語言功能,如泛型,枚舉和註釋。根據一些研究,AndroChef Java Decompiler能夠反編譯傳統Java編譯器生成的Java應用程序的98.04% - 具有非常高的恢復率。這是一個簡單但功能強大的工具,它允許您將Java和Dalvik字節碼(DEX,APK)反編譯爲可讀的Java源代碼。