<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Java類編譯與反編譯基礎

    簡單的說Java源碼就是未經編譯的.java文件,我們可以很輕松的閱讀其中的代碼邏輯,而字節碼.class文件則是.java文件經過編譯之后產生的字節碼文件,因為.class文件是編譯后的二進制文件所以我們是無法直接閱讀的,只能通過反編譯工具將二進制文件轉換成java代碼或者ASM代碼

    示例代碼Test.java:

    /**
     * @author yz
     */
    public class Test {
    
        public static void hello() {
            System.out.println("Hello~");
        }
    
        public void world() {
            System.out.println("World!");
        }
    
        public static void main(String[] args) {
            hello();
        }
    
    }
    

    Test.java編譯執行流程:

    3
    Test.java 源碼、字節碼

    4

    由于class文件的可讀性較差,通常我們需要使用Java反編譯工具來反編譯代碼。我們通常會使用到JD-GUIIDEA Fernflower插件Bytecode-ViewerFernflowerJADJBEJEB 等工具來反編譯class。

    其中JD-GUI可能是目前反編譯中使用的最多的工具了,但是個人覺得JD-GUI的反編譯能力遠不如經過IDEA(IDEA應該是使用的改版后的Fernflower),因為IDEA默認支持對jarclass的反編譯,所以我個人強烈推薦使用IDEA來反編譯class代碼。

    當然,反編譯工具很多時候也不是萬能的,JD-GUI經常遇到無法反編譯或反編譯過程中程序直接崩潰的情況,遇到這類情況我們通常可以使用IDEA反編譯試試,如果IDEA也無法反編譯可以使用JBE來加載class文件讀取程序的字節碼,如果JBE仍無法讀取類信息還可以使用JDK自帶的javap命令來讀取class類字節碼,如果上訴所有的方法都無法反編譯,那么恐怕是這個類本身就存在無法編譯問題要么可能就是類文件被加密處理過。可能你會說java編譯的class不是說不可以加密嗎?沒錯,這里所說的加密其實是為了保護編譯后的class代碼不可反編譯,通過實現自定義ClassLoaderloadClass加密后的類方式而已,這種加密方式曾在實戰中也有遇到。

    2. 反編譯整個Jar技巧

    通常我們在某些特殊的場景下拿到的只是jar文件,那么我們應該如何反編譯整個jar包的class文件呢?

    2.1. Fernflower

    Fernflower可以很輕松的實現jar的完整反編譯,執行如下命令即可: java -jar fernflower.jar jarToDecompile.jar decomp/ 其中jarToDecompile.jar是需要反編譯的jar文件,decomp是反編譯后的class文件所存放的目錄。需要注意的是Fernflower如遇無法反編譯的情況可能會生成空的java文件!

    2.2. JD-GUI

    JD-GUI是一個帶GUI的反編譯工具,在JD-GUI的菜單中點擊File–>Save All Sources即可反編譯jar。

    2.3. IDEA

    IDEA默認就支持jar包反編譯,同時還支持class文件名(??F)、類方法名稱(??O)搜索。

    2.4. Bytecode-Viewer

    FernFlower提供了GUI版本Bytecode-Viewer,Bytecode-Viewer提供了直接反編譯的classjarzipapkdex功能,直接拖拽jar就可以直接對整個jar進行反編譯了。

    4.1

    2.5. Find命令

    find命令并不能支持Java反編譯,但是find命令可以非常方便的搜索經過編譯后的二進制文件中的內容,所以有的時候使用find命令通常是最簡單實用的,直接解壓jar包然后使用find命令搜索: find ./ -type f -name "*.class" |xargs grep XXXX 即可搞定。

    2.6 使用Find命令和Fernflower實現批量反編譯jar

    當我們只有項目war包且源碼經過打包后發布到WEB-INF/lib的情況下,我們不得不去找出待審計源碼的具體jar文件并反編譯。遇到這種情況我們可以巧妙的使用find命令來反編譯所有目標的jar包。

    這里以jcms的一個非常老版本為例,jcms最終給客戶部署的war包中源碼并不是在WEB-INF/classes目錄下,而是將整個jcms系統按模塊打包成了多個jar包放在了WEB-INF/lib目錄下。我們可以通過搜索com.hanweb包名稱來找出所有jar中包含了jcms的文件并通過Fernflower來反編譯。

    java -jar /Users/yz/Desktop/javaweb-decomplier/javaweb-decomplier.jar -dgs=1 $(find /Users/yz/Desktop/jcms/WEB-INF/lib/ -type f -name "*.jar" |xargs grep "com.hanweb" |awk '{print $3}') /Users/yz/jcms-decomplier
    

    執行上面的命令后會在jcms-decomplier目錄下看到所有的jar已經被Fernflower反編譯了。

    4.2

    依賴的jar: javaweb-decomplierIntellij java-decompiler

    3. IntelliJ IDEA 推薦

    IntelliJ IDEAJetbrains出品的一款非常強大的Java IDE,IDEA提供了強大的代碼搜索、近乎完美的反編譯、動態調試等功能可以最大程度的輔助我們代碼審計。

    不可以否認,與IDEA相比雖然Eclipse和Netbeans也有與之類似的功能,但是在真正的實戰體驗中個人更傾向于使用IDEA,雖然曾經的我也是一個重度Eclipse開發者。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类