如何反編譯Android 5.0 framework

2021-03-06 CSDN

在Android平臺,對於和硬體交互相關的模塊來說,比如:和雙卡對應的Telephony模塊、和拍照對應的Camera模塊,以及Bluetooth模塊等等,不同廠商會不同程度的修改Android framework層對應的原生模塊代碼來達到他們自己的目的,這就給應用層的開發人員帶來了讓他們很頭疼的適配問題,嚴重會導致Crash等問題。為了更好的適配,我們不得不對framework層進行反編譯,在Android更新到5.0後,開發人員對framework的反編譯也出現了新的變化。

一、相關背景介紹

在5.0以前,我們可以直接從手機system目錄導出的framework文件夾根目錄裡找到相關的odex文件或者相關dex文件(解壓jar文件或apk文件得到),然後通過smali和dex2jar等工具就可以成功反編譯得到我們所需要的東西。但到了5.0,出現了兩個問題。

1. 以前分散在framework文件夾根目錄裡的那些odex文件全部集中在了framework文件夾中的arm(或arm64)子文件夾中,而且通過正常的反編譯發現這些odex並不是像5.0以前一樣是我們所需要的東西。


圖:arm文件夾裡的各種odex文件

2. 在arm(arm64)子文件中出現了兩個我們在5.0以前沒有見過的東西:boot.oat文件和boot.art文件,這兩個文件引起了我們的興趣,也是我們接下來分析的重點。


圖:arm文件夾裡重要的boot.oat文件和boot.art文件

二、對oat文件的分析

說到這個oat文件和art文件,我們不能不提Google在4.4版本以後新引入的ART運行時,這裡簡要的說一下:我們都知道在4.4以前,Android應用程式運行的核心基礎是Dalvik虛擬機,這個Dalvik虛擬機原先是Apache開源的一個JVM的優化版本,而Google又對Dalvik虛擬機進行了特別的優化來適應Android系統,所以Dalvik虛擬機本質就是JVM。

儘管Google花了大力氣優化Dalvik虛擬機,但是效果目前來看還不能讓Google滿意。為了Android系統的流暢度能更上一層樓,在Android進化到4.4版本時,Google決定拋棄Dalvik虛擬機引入全新的ART運行時。其實,ART運行時依然還是Java虛擬機的實現,只是ART運行時更高效更好用。


圖:左邊對應Dalvik虛擬機,右邊對應ART運行時(原圖出處:羅昇陽——Android ART運行時無縫替換Dalvik虛擬機的過程分析)

和Dalvik虛擬機相比,ART運行時執行的是本地機器碼,雖然Dalvik虛擬機也使用JIT(Just-In-Time)將dex字節碼翻譯成本地機器碼,但是是在應用程式的運行過程中進行的。所以在效率方面還無法和ART運行時相比,ART運行時會在應用程式安裝的時候就通過dex2oat將dex字節碼翻譯成本地機器碼,而這個由ART翻譯出來的本地機器碼會對應著一個oat文件。


圖:函數run_dex2oat通過調用dex2oat來將dex字節碼翻譯成本地機器碼

其實,oat文件是一種特殊的ELF文件(關於ELF文件的具體內容可以Google相關內容),通過前面的介紹可以知道它包含本地機器碼(從dex翻譯而來),此外還包含有原來的dex文件內容,本質上它依然是一種預編譯文件。這就告訴我們,oat文件就是把過去的很多dex文件一起合併輸入然後由ART運行時在安裝時翻譯成本地的機器碼然後再打包轉換輸出就OK了。

同樣的道理,我們知道system分區的文件都是在廠商在壓制ROM時打包進去的, framework文件夾裡面的內容尤其是各種dex文件等會在系統啟動後通過arm(或arm64)子文件夾裡的boot.art文件來指定啟動一個ART運行時實例,然後把這些classes.dex等dex文件合併輸入到ART再翻譯成本地機器碼打包成oat文件,這就是我們需要的核心文件boot.oat的大致生成過程(具體的過程比較複雜,詳細情況可以自行Google相關內容)。到此,我們簡單的介紹了oat文件的來歷,oat文件裡有什麼,以及oat文件的生成過程。

三、反編譯的核心:「拆開」oat文件

有了以上的了解,我們可以知道,反編譯boot.oat文件的核心步驟就是把之前很多dex合併起來生成的oat文件拆開。之前我們在oat是怎麼來的時候提到過,ART運行時會通過dex2oat把很多dex文件合併打包然後翻譯轉換成oat。所以相同的道理,如果要有一個oat2dex工具就好了。可喜的是,真的有oat2dex工具的存在,有了這個工具,我們就可以把我們需要的boot.oat文件給拆卸開了。

