一. 分析已經打好的apk.
首先來簡單的說明下Apk文件本質上其實是一個zip包。我們直接進行解壓就能看到其中的目錄。
1. 目錄說明
- AndroidManifest.xml:應用的全局配置文件
- classes.dex:源代碼編譯成class后,轉成jar,再壓縮成dex文件,dex是可以直接在Android虛擬機上運行的文件。
- lib文件夾:引用的第三方sdk的so文件。
- META-INF文件夾:Apk簽名文件。
- res文件夾:資源文件,包括了布局、圖片等等。
- resources.arsc:記錄資源文件和資源id的映射關系。
- 其中還有一個沒有顯示就是→assets文件夾:原始資源文件夾,對應著Android工程的assets文件夾,一般用于存放原始的網頁、音頻等等。
上述的這些說明 簡單的說明了一個apk基本包含的東西,直接把apk解壓是沒有辦法進行閱讀的,在打包這個過程中經過了build-tools處理了。
其實反編譯Apk的目的就是Apk拆成我們可以閱讀的文件。通過反編譯,我們一般想要得到里面的AndroidManifest.xml文件、res文件和java代碼。
xml文件都不能直接被識別了這是因為:xml文件都被aapt編譯成二進制的xml文件,將文本格式的xml轉為二進制格式的xml原因有以下兩點:二進制格式的XML文件占用空間更小;二進制格式的XML文件解析速度更快。
二. 反編譯工具
1.使用ApkTool 反編譯APK獲取清單文件及布局文件
可以利用ApkTool,獲取AndroidManifest和res等資源文件:
功能:拆解Apk文件,反編譯其中的資源文件,將它們反編譯為可閱讀的AndroidManifest.xml文件和res文件。因為直接把Apk文件當做zip解壓,得到的xml資源文件,都是無法直接用文本編輯器打開閱讀的,因為它們在打包時經過了build-tools的處理變成了二進制的XML。
(1.) 安裝ApkTool
ApkTool 需要的環境是jdk 1.7以上
- 下載apktool-2(最新)。
- 將下載的jar重命名為 apktool.jar。
- 將這兩個文件(apktool.jar&apktool.bat)移動到您的Windows目錄(通常C://Windows)。
- 如果沒有訪問權限C://Windows,可以將這兩個文件放在任何位置,然后將該目錄添加到您的環境變量系統PATH變量。
- 嘗試apktool通過命令提示符運行。
(2.) 使用ApkTool
完成安裝的步驟以后,上述說到如果你把文件移動到其他的位置,就需要配置環境變量。首先進入到你想要 反編譯的apk 目錄下,這里就放置到一起了。
通過
java -jar apktool.jar d xx.apk
命令執行jar程序,可以從下圖看到反編譯出來的具體內容:已經得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。這樣,我們就可以查看到這個Apk文件的package包名、Activity組件、程序所需要的權限、xml布局、圖標等等信息。smali文件夾是反編譯出來的代碼,需要進行相應的學習才能看懂。
java -jar apktool.jar d xx.apk
- -f 如果目標文件夾已存在,強制刪除現有文件夾
- -o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
- -s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
- -r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)
注意
apktool.jar
是剛才下載后的jar的名稱,d
參數表示decode,在這個命令后面還可以添加像-o -s
之類的參數,例如java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s。
2. 使用dex2jar反編譯dex文件,得到java源代碼
(1. )dex2jar的功能
上文通過apkTool反編譯獲得apk 等資源文件,獲得的smali需要進行系統的學習才能看懂。如果想獲取能看懂的源代碼,這時候就需要dex2jar登場了。
dex2jar的作用就是將dex格式的文件,轉換成jar文件。dex文件是Android虛擬機上面可以執行的文件,jar文件大家都是知道,其實就是java的class文件。在官網有詳細介紹。
工具地址: dex2jar
(2. )dex2jar的安裝
打開下載的文件進行解壓后進入/dex2jar目錄下,里面有腳本,進入終端后,輸入命令就可以使用。
利用終端進入到你的dex2jar目錄下,輸入命令進行獲取
把apk解壓下來就能獲得classes.dex文件,之后賦值到dex2jar目錄下 ,執行命令。
這個時候又有人問我了(怎么這么多人問我),我怎么看生成的這個jar包呀。這個時候就需要 jd-gui了
3. 使用jd-gui查看jar里面的java源代碼
jd-gui用法: 下載完成后直接打開,把生成的classes-dex2jar.jar 文件直接拖到里面就可以查看了
4.使用jadx反編譯Apk,得到可以閱讀的.java源代碼
(1.)jadx介紹
jadx可以直接對Apk進行反編譯直接生成.java文件,相當于是apktool+dex2jar+jd-gui反編譯的組合。jadx具有以下兩個優點:
- 可以直接反編譯出.java文件。
- 查看源碼時直接顯示資源名稱,而不是像jd-gui里顯示的資源ID。
工具官方地址 :
- github: https://github.com/skylot/jadx/releases
- sourceforge: http://sourceforge.net/projects/jadx/files/
(2.)jadx安裝使用
下載完成后進行解壓,進入bin目錄下執行jadx-gui.bat,jadx也有GUI,進入后選中然將要反編譯的apk即可,運行效果如下:
如果要保存源碼,選擇File->Save ALL即可保存文件,然后就可以導入Android Studio等IDE中。我們也可以直接使用命令行反編譯apk文件:
- jadx -d out classes.dex #直接輸出.java文件到out目錄
- jadx-gui classes.dex #使用gui打開
使用jadx大大簡化了反編譯流程,不過獲取資源等文件還是建議使用ApkTool。
5. 使用ClassyShark對APK反編譯
ClassyShark是Google發布的一款可以查看Android可執行文件的瀏覽工具,支持.dex, .aar, .so, .apk, .jar, .class, .xml 等文件格式,分析里面的內容包括classes.dex文件,包、方法數量、類、字符串、使用的NativeLibrary等。
打開apk文件java -jar ClassyShark.jar -open xx
三. Android 逆向工程.
1. 新建一個app在MainActivity中輸出一個toast,然后打包出來用于反編譯,。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "未修改之前!", Toast.LENGTH_SHORT).show();
}
}
2. ApkTool進行反編譯,修改文件,然后打包.
(1.) 下載apktool
(2.) 將apktool.jar和需要反編譯的apk放到同一個文件夾下面,shift+鼠標右鍵,選擇在此處打開命令提示符。
java -jar apktool.jar d test.apk
d
參數表示decode在這個命令后面還可以添加像
-o -s
之類的參數,例如// java -jar apktool.jar d yourApkFile.apk -o
- -o 指定反編譯的目標文件夾的名稱(默認會將文件輸出到以Apk文件名命名的文件夾中)
- -s 保留classes.dex文件(默認會將dex文件解碼成smali文件)
- -r 保留resources.arsc文件(默認會將resources.arsc解碼成具體的資源文件)
image.png
(3. )我們可以從下圖看到反編譯出來的具體內容:
我們已經得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。original文件夾是原始的AndroidManifest.xml文件,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼。
這時,我們已經可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。這樣,我們就可以查看到這個Apk文件的package包名、Activity組件、程序所需要的權限、xml布局、圖標等等信息。
(4. )修改smail文件.找到MainActivity.smail文件里吐司輸出的內容,進行替換
(5. )使用打包命令對源碼進行打包.**
apktool b app -o other.apk(app 指需要打包的文件夾,-o other.apk 表示生產新文件)
(6. )對apk進行簽名.然后安裝。**
四. APK加固脫殼.
眾所周知,Android應用開發完成后,除了使用Google官方的混淆外,還需要使用一些第三方的安全軟件的加殼處理,比較出名的有騰訊樂固、360加固和愛加密等。加固工具的出現,讓反編譯的難度更大。但是有了加固技術,就會有反加固技術。
經過加固后的apk,通過dex2jar反編譯:
騰訊樂固:
360加固:
從上面可以看出,經過加固后的apk,通過常規方法反編譯無法獲取到源碼。
所謂Apk加固,就是給目標Apk加一層保護程序,把重要數據信息隱藏起來。加殼程序可以有效 阻止對程序的反編譯和逆向分析。Apk加固本質的功能就是實現類加載器。系統先執行加固殼代碼,然后將加了密的dex進行解密操作,再加載到系統內存中運行。
由于加固方式會不斷的升級,因此加固脫殼技術也是有時效性的,必須要要與時俱進才能完成反編譯,因此本文暫不對加固脫殼方法進行著墨。有興趣可以去如下論壇找尋相關資料進行閱讀:
看雪論壇
吾愛破解
Android APK脫殼--騰訊樂固、360加固一鍵脫殼