反編譯APK入門
Introduction
本文簡單介紹了如果使用dex2jar和jd-gui來反編譯apk,查看其源碼。
補充了jadx工具的使用
1. 工具和環境
本文的環境為Debian 9 x86_64,使用的工具:
dex2jar 作用:將apk反編譯成java源碼(classes.dex轉化成jar文件)
JD GUI 作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
jadx:綜合上面兩個工具的作用,可以直接拖進apk,然後查看其源碼,但是功能不如jdgui完善。
2. apk分析
apk文件的本質是壓縮文件,可直接用解壓縮軟體以zip的形式解壓。
文件、文件夾內容assets文件夾原始資源文件夾,對應著Android工程的assets文件夾,一般用於存放原始的圖片、txt、css等資源文件。lib存放應用需要的引用第三方SDK的so庫。比如一些底層實現的圖片處理、音視頻處理、數據加密的庫等。而該文件夾下有時會多一個層級,這是根據不同CPU 型號而劃分的,如 ARM,ARM-v7a,x86等。META-INF保存apk簽名信息,保證apk的完整性和安全性。res資源文件夾,其中的資源文件包括了布局(layout),常量值(values),顏色值(colors),尺寸值(dimens),字元串(strings),自定義樣式(styles)等。AndroidManifest.xml文件全局配置文件,裡面包含了版本信息、activity、broadcasts等基本配置。不過這裡的是二進位的xml文件,無法直接查看,需要反編譯後才能查看。classes.dex文件這是安卓代碼的核心部分,,dex是在Dalvik虛擬機上可以執行的文件。這裡有classes.dex和classes2.dex兩個文件,說明工程的方法數較多,進行了dex拆分。resources.arsc文件記錄資源文件和資源id的映射關係。
3. 將dex文件轉換成jar包
下載的dex工具包直接解壓即可,處理上一步解壓出來的classes.dex
文件
./dex2jar-2.1-SNAPSHOT/d2j-dex2jar.sh ./classes.dexn
將生成一個classes-dex2jar.jar
文件,用java
-jar jd-gui.jar classes-dex2jar.jar
打開jar包,即可看到反編譯後的源碼:
這裡會看到大量的a.a,b.b等無意義命名,代碼及其難懂。。不過好在jdgui可以點擊類名進行跳轉,一定程度上減少了工作量。
4. jd gui的使用
jdgui可用的功能比較簡單,但都很實用。
search里可以對整個項目的代碼進行搜索,但是他搜索的功能有限,最好搜索單詞,不要搜索net.findhao等帶標點符號的關鍵詞,如要搜索帶標點符號的關鍵詞,先用jd導出源碼,會生成源碼文件夾,然後用vscode or sublime等打開文件夾進行搜索。
5. jadx
https://github.com/skylot/jadx
直接將apk拖入即可自動打開並完成前面的dex2jar和jdgui的功能。
但是一些小功能不如jdgui完善。
Reference
Android APK反編譯就這麼簡單 詳解(附圖)
Android APK 反編譯實踐
原文鏈接,若本文表格或代碼格式混亂,請查看原文↓:
反編譯APK入門 - FindHao推薦閱讀:
※了解 Android Studio 2.2 中的APK打包,分析 Android V2 新簽名打包機制
※如何針對Github上某個Android開源項目進行學習?
※Android O DP3來了
※如何看待今天的小米還有小米3?
※[譯] 如何通過 ArrayMap 和 SparseArray 優化 Android App