在拆開boot.oat文件後,會在原來的arm(或arm64)文件夾裡再自動生成兩個子文件夾:dex文件夾和odex文件夾,而這兩個文件夾中的文件幾乎一樣,都是一些dex文件,在這些dex文件中,一定有你需要的dex文件。接下來的工作就和以前的步驟一樣了。


圖:反編譯oat的核心:oat2dex.jar文件


圖:反編譯成功後自動生成的dex和odex子文件夾


圖:反編譯成功後在dex文件夾裡生成的dex文件

四、總結

Android 5.0的反編譯問題,其實質和以前並沒有發生變化,只是在過程上繞了一個彎,而這個彎就是如何拆解ART運行時帶來的oat文件,在我看來,oat文件依然是一個和apk文件類似的東西,它包含了apk或jar中的所有類信息,比如:方法,描述信息,偏移列表等等,是一個非常核心的文件。

儲俊雄(Looper),騰訊優測高級研發工程師,畢業於大連東軟信息學院,騰訊優測產品支撐組開發人員;專注於Android開發,在騰訊優測從事騰訊手機管家適配開發工作。

相關焦點

  • APKtool反編譯使用教程
    常見問題以下大部分其實是翻譯自http://code.google.com/p/android-apktool/wiki/FrameworkFiles一般來說,你在使用apktool進行反編譯前不需要做其他的事情,然而由於有的廠商,如HTC,三星等,他們定製了framework
  • Android逆向之旅---反編譯利器Apktool和Jadx源碼分析以及常見反編譯錯誤修復
    至於為什麼要分析這個工具其實原因只有一個,就是我們在之前的反編譯過程中會發現,總是有那麼幾個apk應用不讓我們那麼容易的反編譯,他們就利用apktool的漏洞,對apk做了一定的混淆工作,所以我們需要通過分析源碼來解決這些異常錯誤,從而能夠對每個apk反編譯都是如魚得水。
  • Framework學習Android系統源碼下載與編譯
    下面列出了各 Android 版本與編譯系統版本的對應關係Linux:Android 版本GNU/LinuxAndroid 6.0 (Marshmallow) - Android最新版本Ubuntu 14.04 (Trusty)Android 2.3.x (Gingerbread) - Android 5.x (Lollipop)
  • android apk 防反編譯技術第一篇-加殼技術
  • Android反編譯(逆向)教程
    在網上搜索Android反編譯教程,搜出來的文章要麼是抄襲的,要麼是太過與簡單,經過自己的實踐和摸索,我在這裡記錄下如下反編譯一個Apk並修改一些資源文件
  • Android FrameWork學習(一)Android 7.0系統源碼下載\編譯
    關於Android7.0系統 源碼下載和編譯做了一些總結。之前有人在研發群裡老問7.0源碼編譯的問題。v10.6 (Snow Leopard) or Mac OS X v10.7 (Lion) and Xcode 4.2 (Apple’s Developer Tools)Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich)Mac OS v10.5 (Leopard) or Mac OS X v10.6 (Snow Leopard) and
  • APK反編譯及防護技術
    本文我們主要一些android反編譯與防護技術方法。(二)常見的反編譯工具下面我們一看看有哪些常見的Android APK反編譯工具: Apktools:輕鬆鬆反編譯apk,解析出資源文件,xml文件,生成smali文件,還可以把修改後的文件打包生成apk。
  • Android Apk的反編譯和加密
    下面就簡單介紹一下如何將我們從網上下載的Apk文件進行反編譯得到我們想要獲得的資源文件和源碼。一、Apk文件組成  Android的應用程式APK文件說到底也是一個壓縮文件,那麼可以通過解壓縮得打裡面的文件內容,不過很顯然,當你去解壓完去查看的時候,發現裡面的很多東西和你想像中的不太一樣。
  • Android 如何從應用深入到Framework(三)
    Framework (二)Android 如何從應用深入到Framework (一)先回答留言提出的問題,當前在做應用開發,想做framework,該如何實施。我們先來講下framework是什麼。這個單詞的意思為框架,什麼框架呢?我們一個APK由哪些組成呢?xml配置組件,如何解析這個xml,組件的類別具體如何實現,比如activity生命周期,service啟動過程,廣播的處理流程,前臺廣播,後臺廣播,ANR怎麼產生的,系統怎麼處理的。這些都是系統提供的,這種應用開發,無法繞過的,調用系統方法的這些內容,就是框架。
  • Android Studio 編譯常見問題解決辦法
    ] E:\as_workspaces\DJIgo\tongyan_bugs_framework_master\build\intermediates\exploded-aar\DJIgo\tysubwayinspection3.0-framework\unspecified\AndroidManifest.xmlSuggestion: use tools:overrideLibrary
  • Android反編譯從零到一
    本篇來自 OpenDreamer 的投稿,分享了反編譯的相關知識,一起來看看!希望大家喜歡。0到1系列第一篇。該篇目的是讓讀者了解反編譯的基本過程,可以完全沒有基礎,也不用了解smali語法。文章裡面demo提供所有 需要使用的apk以及相應的修改代碼。只需傻瓜式的模仿就能夠學會。反編譯與防反編譯的0到1系列主要用於增加反編譯技術棧,避免一些低級的錯誤讓軟體被有心者破解。因此後續還會有smali語法的介紹和smali的修改。 在.so文件中添加籤名驗證。
  • Android 編譯過程 - Android10.0編譯系統(三)
    Android7.0 Google引入了soong構建系統,用來逐步替代GNU make的編譯,因此在Android10.0 上,make 執行後,我們走的是 soong 構建環境。/hellogo android/hello/    執行命令:.
  • 深入理解 flutter 的編譯原理與優化
    它是用什麼語言編寫的,包含哪幾部分,是如何被編譯,運行到設備上的呢?Flutter 如何做到 Debug 模式 Hot Reload 快速生效變更,Release 模式原生體驗的呢?Flutter 工程和我們的 Android/iOS 工程有何差別,關係如何,又是如何嵌入 Android/iOS 的呢?Flutter 的渲染和事件傳遞機制如何工作?Flutter 支持熱更新嗎?
  • 破解第一個Android程序
    --破解Android程序的方法通常是:使用ApkTool反編譯APK文件,生成smali格式的反彙編代碼;通過閱讀smali文件的代碼來理解程序的運行機制,找到突破口,並對代碼進行修改;使用ApkTool重新編譯生成APK文件並對其進行籤名;運行測試——如此循環,直至程序被破解。
  • Ubuntu 編譯 AOSP android 10.0
    repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r15④ 配置 android studio 打開方式sudo gedit /usr/share/applications
  • 【Framework】速通 Android AOSP基礎
    環境搭建流程基本是一致的,遇到問題善用搜尋引擎~Android Open Source Package,安卓系統開源源碼包,Android移動終端平臺 (高通、MTK等) 先基於原生的Android代碼進行更改,形成自己的平臺代碼,其他手機廠商再根據平臺代碼提供自己的移動端解決方案 (系統定製)。
  • android apk 防止反編譯技術第二篇-運行時修改字節碼
  • apk 下載 反編譯一氣呵成
    那麼如何模仿呢,我覺得需要以下這麼幾步。 1、下載apk文件。 2、獲取圖片資源 3、獲取代碼資源獲取 Apk 文件Google Paly 的 apk 獲取方式方式一:瀏覽器輸入 https://apps.evozi.com/apk-downloader/ ,輸入 apk 的網頁地址。
  • Facebook AI提出基於神經的反編譯框架N-Bref,優於基於啟發式的反編譯器
    該方法的性能優於傳統的基於啟發式的反編譯器。當原始碼不可用時,反編譯是分析和理解軟體的強大技術。它是計算機安全領域的一個關鍵問題。隨著神經機器翻譯(NMT)的成功,與傳統的反編譯方法相比,基於神經網絡的反編譯器的研究取得了很好的效果。反編譯器可以將低級可執行代碼(如彙編語言)轉換為高級程式語言(如 C++),使得代碼可讀性更強。這種反編譯程序對於檢測計算機安全中的漏洞、異常以及取證都很有用。
  • 【連載】聊聊 APK(三) —— Android 資源編譯的秘密
    答案是從 aapt 編譯出來的。使用 aapt 編譯資源以上我們介紹了 Android 加載資源的策略,接下來我們就要介紹資源編譯了,為什麼資源也需要編譯?可能 Google 也是這麼想的,所以其實 28.0.3 還是帶了 aapt 的二進位文件 ———— 只是不讓你在 gradle 中用而已(你會發現 android.enableAapt2=false 不起作用)。