APK反編譯得工具總結

APK反編譯得工具總結(轉載)

 

Android反編譯技術總結

轉自UncleChen's Blog,作者:UncleChen

一、Apk反編譯工具及其使用方法

1.原理

學習反編譯之前,建議先學習一下Apk打包的過程,明白打包完成後的Apk裏面都有什麼文件,各種文件都是怎麼生成的。

這裏有兩篇AndroidWeekly中推薦過的好文章:

Apk技術也有非常多的技術可以學習,主要都是圍繞着如何減小體積,如何提高打包速度展開,這裏先不多說了。下面是一張基本的Apk文件結構圖。

APK文件結構

Apk文件本質上其實是一個zip包。直接拿解壓工具解壓就可以看到其中包含了什麼。下面簡單介紹一下Apk文件的結構。

  • AndroidManifest.xml:應用的全局配置文件
  • assets文件夾:原始資源文件夾,對應着Android工程的assets文件夾,一般用於存放原始的網頁、音頻等等,與res文件夾的區別這裏不再贅述,可以參考上面介紹的兩篇文章。
  • classes.dex:源代碼編譯成class後,轉成jar,再壓縮成dex文件,dex是可以直接在Android虛擬機上運行的文件。
  • lib文件夾:引用的第三方sdk的so文件。
  • META-INF文件夾:Apk簽名文件。
  • res文件夾:資源文件,包括了佈局、圖片等等。
  • resources.arsc:記錄資源文件和資源id的映射關係。

上面的截圖中每個文件都是一個最基本的Apk 文件應該包含在內的。但是直接把Apk當做zip解壓後的這些文件是沒法直接閱讀的,畢竟他們都是經過了build-tools打包工具處理過的。我們直接用文本編輯器打開這裏面的Manifest文件看看。

反編譯前的Manifest文件

反編譯Apk的目的就是Apk拆成我們可以閱讀的文件。通過反編譯,我們一般想要得到裏面的AndroidManifest.xml文件res文件java代碼

2.Apk反編譯步驟

(1) ApkTool拆包,得到AndroidManifest和res等資源文件

工具下載地址:https://bitbucket.org/iBotPeaches/apktool/downloads

功能:拆解Apk文件,反編譯其中的資源文件,將它們反編譯爲可閱讀的AndroidManifest.xml文件res文件。前面講過,直接把Apk文件當做zip解壓,得到的xml資源文件,都是無法直接用文本編輯器打開閱讀的,因爲它們在打包時經過了build-tools的處理。

用法:官網https://ibotpeaches.github.io/Apktool/documentation/有介紹,最新版本是2.2.0,運行環境需要jre1.7

這裏,我演示一下用apktool來拆解Apk文件的基本方法,只需要在終端裏面執行下面的命令。

java -jar apktool.jar d yourApkFile.apk
// 注意`apktool.jar`是剛纔下載後的jar的名稱,`d`參數表示decode
// 在這個命令後面還可以添加像`-o -s`之類的參數,例如
// java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s
// 幾個主要的參數設置方法及其含義:
-f 如果目標文件夾已存在,強制刪除現有文件夾
-o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
-s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
-r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)

下面我們看一下java -jar apktool.jar d yourApkFile.apk拆解後的結果:

Apk拆包結果

我們已經得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。original文件夾是原始的AndroidManifest.xml文件,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼。注意,smali文件夾下面,結構和我們的源代碼的package一模一樣,只不過換成了smali語言。它有點類似於彙編的語法,是Android虛擬機所使用的寄存器語言。

這時,我們已經可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。這樣,我們就可以查看到這個Apk文件的package包名、Activity組件、程序所需要的權限、xml佈局、圖標等等信息。其實我們把Apk上傳到應用市場時,應用市場也會通過類似的方式解析我們的apk。

note1:其實還有一種方法,可以省去每次解包時,都要輸入java -jar apktool.jar xxx這行命令,官網也有說明,就是將這個命令包裝成shell腳本,方法見:https://ibotpeaches.github.io/Apktool/install/

note2:如果你在編譯的時候,發現終端裏面提示發生了brut.android.UndefinedResObject錯誤,說明你的apktool.jar版本太低了,需要去下載新版工具了。

note3:如果想要自己實現一個解析Apk文件,提取版本、權限信息的java服務時,可以引用apktool.jar中的ApkDecoder,調用decode方法來實現。可以看下圖中,apktool.jar裏面有解析Apk文件的實現。

apktool.jar

(2) dex2jar反編譯dex文件,得到java源代碼

上一步中,我們得到了反編譯後的資源文件,這一步我們還想看java源代碼。這裏要用的工具就是dex2jar

工具下載地址:https://sourceforge.net/projects/dex2jar/

功能:將dex格式的文件,轉換成jar文件。dex文件時Android虛擬機上面可以執行的文件,jar文件大家都是知道,其實就是java的class文件。在官網有詳細介紹。

用法:打開下載的dex2jar-2.0文件夾,裏面有shell和bat腳本,進入終端,就可以在命令行使用了。

d2j-dex2jar classes.dex
// 獲取classes.dex文件在最前面說過,只要把Apk當做zip解壓出來,裏面就有dex文件了
// 或者用apktool反編譯時帶上 `-s` 參數

