Java反編譯工具CFR,Procyon簡介
Java反編譯工具有很多,個人覺得使用最方便的是jd-gui,當然jad也不錯,jd-gui主要提供了圖形介面,操作起來很方便,但是jd-gui很久沒有更新了,java 7出來很久了,jd-gui在反編譯java 7的class檔案時候會遇到部分語法不支援的問題,下面我舉幾個例子,我使用的是jd-gui035。
這是java7支援的在switch中使用String,下面可以看jd-gui反編譯的結果:
反編譯結果看起來有點繞,當然結果是一樣的,只是程式碼意圖不直接。
下面看下java 7的資源自動關閉:
jd-gui反編譯的結果為:
我使用的這個jd-gui反編譯報錯,可能是我的版本不是最新的。
再看下java 7的語法糖功能:
jd-gui反編譯結果:
反編譯結果正確,綜上,jd-gui對java 7的資源自動關閉語法不支援。
下面我介紹2個支援java 7語法的反編譯工具,cfr和procyon,可能大家聽說過,我會做個實際例子看下怎麼用。
(一)cfr簡介
cfr官網連結:
http://www.benf.org/other/cfr/
Java程式碼
- CFR will decompile modern Java features - Java 8 lambdas (pre and post Java beta 103 changes), Java 7 String switches etc, but is written entirely in Java 6
這是官網的描述,Jar在附件提供下載。
語法:
反編譯單個class檔案:
Java程式碼
- java -jar cfr_0_59.jar SwitchTest.class
反編譯整個Jar包:
Java程式碼
- java -jar cfr_0_61.jar java7_jar.jar --outputdir D:/Java/tmp
下面是具體使用,仍以上面的class為例,使用cfr進行反編譯:
這個和jd-gui結果一樣,可以看到java7的語法糖只是顯示處理好看些,反編譯出來還是原始的資料型別。
cfr對java 7的自動關閉語法反編譯的結果是顯式在finally裡面新增close方法。
cfr反編譯Switch String使用了Goto 語句,在Goto中使用equals字串比較,比jd-gui反編譯的結果稍微好看些。
可以看出cfr使用還是很方便的。
(二)procyon簡介
procyon官網連結:
https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler
使用語法:
幫助
Java程式碼
- java -jar decompiler.jar
反編譯單個class檔案
Java程式碼
- java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class
反編譯整個Jar包
Java程式碼
- java -jar procyon-decompiler.jar -jar myJar.jar -o out
提醒:
Java程式碼
- Java 7 is required to run
procyon需要java 7環境。
下面仍以上面的class為例,看procyon反編譯的結果
和cfr一樣,procyon反編譯顯式的在finally中關閉資源。
procyon反編譯java 7語法糖顯示原始資料型別。
可以看出procyon對Switch String的反編譯結果最直接。
procyon反編譯Jar也是支援的。
反編譯工具還有 Krakatau,使用了Python 2.7編譯,個人電腦是Python 3.3,執行不了,就沒測試了,感興趣的朋友可以自己測試下。
連結地址:
Java程式碼
- https://github.com/Storyyeller/Krakatau
如果需要反編譯java 7的class,個人推薦使用procyon,其次是cfr。
文章為原創,轉載請註明出處。寫的不好的地方請指出。如果有需要但下載不了附件,請發郵件到[email protected],我會把附件cfr和procyon發給你,謝謝。
全文完。
from: http://53873039oycg.iteye.com/blog/2015192