1. 程式人生 > >Android ART執行環境下Image檔案格式簡析

Android ART執行環境下Image檔案格式簡析

可以通過閱讀程式碼來幫助分析Image檔案的格式。

首先,在art\runtime\Image.h檔案中,有相關的定義:

byte magic_[4];
byte version_[4];

// Required base address for mapping the image.
uint32_t image_begin_;

// Image size, not page aligned.
uint32_t image_size_;

// Image bitmap offset in the file.
uint32_t image_bitmap_offset_;

// Size of the image bitmap.
uint32_t image_bitmap_size_;

// Checksum of the oat file we link to for load time sanity check.
uint32_t oat_checksum_;

// Start address for oat file. Will be before oat_data_begin_ for .so files.
uint32_t oat_file_begin_;

// Required oat address expected by image Method::GetCode() pointers.
uint32_t oat_data_begin_;

// End of oat data address range for this image file.
uint32_t oat_data_end_;

// End of oat file address range. will be after oat_data_end_ for
// .so files. Used for positioning a following alloc spaces.
uint32_t oat_file_end_;

// Absolute address of an Object[] of objects needed to reinitialize from an image.
uint32_t image_roots_;

下面一一說明:

1)  最先的4個位元組是Image檔案的magic code,其值在對應的art\runtime\Image.cc檔案中有定義:

const byte ImageHeader::kImageMagic[] = { 'a', 'r', 't', '\n' };

2)  接下來的4個位元組是Image檔案的版本號,同樣在Image.cc檔案中有指定:

const byte ImageHeader::kImageVersion[] = { '0', '0', '5', '\0' };
3)  再下來的4個位元組指定了Image檔案對映到記憶體中的起始地址;

4)  再下來的4個位元組說明了Image檔案的大小,這是沒有根據頁4K對齊後的大小;

5)  再下來的8個位元組用來指定Image的bitmap,先4個位元組說明bitmap相對檔案頭所在記憶體地址的偏移,後4個地址說明bitmap的具體大小,至於bitmap的具體作用,以後再說;

6)  再下來的4個位元組指定了所要連結的oat檔案的checksum,方便以後在執行時檢查;

7)  再下來的4個位元組是Boot Oat檔案在記憶體中的起始地址,該地址同時也在包含Oat的Elf檔案中指定,從而保證在dlopen後加載到這個特定的地址;

8)  再下來的4個位元組是Boot Oat檔案中資料段的起始地址,該地址和Boot Oat檔案中符號oatdata指定的地址一樣;

9)  再下來的4個位元組是Boot Oat檔案中資料段的結束地址,該值等於Boot Oat檔案中符號oatlastword+4;

10)             再下來的4個位元組是Boot Oat檔案在記憶體中的結束地址,該值可以定位用於動態記憶體分配的記憶體段;

11)             最後的4個位元組很關鍵,它是一個地址,指向了一個ObjectArray,裡面包含了非常重要的物件。具體來說,一共有7個:

enum ImageRoot {
  kResolutionMethod,
  kCalleeSaveMethod,
  kRefsOnlySaveMethod,
  kRefsAndArgsSaveMethod,
  kOatLocation,
  kDexCaches,
  kClassRoots,
  kImageRootsMax,
};
就先說這麼多,具體每個的作用稍後再分析。

目前為止,羅列了那麼多概念,估計大家頭也暈了,下面舉個例子吧。筆者有一臺Google Nexus 7二代裝置,開啟開發者選項,切換到ART執行環境,並且root過後,可以把Image檔案([email protected]@boot.art)和Boot Oat檔案([email protected]@boot.oat)拿出來。首先,用二進位制編輯工具開啟.art檔案,一探究竟:


從中我們可以看出,magic code是“art\n”,版本號是“005\0”,Image檔案對映到記憶體中的起始地址是0x60000000,Image的大小是0xA9BDB0,Bitmap的偏移是0xA9C000,大小是0x2A6F8。0xA9C000+0x2A6F8=0xAC66F8,這個值正好是.art檔案的大小。


所以.art檔案實際就是由Image加上其Bitmap組成。好,我們繼續,接下來的0xE566C279是要載入的oat檔案的checksum,.oat檔案的起始地址是0x60A9C000,結束地址是0x64618000,.oat檔案的資料段起始地址是0x60A9D000,結束地址是0x646161A8。所有這些絕對地址在.oat檔案中也有記錄,讓我們用readelf開啟.oat檔案看看,Program Headers如下:


可以看到,對映到的實體地址強制寫到0x60A9C000。再看看oatdata和oatlastword:


可以看到,.oat檔案中記錄的這些值和.art檔案中所記錄的是一致的。最後的4個位元組為0x60A9BCC0,讓我們移步到這個地址,看看有些什麼東西:


這塊應該就是一個ObjectArray,裡面記錄了7個Object,可以很輕易的看到,其中記錄了oat檔案的位置(kOatLocation,第5個物件)。

相關推薦

Android ART執行環境Image檔案格式

可以通過閱讀程式碼來幫助分析Image檔案的格式。 首先,在art\runtime\Image.h檔案中,有相關的定義: byte magic_[4]; byte version_[4]; // Required base address for mapping the

centos7安裝android studio執行環境

首先去android studio官方網站下載linux版本的,對應的版本如下圖所示: 因為android studio只是一個ide,android的程式設計環境三基於java的,所以要配置java jdk環境,centos7自帶的jdk是openJDK,我們要解除安裝它,然後重新在jd

android 獲取指定路徑所有檔案,將檔案從一個目錄copy到另一個目錄,執行linux命令

