反編譯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

github.com/skylot/jadx

直接將apk拖入即可自動打開並完成前面的dex2jar和jdgui的功能。

但是一些小功能不如jdgui完善。

Reference

Android APK反編譯就這麼簡單 詳解(附圖)

Android APK 反編譯實踐

原文鏈接,若本文表格或代碼格式混亂,請查看原文↓:

反編譯APK入門 - FindHaowww.findhao.net圖標
推薦閱讀:

了解 Android Studio 2.2 中的APK打包,分析 Android V2 新簽名打包機制
如何針對Github上某個Android開源項目進行學習?
Android O DP3來了
如何看待今天的小米還有小米3?
[譯] 如何通過 ArrayMap 和 SparseArray 優化 Android App

TAG:反编译 | Android | Apk |