1. 程式人生 > >Java反編譯工具CFR,Procyon簡介

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程式碼   收藏程式碼
  1. 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程式碼   收藏程式碼
  1. java -jar cfr_0_59.jar SwitchTest.class  

   反編譯整個Jar包:

  

Java程式碼   收藏程式碼
  1. 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程式碼   收藏程式碼
  1. java -jar decompiler.jar  

    反編譯單個class檔案

   

Java程式碼   收藏程式碼
  1. java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class  

    反編譯整個Jar包

   

Java程式碼   收藏程式碼
  1. java -jar procyon-decompiler.jar -jar myJar.jar -o out  

    提醒:

   

Java程式碼   收藏程式碼
  1. 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程式碼   收藏程式碼
  1. https://github.com/Storyyeller/Krakatau  

 

    如果需要反編譯java 7的class,個人推薦使用procyon,其次是cfr。

   

    文章為原創,轉載請註明出處。寫的不好的地方請指出。如果有需要但下載不了附件,請發郵件到[email protected],我會把附件cfr和procyon發給你,謝謝。

    全文完。

 

from: http://53873039oycg.iteye.com/blog/2015192