iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Security

資安新手的試煉之路系列 第 18

資安新手的試煉之路Day 18

  • 分享至 

  • xImage
  •  

今天來講講Android Reverse

Android Reverse Engineering(逆向工程)

Android 逆向工程是一個通過分析 Android 應用程式 (APK) 的內部結構來理解其運行邏輯、提取數據或查找漏洞的過程。這種技術常用於漏洞研究、分析惡意軟件、確保應用程式安全或破解軟件功能。

Android 應用的架構

在進行 Android 應用程式的逆向工程之前,先了解其架構:

  1. APK (Android Package)

    • APK 是 Android 應用的安裝包,實際上是一個壓縮包,包含了應用的所有資源和代碼。
    • 常見的 APK 文件內結構包括:
      • AndroidManifest.xml:應用的配置文件,定義應用的元數據,如權限、活動(Activity)等。
      • classes.dex:應用的字節碼文件,存放經過編譯的 Java 程式碼,使用 Dalvik/ART 虛擬機執行。
      • res/:存放應用的資源,如圖片、佈局文件。
      • lib/:本地庫文件,包含用 C/C++ 編寫的 .so 文件。
  2. Dalvik & ART 虛擬機

    • Android 使用 Dalvik 和 ART(Android Runtime)來運行應用的 Java 字節碼。Dalvik 是早期的虛擬機,而 ART 是在 Android 5.0 後引入的新運行環境,使用 Ahead-of-Time (AOT) 編譯來優化應用的啟動速度。
  3. Android 許可權模型

    • Android 應用運行在一個受限的沙盒環境中,應用程式需要通過 AndroidManifest.xml 文件申請所需的權限。這些許可權控制了應用能夠訪問的系統資源(如相機、位置、文件系統等)。

逆向工程的過程

進行 Android 逆向工程的常見步驟如下:

  1. APK 反編譯

    • 反編譯工具可以將 APK 的字節碼反向轉換為接近人類可讀的 Java 代碼或 Smali 語言。

    常用工具:

    • APKTool:用來解壓和編譯 APK,反編譯資源文件及生成可編譯的 Smali 代碼。
    • JADX:將 .dex 文件反編譯為 Java 代碼,方便分析應用邏輯。
    • Bytecode Viewer:支持多種反編譯器,適合查看 Java 代碼、字節碼及 Smali 文件。

    流程

    • 使用 APKTool 解壓 APK,獲取其中的資源和配置文件。
    • 使用 JADX 或其他反編譯工具將 classes.dex 文件轉換為 Java 或 Smali 代碼。

    示例命令:

    apktool d myapp.apk    # 解包 APK
    jadx myapp.apk         # 反編譯為 Java 代碼
    
  2. 分析 AndroidManifest.xml

    • 這個文件定義了應用的入口點、服務、活動和權限。通常先分析這個文件,找出應用的主要功能以及潛在的漏洞(如未經授權的權限申請)。
  3. 資源文件提取

    • 通過解壓 APK,可以獲取資源文件如圖片、佈局、配置等,這對於分析應用的界面、交互方式非常有幫助。
  4. Smali 代碼與 Java 分析

    • APK 反編譯後生成的 Smali 代碼是 Dalvik 虛擬機的中間語言,類似於 Java 字節碼。可以通過分析 Smali 代碼理解應用的邏輯運行。
    • 反編譯成 Java 代碼後,雖然代碼可能有所混淆,但還是能直接查看應用的運行邏輯。
  5. 本地代碼(Native Code)分析

    • 有些 Android 應用會使用 JNI(Java Native Interface)調用本地的 C/C++ 程式碼,這些代碼會編譯成 .so 文件,存放在 APK 的 lib/ 文件夾中。
    • 可以使用工具如 GhidraIDA Pro 來反彙編這些 .so 文件,分析其行為。
  6. 動態調試與執行分析

    • 動態分析比靜態分析更能揭示應用在實際運行中的行為。通過在實際設備或模擬器中運行應用,結合調試工具進行觀察。

    常用工具:

    • Frida:強大的動態分析框架,可以插入腳本來攔截和修改應用運行中的行為。
    • Xposed Framework:允許開發者修改應用和系統的行為,常用於安全研究和漏洞分析。

