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檔案,一探究竟:
所以.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檔案的格式以及如何開啟的方法。有興趣的使用者可以參考