Android逆向入門&解密逆向思路

一、APK安裝包結(jié)構(gòu)概述

APK(Android Package Kit)是Android操作系統(tǒng)中應(yīng)用程序的打包格式。一個APK文件本質(zhì)上是一個ZIP壓縮包,它包含了應(yīng)用程序所需的所有資源和代碼。以下是APK安裝包的基本結(jié)構(gòu)和各個組件的簡要說明:

  1. META-INF

    • 這個目錄包含證書和簽名信息。它用于確保應(yīng)用程序的來源和完整性。
  2. res

    • 資源文件夾,包含應(yīng)用程序的所有資源,如圖像、布局、動畫、顏色定義、字符串資源等。這些資源是應(yīng)用程序運行時使用的各種元素。
  3. assets

    • 這是一個可選的文件夾,用于存儲應(yīng)用程序的額外資源,如音頻文件、視頻文件或自定義字體。這些資源不會被Android資源系統(tǒng)自動處理。
  4. lib

    • 庫文件夾,包含應(yīng)用程序所需的所有本地庫(.so文件)。這些庫是編譯后的C/C++代碼,可以提高應(yīng)用程序的性能。
  5. AndroidManifest.xml

    • 這是一個非常重要的文件,它描述了應(yīng)用程序的所有必要信息,如應(yīng)用程序的包名、所需權(quán)限、定義的組件(如Activity、Service、BroadcastReceiver、ContentProvider等)以及其他配置。
  6. resources.arsc

    • 這是一個二進制文件,包含了編譯后的資源。它是由Android資源編譯器(aapt)生成的,用于提高資源訪問的速度。
  7. classes.dex

    • 這是應(yīng)用程序的Java字節(jié)碼文件,它包含了應(yīng)用程序的代碼。在安裝過程中,Android系統(tǒng)會將DEX文件轉(zhuǎn)換為Dalvik字節(jié)碼,然后由Dalvik虛擬機執(zhí)行。
  8. raw

    • 這是一個可選的文件夾,用于存儲原始文件。這些文件在應(yīng)用程序中以原始形式使用,不經(jīng)過Android資源系統(tǒng)處理。
  9. smali

    • Smali是一個匯編語言,用于表示Dalvik字節(jié)碼。在某些情況下,APK文件可能包含Smali代碼,這可以通過反編譯工具查看。
  10. 原文件(原始代碼)

    • 如果APK文件被反編譯,你可能會看到原始的Java或Kotlin源代碼。這些文件可以幫助你理解應(yīng)用程序的工作原理。
  11. 其他文件

    • APK文件可能還包含其他文件,如ProGuard混淆后的代碼、調(diào)試信息等。

二、Android逆向工具概述

要分析APK文件,你可以使用以下工具:

AndroidKiller

工具描述:AndroidKiller是一個可視化的Android反編譯工具,集合了我們所熟知的多款安卓反編譯軟件。

微信截圖_20240723155119.png

下載地址:Charlott2/android-killer: 經(jīng)典的安卓反編譯工具(下載后請自行更新apktool、dex2jar、jd-gui,簽名需要JDK1.8版本)

主要功能:

  1. 查看 APK 文件的詳細信息

    • 作用:顯示 APK 文件的詳細信息,如包名、版本號、權(quán)限等。
  2. 反編譯 APK 文件

    • 作用:將 APK 文件中的資源(如布局、圖片、字符串等)提取出來。
  3. 重新編譯 APK 文件

    • 作用:將修改后的資源重新打包成 APK 文件。
  4. 生成 APK 文件的簽名

    • 作用:為重新編譯后的 APK 文件生成簽名。
  5. 安裝 APK 文件

    • 作用:將重新編譯后的 APK 文件安裝到設(shè)備上。
  6. 卸載 APK 文件

    • 作用:卸載指定的應(yīng)用程序。

JADX-GUI

工具介紹:用于分析和修改 APK 文件中的 Java 字節(jié)碼。Jadx 支持多種功能,包括反編譯、調(diào)試、代碼查看等。

工具下載:Releases · skylot/jadx (github.com)
主要功能:

  1. 反編譯 APK 文件

    • 命令:jadx <apk_file>
    • 作用:將 APK 文件中的 Java 字節(jié)碼反編譯為可讀的 Java 源代碼。
  2. 生成項目文件

    • 命令:jadx --project <apk_file>
    • 作用:將反編譯后的 Java 源代碼生成一個項目文件,可以使用 IDE 打開和編輯。
  3. 輸出到指定目錄

    • 命令:jadx -d <output_directory> <apk_file>
    • 作用:將反編譯后的 Java 源代碼輸出到指定的目錄。
      使用 Jadx 可以幫助開發(fā)者更好地理解 Android 應(yīng)用程序的工作原理,進行性能優(yōu)化、安全性分析等。然而,需要注意的是,使用 Jadx 進行反向工程可能會違反應(yīng)用程序的版權(quán)和使用條款,因此在使用時需要謹(jǐ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)解密代碼復(fù)制出來,并直接用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移花接木

  1. 反編譯目標(biāo)apk程序(target.apk)。
  2. 確定解密相關(guān)的smali文件(target.smali)及依賴文件。
  3. 分析smali文件的類結(jié)構(gòu), 編寫對應(yīng)的java類文件(proxy.java)。
  4. 編寫proxy-project, 生成新的apk程序文件(proxy.apk)。
  5. 反編譯proxy-apk文件, 利用target.smali替換相應(yīng)的smali文件(proxy.java)。
  6. 利用apktool 重新生成apk程序(new-proxy.apk), 安裝到手機運行實現(xiàn)解密。

思路參見:如何運行smali文件?_smali是什么文件-CSDN博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容