第4章 Android dex檔案格式 第三節

2021-07-10 06:58:42 字數 2110 閱讀 3007

第4章 dex檔案格式 第三節

1、 環境配置

ubuntu 15.10 系統 ip:192.168.153.130

理解dex檔案整體結構

一、dex檔案整體結構

1、 dex檔案由7個部分組成。dex header為dex檔案頭,它指定了dex檔案的一些屬性,並記錄了其他6部分資料結構在dex檔案中的物理偏移。string_ids到class_def結構可以理解為「索引結構區」,真實的資料存放在data資料區,最後link_data為靜態鏈結資料區,對於目前生成dex檔案而言,它始終為空。

dex header

string_ids

type_ids

proto_ids

field_ids

methon_ids

class_ids

data

link_data

2、 dex檔案結構如下:

structdexfile ;

1)magic欄位標識了乙個有效的dex檔案,目前它的值固定為「64 65 78 0a 30 33 35 00」,轉換為字串為「dex.035」。

2)chencksum段為dex檔案的校驗和,通過它來判斷dex檔案是否被損壞或修改。

3)signature欄位用來識別最佳化之間的dex檔案,checksum欄位與signature欄位將dexopt驗證與優化。

4)filesize欄位記錄了包括dexheader在內的整個dex檔案的大小。

5)headersize欄位記錄了dexheader結構本身占用的位元組數,目前它的值為0x70。

6)endiantag欄位指定了dex執行環境cpu位元組序,預設值endian_constant等於0x12345678,表示預設採用little-endian位元組序。

7)linksize欄位與stringldsoff欄位指定鏈結段的大小與檔案偏移,大多數情況下它們的值為0。

8)mapoff欄位指定了dexmaplist結構的檔案偏移。

9)其他字段分別表示dexstringid、dextypeid、dexprotoid、dexfieldid、dexmethonid、dexclassdef以及資料段的大小與檔案偏移。

4、 dexheader結構下面的資料為「索引結構區」 與「資料區」,「索引結構區」中各資料結構的偏移位址都是從dexheader結構的stringidsoff~classdefsoff欄位的值指定的,它們並非真正的類資料,而是指向dex檔案的data資料區的偏移或資料結構索引。(dexdata欄位,實際上是ubyte位元組陣列,包含了程式所有使用到的資料)

二、dex檔案結構分析

1、 dalvik虛擬機器解析dex檔案的內容,最終將其對映成dexmaplist資料結構。dexheader結構的mapoff欄位指明了dexmaplist結構在dex檔案中的偏移,宣告如下。

struct dexmaplist;

2、size 字段表示接下來有多少個dexmapitem結構,dexmapitem的結構宣告如下。

struct dexmapitem ;

2、 type欄位為乙個列舉常量,如下所示名稱,通過型別很容易判斷它的具體型別。

enum;

dexmapitem中的size欄位指定了特定型別的個數,它們以特定的型別在dex檔案中連續存放。offset為該型別的檔案起始偏移位址。以hello.dex為例,dexheader結構的mapoff欄位為0x290,讀取0x290處的乙個雙字值為0x0d,表明接下來會有13個dexmapitem結構。使用

hexdump –c

命令開啟

hello.dex,如下圖:

注意:通過

dexmapitem

定義可以發現:這個定義的像類、字串、方法等資源和

dex檔案頭里定義的型別有很多是一樣的。其實這個

map的資料,就是頭里型別的重複,完全是為了檢驗作用而存在的。當

andriod

系統載入

dex檔案時,如果比較檔案頭型別個數與

map裡型別不一致時,就會停止使用這個

dex檔案。

APUE 第4章 檔案和目錄

函式列表 1。stat fstat和lstat函式 struct stat mode t st mode ino t st ino dev t st dev dev t st rdev nlink t st nlink uid t st uid gid t st gid off t st size ...

第4章 整合

4.1 尋找理想的整合技術的指導原則 避免服務方修改乙個欄位就引起消費方的修改 保證api的技術無關性 消費方應該能夠很簡單的使用服務方提供的服務,提供客戶端庫的做法會增加耦合。隱藏內部實現細節 4.2 musiccorp建立使用者介面 4.3 共享資料庫 資料庫整合 即消費者直接訪問資料庫 的缺點...

第4章 陣列

1 陣列儲存的是相同型別的一組元素 double arr 2 陣列的定義型別可以是任意型別,包含基本型別或引用型別 string arr person arr int arr person arr 3 陣列屬於引用型別,引用儲存在棧中,值儲存在堆中,又稱為物件。4 陣列的成員如果不賦值,有預設值。b...