/** * 複製整個資料夾內容 ,可以從data/data/包名下 拷貝到 data/data/包名下。也可以copy到 /sdcard 下 * @param oldPath String 原檔案路徑 如:c:/fqf

Android的Dalvik和ART執行環境比較

Android 4.4 中谷歌為開發者提供了兩種編譯模式,一種是預設的Dalvik模式,而另外一種則是ART模式。 2014年穀歌正在對Android系統進行調整,簡單點說就是ART已經取代Dalvik成為預設選項。一直以來,Dalvik虛擬機器揹負著Andr

springboot --- 不同執行環境FileUtils工具類上傳檔案的位置

不同執行環境下FileUtils工具類上傳檔案的位置 1.下邊這個是我經常用的一個java自帶的檔案上傳方法,其實這個主要用於臨時檔案的上傳,挺好用。但我在專案中,從來沒關注過它的路徑位置。本文主要測試檢視專案在不同執行方式下,tempFile的絕對路徑位

Linux環境檔案的行首或者行尾新增字串方法(乾貨)

1. sed 's/$/ aischang/'   abc.txt  >> test.txt 將檔案abc.txt追加 aischang到每行末尾,寫入到檔案test.txt, $為末尾符號,$代表替換末尾為 aischang 2. sed 's

ASP.NET 多環境配置檔案web.config的靈活配置---轉

轉自:https://www.cnblogs.com/hugogoos/p/6426887.html 除錯,釋出Asp.net程式的時候,開發環境和釋出環境的Web.Config往往不同,比如connectionstring等。如果常常有除錯,釋出的需求,就需要常常修改web.config檔案,這往往是一件

VLC-Android 在ubuntu環境編譯

由於在使用vlc的過程中發現了關閉資源需要30s的bug,所以準備自己編譯一個vlc的最新版本的庫來。 環境準備官網wiki ubuntu16+ 第一步:需要安裝好ubuntu,作者是在mac上安裝的ubuntu的虛擬機器來進行編譯的 編譯環境 sudo apt-get

記一次問題,linux檔案格式的問題

今天做的一個功能,需要將mysql中的資料,存入redis中去,使用了管道的命令,將需要儲存的欄位,拼接為redis命令的檔案,然後,利用linux的管道命令,將資料存入redis中去。   cat redis_commend.txt | redis-cli -p 9600

Android安全/安全技術--21--基礎檔案格式解析

4-1、so檔案格式解析 1、ELF檔案格式 Android中的so檔案就是ELF檔案,瞭解so檔案首先需要了解ELF檔案的格式,使用工具為readelf,常用命令如下: 1、檢視so檔案的頭部資訊 readelf -h xxx.so //

android開發-Windows環境編譯FFMPEG原始碼

1.簡介 之前有兩篇文章講到如何在windowsPC端使用FFMPEG命令列程式。 但是我想要在android開發時使用FFMPEG的功能又該怎麼辦?所以就需要編譯FFMPEG,然後才能使用。這才有了這篇文章。 1.先講思路,2.後講具體流程! 但是首先有個問題就是我

開發環境PP檔案的建立

開發環境下Provisioning Profile檔案的建立。 當我們在做iOS開發的時候,總是新增很多證書,來保證安全性。Provisioning Profile我們又稱PP檔案。這個檔案將證書、App Id和裝置相關聯。本章節就是教大家如何建立開發環境下的

Linux環境查詢檔案的安裝路徑

Linux中檢視某 個軟體的安裝路徑(地址)有時顯得非常重要。比如某個檔案的快速啟動項被刪除,或者你要建立快速啟動項,或者想刪除、 新增安裝檔案等等,很多地方都要用到查案檔案安裝路徑的命令。 這裡給大家介紹Linux檢視檔案安裝路徑(地址)命令。 一、檢視檔案安裝路徑

Linux環境Samba檔案共享服務

01 服務概述 在Windows網路環境中,主機之間進行檔案和印表機共享是通過微軟公司自己的SMB/CIFS網路協議實現的。SMB(Server Message Block,服務訊息塊)和CIFS(Common Internet File System,通用網際網路檔案系

Android——離線開發環境的安裝與配置

前提jdk安裝並且配置成功。參考部落格https://blog.csdn.net/t_yoo_csdn/article/details/79726772一, gradle方法1:(驗證可以)在工程目錄\gradle\wrapper\gradle-wrapper.propert

Android逆向之旅---SO(ELF)檔案格式詳解

第一、前言從今天開始我們正式開始Android的逆向之旅,關於逆向的相關知識,想必大家都不陌生了,逆向領域是一個充滿挑戰和神祕的領域。作為一名Android開發者,每個人都想去探索這個領域,因為一旦你破解了別人的內容,成就感肯定爆棚,不過相反的是,我們不僅要研究破解之道,也要

Android獲取assets目錄檔案和圖片

      在android studio中預設不會像eclipse一樣自動新建assets檔案,首先將android studio的檢視切換到project下,src/man下直接新建檔案命名為assets即可。       1、獲取圖片 Bitmap bitmap = n

Android studio執行添加簽名檔案

使用第三方登入時專案必須打包簽名才能調起微信很麻煩 在app的build.gradle檔案中添加簽名檔案,執行直接就有了簽名的app android { compileSdkVersion 24 buildToolsVersion "24.0.3" signing

Android讀取assets目錄所有檔案

package org.crazyit.image; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.content.

win7系統epub檔案格式及開啟方法

    最近有win7系統使用者提到一個問題即epub是什麼格式檔案、要怎樣開啟epub格式檔案,其實ePub是一個自由的開放標準,屬於一種可以“自動重新編排”的內容,也就是文字內容可以根據閱讀裝置的特性,以最適於閱讀的方式顯示。下面小編就來說說有關epub檔案的格式以及如何開啟的方法。有興趣的使用者可以參考