一、APK安裝包結(jié)構(gòu)概述
APK(Android Package Kit)是Android操作系統(tǒng)中應(yīng)用程序的打包格式瑰煎。一個APK文件本質(zhì)上是一個ZIP壓縮包铺然,它包含了應(yīng)用程序所需的所有資源和代碼。以下是APK安裝包的基本結(jié)構(gòu)和各個組件的簡要說明:
-
META-INF:
- 這個目錄包含證書和簽名信息酒甸。它用于確保應(yīng)用程序的來源和完整性魄健。
-
res:
- 資源文件夾,包含應(yīng)用程序的所有資源插勤,如圖像沽瘦、布局、動畫饮六、顏色定義其垄、字符串資源等。這些資源是應(yīng)用程序運行時使用的各種元素卤橄。
-
assets:
- 這是一個可選的文件夾绿满,用于存儲應(yīng)用程序的額外資源,如音頻文件窟扑、視頻文件或自定義字體喇颁。這些資源不會被Android資源系統(tǒng)自動處理漏健。
-
lib:
- 庫文件夾溺职,包含應(yīng)用程序所需的所有本地庫(.so文件)匀钧。這些庫是編譯后的C/C++代碼,可以提高應(yīng)用程序的性能软啼。
-
AndroidManifest.xml:
- 這是一個非常重要的文件姐叁,它描述了應(yīng)用程序的所有必要信息瓦盛,如應(yīng)用程序的包名、所需權(quán)限外潜、定義的組件(如Activity原环、Service、BroadcastReceiver处窥、ContentProvider等)以及其他配置嘱吗。
-
resources.arsc:
- 這是一個二進制文件,包含了編譯后的資源滔驾。它是由Android資源編譯器(aapt)生成的谒麦,用于提高資源訪問的速度。
-
classes.dex:
- 這是應(yīng)用程序的Java字節(jié)碼文件哆致,它包含了應(yīng)用程序的代碼绕德。在安裝過程中,Android系統(tǒng)會將DEX文件轉(zhuǎn)換為Dalvik字節(jié)碼沽瞭,然后由Dalvik虛擬機執(zhí)行迁匠。
-
raw:
- 這是一個可選的文件夾,用于存儲原始文件驹溃。這些文件在應(yīng)用程序中以原始形式使用城丧,不經(jīng)過Android資源系統(tǒng)處理。
-
smali:
- Smali是一個匯編語言豌鹤,用于表示Dalvik字節(jié)碼亡哄。在某些情況下,APK文件可能包含Smali代碼布疙,這可以通過反編譯工具查看蚊惯。
-
原文件(原始代碼):
- 如果APK文件被反編譯,你可能會看到原始的Java或Kotlin源代碼灵临。這些文件可以幫助你理解應(yīng)用程序的工作原理截型。
-
其他文件:
- APK文件可能還包含其他文件,如ProGuard混淆后的代碼儒溉、調(diào)試信息等宦焦。
二、Android逆向工具概述
要分析APK文件,你可以使用以下工具:
AndroidKiller
工具描述:AndroidKiller是一個可視化的Android反編譯工具波闹,集合了我們所熟知的多款安卓反編譯軟件酝豪。
下載地址:Charlott2/android-killer: 經(jīng)典的安卓反編譯工具(下載后請自行更新apktool、dex2jar精堕、jd-gui孵淘,簽名需要JDK1.8版本)
主要功能:
-
查看 APK 文件的詳細信息:
- 作用:顯示 APK 文件的詳細信息,如包名歹篓、版本號瘫证、權(quán)限等。
-
反編譯 APK 文件:
- 作用:將 APK 文件中的資源(如布局滋捶、圖片痛悯、字符串等)提取出來。
-
重新編譯 APK 文件:
- 作用:將修改后的資源重新打包成 APK 文件重窟。
-
生成 APK 文件的簽名:
- 作用:為重新編譯后的 APK 文件生成簽名。
-
安裝 APK 文件:
- 作用:將重新編譯后的 APK 文件安裝到設(shè)備上惧财。
-
卸載 APK 文件:
- 作用:卸載指定的應(yīng)用程序巡扇。
JADX-GUI
工具介紹:用于分析和修改 APK 文件中的 Java 字節(jié)碼。Jadx 支持多種功能垮衷,包括反編譯厅翔、調(diào)試、代碼查看等搀突。
工具下載:Releases · skylot/jadx (github.com)
主要功能:
-
反編譯 APK 文件:
- 命令:
jadx <apk_file>
- 作用:將 APK 文件中的 Java 字節(jié)碼反編譯為可讀的 Java 源代碼刀闷。
- 命令:
-
生成項目文件:
- 命令:
jadx --project <apk_file>
- 作用:將反編譯后的 Java 源代碼生成一個項目文件,可以使用 IDE 打開和編輯仰迁。
- 命令:
-
輸出到指定目錄:
- 命令:
jadx -d <output_directory> <apk_file>
- 作用:將反編譯后的 Java 源代碼輸出到指定的目錄甸昏。
使用 Jadx 可以幫助開發(fā)者更好地理解 Android 應(yīng)用程序的工作原理,進行性能優(yōu)化徐许、安全性分析等施蜜。然而,需要注意的是雌隅,使用 Jadx 進行反向工程可能會違反應(yīng)用程序的版權(quán)和使用條款翻默,因此在使用時需要謹慎。同時恰起,Jadx 不能保證 100% 的兼容性和成功率修械,因此在進行修改和重新編譯時,需要仔細測試以確保應(yīng)用程序的穩(wěn)定性和安全性检盼。
- 命令:
Frida肯污、Objection
工具介紹:
- Frida 是一個強大的、跨平臺的動態(tài)二進制插樁(Dynamic Binary Instrumentation, DBI)工具,它允許開發(fā)者在運行時對代碼進行注入仇箱、掛鉤和修改县恕。Frida 特別適用于移動應(yīng)用安全測試、逆向工程和惡意軟件分析剂桥。
- Objection是一個基于 Frida 的 Python 庫忠烛,它提供了一個更高級別的抽象,使得使用 Frida 進行二進制插樁和逆向工程變得更加簡單和直觀权逗。Objection 允許開發(fā)者快速地對運行中的進程進行掛鉤美尸、修改內(nèi)存、調(diào)用函數(shù)等操作斟薇。
工具下載:
python端:python install frida frida-tools objection
android端:
- 根據(jù)python安裝的版本师坎,在Github下載對應(yīng)的frida-server
- 推送
frida-server
到android的/data/local/tmp
目錄中
adb push frida-server /data/local/tmp
- 啟動frida-server
# 進入命令
adb shell
# 切換root權(quán)限
su
# 進入frida-server 目錄
cd /data/local/tmp
# 授權(quán)
chmod 755 frida-server
#啟動frida-server
./frida-server
# 轉(zhuǎn)發(fā)端口
adb forward tcp:27034 tcp:27034
連接frida-server服務(wù),附加需要調(diào)試的app, 進入交互界面
objection -g [PackageName] explore
hook類或方法堪滨,監(jiān)聽并打印傳入?yún)?shù)胯陋、返回參數(shù)、調(diào)用棧
objection hooking watch [class_name or class_method_name] --dump-args --dump-return --dump-backtrace
更多參見:objection-基于frida的命令行hook工具食用手冊
解密算法逆向思路
一袱箱、生撕解密代碼
使用Jadx-gui
反編譯代碼遏乔,分析解密流程,將相關(guān)解密代碼復制出來发笔,并直接用java實現(xiàn)解密盟萨。
二、監(jiān)聽解密返回
利用Frida
Objection
Hook代碼的傳入?yún)?shù)了讨、返回值捻激,監(jiān)聽解密結(jié)果
objection hooking watch [class_name or class_method_name] --dump-args --dump-return --dump-backtrace
三、smali移花接木
- 反編譯目標apk程序(target.apk)前计。
- 確定解密相關(guān)的smali文件(target.smali)及依賴文件胞谭。
- 分析smali文件的類結(jié)構(gòu), 編寫對應(yīng)的java類文件(proxy.java)残炮。
- 編寫proxy-project韭赘, 生成新的apk程序文件(proxy.apk)。
- 反編譯proxy-apk文件势就, 利用target.smali替換相應(yīng)的smali文件(proxy.java)泉瞻。
- 利用apktool 重新生成apk程序(new-proxy.apk), 安裝到手機運行實現(xiàn)解密苞冯。