Android apk反編譯工具介紹

首先apk不能被代碼混淆(或未經編譯優化),如果混淆瞭,反編譯出來的代號還是看不懂,

當然,在你沒反編譯出來之前,你也不知道有沒有混淆。

網上各種反編譯工具,眼花繚亂,本文是個人對這些工作做的一個簡單的梳理。

最靠譜也是最原始的方法就是用下面的三個工具:apktool + dex2jar + jd-gui

其他的工具大部分都是衍生自這三個工具,或者說對這三個工具的包裝。

apktool

https://code.google.com/p/android-apktool/ 官方功能介紹
It is a tool for reverse engineering 3rd party, closed, binary Android apps. It can decode resources to nearly original form
and rebuild them after making some modifications; it makes possible to debug smali code step by step.
Also it makes working with app easier because of project-like files structure
and automation of some repetitive tasks like building apk, etc.

https://code.google.com/p/android-apktool/downloads/list //官方下載

反編譯apk,輸出資源文件和源碼的smali文件:

用法:D:\apktool.bat F:\wZ喎?/kf/ware/vc/” target=”_blank” class=”keylink”>vcmtzcGFjZVx0bXBcdGVzdC5hcGsgRjp3b3Jrc3BhY2VcdG1wXG91dAoKPGJyPgoKCjxzdHJvbmc+ZGV4Mmphcjwvc3Ryb25nPgpodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGV4Mmphci8gLy+52be9uabE3L3pydwKaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleDJqYXIvZG93bmxvYWRzL2xpc3QgLy+52be9z8LU2AoKPHA+CmRleDJqYXIgY29udGFpbnMgZm9sbG93aW5nIGNvbXBtZW50PC9wPgo8b2w+CjxsaT5kZXgtcmVhZGVyIGlzIGRlc2lnbmVkIHRvIHJlYWQgdGhlIERhbHZpawogRXhlY3V0YWJsZSAoLmRleC8ub2RleCkgZm9ybWF0LiBJdCBoYXMgYSBsaWdodCB3ZWlnaHQgQVBJIHNpbWlsYXIgd2l0aCBBU00uIEFuCiBleGFtcGxlIGhlcmU8bGk+ZGV4LXRyYW5zbGF0b3IgaXMgZGVzaWduZWQgdG8gZG8gdGhlIGNvbnZlcnQgam9iLiBJdAogcmVhZHMgdGhlIGRleCBpbnN0cnVjdGlvbiB0byBkZXgtaXIgZm9ybWF0LCBhZnRlciBzb21lIG9wdGltaXplLCBjb252ZXJ0IHRvIEFTTSBmb3JtYXQuPGxpPmRleC1pciB1c2VkIGJ5IGRleC10cmFuc2xhdG9yLCBpcyBkZXNpZ25lZCB0byByZXByZXNlbnQgdGhlIGRleAogaW5zdHJ1Y3Rpb248bGk+ZGV4LXRvb2xzIHRvb2xzIHRvIHdvcmsgd2l0aCAuY2xhc3MgZmlsZXMuIGhlcmUgYXJlIGV4YW1wbGVzOgo8dWw+CjxsaT5Nb2RpZnkgYSBhcGs8bGk+RGVPYmZ1c2NhdGUgYSBqYXIKPGxpPmQyai1zbWFsaSA8Y29kZT5bVG8gYmUgcHVibGlzaGVkXTwvY29kZT4gZGlzYXNzZW1ibGUgZGV4IHRvIHNtYWxpIGZpbGVzIGFuZCBhc3NlbWJsZQogZGV4IGZyb20gc21hbGkgZmlsZXMuIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiB0byBzbWFsaS9iYWtzbWFsaSwgc2FtZSBzeW50YXgsIGJ1dCB3ZSBzdXBwb3J0IGVzY2FwZSBpbiB0eXBlIGRlc2Mg”Lcom/dex2jar\t\u1234;”

  • dex-writer [To be published] write dex same way as dex-reader.

    到官網下載最新的版本,直接反編譯apk,apk文件名不能包含中文名稱,新版本的aex2jar不用把apk換成zip解壓瞭,直接反編譯:
    生產jar,然後用jd打開這個文件,在jd中可以查看代碼,也可以導出為java文件

    使用 dex2jar 來生成 .jar 文件. dex2jar會在someApk.apk所在目錄下生成一個someApk_dex2jar.jar文件.

    用法:

    linux sh /home/dex2jar-version/dex2jar.sh /home/someApk.apk

    windows C:\dex2jar-version\dex2jar.bat someApk.apk

    註意:dex2jar隻能生成jar文件,無法生成資源文件

    Levin:apktool和dex2jar都能生成smali代碼,兩者有何異同?個人認為,兩者都是將.dex文件即DalvikExecutable文件

    反編譯成smali代碼,不同的是,apktool輸出的是一個一個.smali代碼文件,這種單個的.smali代碼文件,

    jd-gui打不開(我還沒找到什麼工具能打開),而dex2jar生成的為打包成*.jar格式的smali源碼包,

    這種jar格式的smali源碼包,可以通過jd-gui轉換為java代碼。

    jd-gui

    http://jd.benow.ca///官方功能介紹、官方下載
    Java Decompiler graphical UI

    JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files.

    You can browse the reconstructed source code with the JD-GUI for instant access to methods and fields.

    前文說過,其他的工具大部分都是衍生自這三個工具,或者說對這三個工具的包裝,你可以看到其安裝目錄下有apktool等工具

    下面對這些工具做個羅列,和本人的使用心得:

    APKMultiTool:國外團隊開發,Console交互界面,用來反編譯apk,修改,並重新簽名打包。隻能反編譯出資源文件,不能反編譯出java代碼
    ApkDec: android開發社區www.juapk.com開發,圖形界面,可以反編譯出資源文件盒smali的jar包,
    目前隻有ApkDec-Release-0.1,win32版本,無法在64為機器上運行。找官方團隊索要,無果。

    Dodo APKTools:國產,隻能反編譯出一個一個的smali文件

    Smali2Java:國產,這款反編譯軟件比較牛逼,能過將smali文件高保真還原成java文件。比jd-gui更上一層樓

    http://www.hensence.com/cn/smali2java/ //官方功能介紹、官方下載

    smali2java是一個將smali代碼反編譯成java代碼的工具。
    什麼是smali?smali是將Android字節碼用可閱讀的字符串形式表現出來的一種語言,可以稱之為Android字節碼的反匯編語言。使用baksmali或apktool可以將Android應用程序包(apk或jar)反編譯為smali代碼。
    Levin:jd-gui可以反編譯smali代碼,說明smali代碼,類似於.class代碼。
    smali2java的反編譯過程是:dex字節碼–>smali代碼–>java代碼
    smali2java工具基於apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依賴於smali文件中的代碼行數(.line關鍵字)和變量別名(.local關鍵字)等信息,可以最大程度還原原始的java代碼。還原出的java代碼將具有原始的變量命名,代碼的順序也與原始的java代碼保持一致。因此,本工具也具有局限性,僅適用於帶有行數和變量別名信息的smali文件(java編譯器的編譯選項可以在生成的字節碼中剔除這些信息)。

    總結:如果你即想反編譯出資源,又想反編譯出java源碼,本人推薦如下最優方式(省時省力,效果好):

    step1:使用apktool,反編譯出所有的資源文件

    step2:使用Smali2Java反編譯出高保真的java代碼

  • 發佈留言