混淆與防護技術

現代 Android 應用經常使用代碼混淆工具(如 ProGuard 或 R8)來保護應用程式不被輕易逆向工程。這些工具會混淆方法名稱、類名,甚至壓縮代碼,增加逆向分析的難度。

  1. ProGuard 和 R8

    • 混淆應用的類名和方法名,使得反編譯後的代碼難以閱讀。例如,一個方法可能會被重命名為 a(),而不是原本的 getUserInfo()

    破解混淆

    • 雖然混淆增加了難度,但使用一些工具如 procyon-decompilerFernflower 等,仍可以恢復部分可讀代碼。
  2. 加殼技術

    • 一些應用使用加殼技術,將其代碼包裹在一個保護層內,當應用啟動時,這些保護層會解密並運行應用原始代碼。

    解殼

    • 通過調試工具(如 FridaXposed),可以在應用解密後的時刻,提取出原始的內存內容,從而獲取未加密的 APK 代碼。

動態分析技巧

  1. Network Traffic Monitoring

    • 使用 Burp SuiteWireshark 監控應用的網絡流量,檢查應用與伺服器之間的數據傳輸。這在分析應用中是否存在數據洩露或不安全的 HTTP 請求時非常有用。
  2. 調試與鉤子技術(Hooking)

    • 使用 Frida 等工具來注入腳本,可以在應用運行時鉤取某些方法,修改應用的行為。例如,可以攔截一個方法的輸入和輸出來進行分析或測試。
  3. 模擬器與真機調試

    • 在模擬器或真機上進行應用運行時的分析,可以使用 adb(Android Debug Bridge)來查看應用的日誌、設置斷點,甚至直接修改內存內容。

常用工具

  1. APKTool

    • 用於反編譯和重新編譯 APK,處理資源文件和 Smali 代碼。
  2. JADX

    • dex 文件反編譯為可讀的 Java 代碼,適合靜態分析應用的邏輯。
  3. Frida

    • 動態分析框架,可以鉤取 Android 應用的運行時行為,並修改應用邏輯。
  4. Burp Suite

    • 網絡攔截工具,用於監控和修改應用的 HTTP 請求和響應,檢查應用與伺服器間的通信。
  5. Ghidra/IDA Pro

    • 用於分析本地 C/C++ 代碼,反彙編 .so 文件,進行漏洞挖掘或行為分析。
  6. adb (Android Debug Bridge)

    • 用來與 Android 設備進行通信,進行調試、文件操作、執行命令等。

Android 逆向工程的應用場景

  1. 安全研究
  • 分析應用是否存在安全漏洞,如數據洩露、不安全的 API 調用等。
  1. 惡意軟件分析

    • 通過逆向惡意軟件的 APK 文件,找出其惡意行為,並理解攻擊者的策略。
  2. 應用破解

    • 通過逆向分析破解應用的功能,如繞過應用的付費系統或解除應用限制。
  3. 應用優化

    • 理解應用底層實現,幫助優化性能或調整應用的行為。

結論

Android 逆向工程是理解應用內部運作的關鍵手段,無論是為了安全研究、漏洞挖掘,還是惡意軟件分析,都有廣泛應用。熟練掌握反編譯技術、Smali 代碼、動態分析工具,將大大提高逆向的效率和效果。隨著 Android 應用的安全防護措施不斷加強,逆向工程也面臨越來越多的挑戰,但這也是促進安全研究者和開發者進步的動力。


上一篇
資安新手的試煉之路 Day 17
下一篇
資安新手的試煉之路 Day 19
系列文
資安新手的試煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言