APK反编译得工具总结(转载)
Android反編譯技術總結
轉自UncleChen's Blog,作者:UncleChen一、Apk反編譯工具及其使用方法
1.原理
學習反編譯之前,建議先學習一下Apk打包的過程,明白打包完成后的Apk里面都有什么文件,各種文件都是怎么生成的。
這里有兩篇AndroidWeekly中推薦過的好文章:
-
淺析 Android 打包流程
-
Android構建過程分析
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文件看看。
反編譯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拆解后的結果:
我們已經得到一個可以用文本編輯器打開的閱讀的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文件的實現。
(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。
note1:第一次下載下來后,在mac里運行的時候可能會提示需要管理員的權限,這里我給這些sh腳本chmod 777后,即可運行它。
note2:寫完這一節的時候,我發現把dex轉換成jar已經有了更好的工具enjarify,https://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程序的界面上即可打開了,效果如下圖所示。
反編譯Apk步驟小結
反編譯一個Apk,查看它的資源文件和java代碼,我們需要用到3個工具。
- apktool:https://ibotpeaches.github.io/Apktool/
- dex2jar:https://github.com/pxb1988/dex2jar
- jd-gui:http://jd.benow.ca/
反編譯就是用這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打包實現。下面帶上幾張截圖,真是帥氣的一筆的好工具啊!
即將到來的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=INPUTfilename input (APK or android's binary xml)-o OUTPUT, --output=OUTPUTfilename 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信息查看功能。工具的截圖如下所示,非常強大。
4.手機上的反編譯工具:ApkParser
功能:在電腦上已經有了這么多的工具,在手機上的也有很方便的工具。APKParser是一款在查看手機上已經安裝的Apk的信息的工具,他可以查看軟件的AndroidManifest.xml文件、方法數、res資源文件,并在手機上直接展示出來。個人覺得這是一個非常實用的工具,作為開發者,手機里面必須要有它。
5.工具匯總
以上幾款工具都是我體驗過、感覺不錯的集成工具,推薦給大家。臨近本文結束前,又發現了這么一個福利網站-http://www.androiddevtools.cn/,其中有一章專門總結了各種Apk反編譯的工具。相信有了這么多的利器,大家應該有100種方法將一個App扒得干干凈凈了。
?
?
轉載于:https://www.cnblogs.com/hayha/p/6848474.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的APK反编译得工具总结(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle使用parallel并行,多
- 下一篇: CSS限制