相信很多開發者都知道反編譯APK,正常情況下,如果我們想要看看xml,看看java原始程式碼,是看不了的。用壓縮工具解壓apk得到的檔也都是二進位檔案,打開後全是亂碼。 開發者能夠用的也僅僅是圖片資源,這往往也滿足不了開發者的需求。 下面我就給大家詳細講解一下Android-apk的反編譯步驟: 注意:反編譯的前提是:開發者沒有使用proguard(java代碼混淆的工具)。 1.下載反編譯工具 需要下載四個工具:dex2jar、JD-GUI、apktool、apktool-install-windows-r05-ibot dex2jar:將apk中的classes.dex轉化成Jar文件。 JD-GUI:反編譯工具,可以直接查看Jar包的原始程式碼。 apktool:反編譯工具,通過反編譯APK中XML檔,直接可以查看。 apktool-install-windows-r05-ibot:輔助windows批次處理工具。 下載地址: JD-GUI:http://jd.benow.ca/ 工具截圖: ![]() 2.解壓縮APK包 apk檔也是一種常見的zip,常用的壓縮軟體就可輕鬆地解壓apk檔。用壓縮軟體將apk檔中的檔解壓到一個資料夾中,得到APK中的資源包括 XML檔和classes.dex文件,classes.dex就是java檔編譯再通過dx工具打包而成的。 解壓截圖: ![]() 3.反編譯dex檔 解壓apk檔後,你會發現res目錄的圖片沒有加密,但java源碼編譯成了一個classes.dex檔,無法用普通的反編譯class檔的方法來處理,dex2jar可以將dex檔轉換成普通的jar包。 解壓下載的dex2jar,把解壓後的資料夾放到系統磁片跟目錄中並把這個目錄加到系統path變數中,就可以直接用:dex2jar.bat或dex2jar.sh轉換dex檔了。 DOS行命令如下:dex2jar.bat xx\classes.dex(xx是classes.dex檔所在的路徑)。 將在同目錄得到普通jar包:classes_dex2jar.jar,就可以用處理普通jar包的方法來反編譯這個jar包得到原文件。 編譯截圖: ![]() 生成jar文件的截圖如下: ![]() 4.反編譯jar包 得到jar包後,下載自已喜歡的反編譯工具,推薦使用JD-GUI,有比較簡單的圖形介面,可以反編譯單個class檔,也可以反編譯jar包,比較方便。 打開壓縮檔JD-GUI,運行jd-gui.exe,打開上面生成的jar包,即可看到原始程式碼了。 截圖如下: ![]() 5.反編譯xml檔 打開解壓的res\layout目錄,有很多xml檔,如果你想看下作者是如何設計介面的,你會很失望,因為你看到的是一大堆亂碼!這個時候我們需要用到的是apktool。 具體操作方法:將下載的apktool和apktool-install-windows-r05-ibot兩個包解壓到同一個資料夾下,這個資料夾有三 個檔:aapt.exe,apktool.bat,apktool.jar。把這個資料夾也放到系統磁片的根目錄中並把這個目錄加到path變數中。以 HelloWord.apk為例: 在DOS命令列中輸入:apktool d xx\HelloWord.apk HelloWord得到HelloWord資料夾,此資料夾中的xml檔就是編譯好的可以正常查看的檔。 截圖如下: ![]() 生成的檔: ![]() 這樣就得到了可以得到編譯的源碼和XML資源。 注意:文件的路径中最好不要出现中文! 學習最好的方式就是模仿和實踐, 在我們對Android App的開發還不是很熟練的話, 借鑒和學習別人的程式寫法, 可以幫助我們快速地學習, 有條理的進行系統理論、框架...等的學習也是必要的. 下面的範例是把 apk 還原成 java source code, 文中所提供的方式僅僅只是為了學習之便,並無其它意圖. apk 檔解開後的source code 如下: ![]() 說明: 左邊是 jad 把 class 轉成 javasource code, 右邊是我們實際的 source code, 原本寫了5行, java 優化後變成3行指令就解決. 前置工作, 要先下載3個檔案:
以下是我的操作步驟: ============================= Step 1: 解開 apk. 我是用 7z 把 apk 直接當作 zip 檔解開即可. Step 2: 透過 AXMLPrinter2.jar把 XML 檔案還原. ![]() 說明: AndroidManifest.xml 可以還原, 沒有錯誤訊息, 但我試了 layout 裡的 xml, 卻失敗, 只還原了第1行. Ex: java -jar ..\AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt Step 3: 透過 dex2jar把 classes.dex 還原為 jar 檔 ![]() 說明: d:\deApk\KgConverter\classes.dex 被還原為 d:\deApk\KgConverter\classes_dex2jar.jar, 直接透過 7z 就可以再把這一個 jar 檔解開, 就可以看到 .class 的檔案. Ex: C:\deApk\dex2jar-0.0.9.13\dex2jar.bat classes.dex Step 4: 透過jad把 compiler 過的 .class 還原為 javasource code. ![]() Ex: C:\deApk\dex2jar-0.0.9.13\dex2jar.batclasses.dex |
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.