運行後,可以看到classes.dex已經變成了classes-dex2jar.jar

進入dex2jar文件夾

note1:第一次下載下來後,在mac裏運行的時候可能會提示需要管理員的權限,這裏我給這些sh腳本chmod 777後,即可運行它。

root執行dex2jar

note2:寫完這一節的時候,我發現把dex轉換成jar已經有了更好的工具enjarifyhttps://github.com/google/enjarify這個工具是谷歌官方開源的用於反編譯dex文件的。使用方法和dex2jar差不多,也是簡單的命令行操作。這個工具的主頁中也提到dex2jar已經是一個比較老的工具,在遇到混淆等等複雜的情況時,可能無法正常工作。所以這裏推薦大家使用enjarify這個工具。

(3) jd-gui查看java源代碼

工具下載地址:官網http://jd.benow.ca/上選擇自己所需要的版本。

功能:這個工具不用多說,寫java的人都知道。有時候我們自己開發一個jar包給別人用,也會用它來查看class是不是都被正確的打入到了jar內,我以前介紹的gradle自定義打包jar的博客中也提到過它。

用法:下載後雙擊既可以運行這個工具,直接把上一步得到的classes-dex2jar.jar拖到jd-gui程序的界面上即可打開了,效果如下圖所示。

classes-dex2jar.jar

反編譯Apk步驟小結

反編譯一個Apk,查看它的資源文件和java代碼,我們需要用到3個工具。

反編譯就是用這3個工具得到AndroidManifest.xml、res、java代碼等。但是我們可以看到,如果你要對一個Apk做儘可能徹底的反編譯,把它扒得乾乾淨淨,這一步一步的基本操作還是稍顯麻煩。另外加固過Apk的情況可能更復雜,需要我們勤動手嘗試。爲了能提高效率,下面我把自己見過的一些集成工具介紹給大家,儘可能實現可以一鍵反編譯Apk。

二、自動化工具彙總(一鍵反編譯Apk)

1.谷歌提供的工具:android-classyshark

下載地址:https://github.com/google/android-classyshark/releases,下載下來之後是一個可執行的jar文件,win下或者mac下都只要雙擊即可運行。

功能:帶有界面,一鍵反編譯Apk工具,直接打開Apk文件,就可以看到Apk中所有的文件結構,甚至還集成了dex文件查看,java代碼查看,方法數分析、導入混淆mapping文件等一系列工具。谷歌推出這個工具的目的是爲了讓我們開發者更清楚的瞭解自己的Apk中都有什麼文件、混淆前後有什麼變化,並方便我們進一步優化自己的Apk打包實現。下面帶上幾張截圖,真是帥氣的一筆的好工具啊!

dex文件查看

方法數分析

即將到來的Android Studio 2.2中集成了一個叫做APK Analyzer的功能,這個功能不知道是不是和這個工具有關係呢,本人還沒有嘗試過2.2版本,有興趣的朋友可以體驗一下preview版本

2.Python實現的工具:AndroidGuard

下載地址:https://github.com/androguard/androguard/releases

功能:集成了反編譯資源、代碼等各種文件的工具包。需要安裝Python環境來運行這個工具,這個工具按照不同的反編譯需求,分別寫成了不同的py功能模塊,還有靜態分析的功能。所以如果想要用Python開發一個解析Apk文件並進行靜態掃描分析的服務,可以引用這個工具來實現。

用法:具體用法比較多,這裏也不再展開了。可以通過工具內置的-h幫助指令查看各個模塊的功能。

unclechendeiMac:androguard-2.0 unclechen$ python androaxml.py -h
Usage: androaxml.py [options]

Options:
  -h, --help            show this help message and exit
  -i INPUT, --input=INPUT
                        filename input (APK or android's binary xml)
  -o OUTPUT, --output=OUTPUT
                        filename output of the xml
  -v, --version         version of the API

// androaxml.py這個模塊是用來解析AndroidManifest文件的,`-i` 表示輸入的apk文件,`-o` 表示輸出xml文件。

3.Mac專屬工具:Android-Crack-Tool

功能:這是網上一位名爲Jermic的大神開發的、在Mac環境下使用的App,集成了Android開發中常見的一些編譯/反編譯工具,方便用戶對Apk進行逆向分析,提供Apk信息查看功能。工具的截圖如下所示,非常強大。

Android-Crack-Tool.app

4.手機上的反編譯工具:ApkParser

功能:在電腦上已經有了這麼多的工具,在手機上的也有很方便的工具。APKParser是一款在查看手機上已經安裝的Apk的信息的工具,他可以查看軟件的AndroidManifest.xml文件、方法數、res資源文件,並在手機上直接展示出來。個人覺得這是一個非常實用的工具,作爲開發者,手機裏面必須要有它。

ApkParser

5.工具彙總

以上幾款工具都是我體驗過、感覺不錯的集成工具,推薦給大家。臨近本文結束前,又發現了這麼一個福利網站-http://www.androiddevtools.cn/,其中有一章專門總結了各種Apk反編譯的工具。相信有了這麼多的利器,大家應該有100種方法將一個App扒得乾乾淨淨了。

Apk反編譯工具彙總

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章