dex文件格式二
一. dex文件頭
(1) magic value在DexFile.c ? dexFileParse函數(shù)中 會(huì)先檢查magic opt
啥是magic opt呢? 我們剛剛從cache目錄拷貝出來(lái)的那個(gè)
前面的dey 036就是magic opt
在源碼中會(huì)先解析magic opt,然后重設(shè)dexfile指針
重設(shè)magic opt指針后開(kāi)始解析magic value這 8 個(gè) 字節(jié)一般是常量。數(shù)組的值可以轉(zhuǎn)換為一個(gè)字符串如下 :{ 0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00 } = "dex\n035\0"
(2) checksum文件校驗(yàn)碼 ,使用alder32 算法校驗(yàn)文件先用dexheader先校驗(yàn),校驗(yàn)失敗在使用opt header去校驗(yàn)
其校驗(yàn)算法如下除去maigc,checksum 外余下的所有文件區(qū)域 ,用于檢查文件錯(cuò)誤
(3)?signaturesignature , 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件區(qū)域 ,用于唯一識(shí)別本文件
由此可見(jiàn)我們?cè)谛薷牧薲ex文件之后,得先修正signature然后在修正checksum
(4) file_sizeDex 文件的大小 ,源碼中會(huì)拿該字段和傳入的長(zhǎng)度值進(jìn)行比較
(5) header_sizeheader 區(qū)域的大小 ,單位 Byte ,一般固定為 0x70 常量在DexSwapVerify.c ?dexSwapAndVerify
高版本不知道是不是這樣校驗(yàn)的 大于居然沒(méi)有置為okay
(6) endian_tag大小端標(biāo)簽 ,標(biāo)準(zhǔn) .dex 文件格式為小端 ,此項(xiàng)一般固定為 0x12345678常量?
CmdUtils.c ?程序調(diào)用主線從dexOpenAndMap->dexSwapAndVerifyIfNecessary->dexSwapAndVerify->swapDexHeader
這里邏輯有點(diǎn)繞,他默認(rèn)就會(huì)轉(zhuǎn)換一次, 如果是小尾,轉(zhuǎn)換之后就是大尾,那么校驗(yàn)就不會(huì)通過(guò)如果是大尾方式, 就轉(zhuǎn)換成小尾, 校驗(yàn)通過(guò),繼續(xù)后面的轉(zhuǎn)換流程
還一個(gè)校驗(yàn)是如果是odex格式,那么已經(jīng)是優(yōu)化之后的,則不需要轉(zhuǎn)換
其轉(zhuǎn)換算法如下:
(6) link_size和link_off這個(gè)兩個(gè)字段是表示鏈接數(shù)據(jù)的大小和偏移值
CHECK_OFFSET_RANGE 只是檢查是否超出文件指針?lè)秶?br />
(7) map_offmap item 的偏移地址 ,該 item 屬于 data 區(qū)里的內(nèi)容 ,值要大于等于 data_off 的大小 。
其結(jié)構(gòu)體指向:
MapItem
對(duì)應(yīng)的枚舉值
010Editor中呈現(xiàn)
(8) string_ids_size和string_ids_off這兩個(gè)字段表示dex中用到的所有的字符串內(nèi)容的大小和偏移值,我們需要解析完這部分,然后用一個(gè)字符串池存起來(lái),后面有其他的數(shù)據(jù)結(jié)構(gòu)會(huì)用索引值來(lái)訪問(wèn)字符串,這個(gè)池子也是非常重要的。后面會(huì)詳細(xì)介紹string_ids的數(shù)據(jù)結(jié)構(gòu)
(9) type_ids_size和type_ids_off這兩個(gè)字段表示dex中的類型數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,比如類類型,基本類型等信息,后面會(huì)詳細(xì)介紹type_ids的數(shù)據(jù)結(jié)構(gòu)
(10) proto_ids_size和type_ids_off這兩個(gè)字段表示dex中的元數(shù)據(jù)信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,描述方法的元數(shù)據(jù)信息,比如方法的返回類型,參數(shù)類型等信息,后面會(huì)詳細(xì)介紹proto_ids的數(shù)據(jù)結(jié)構(gòu)
(11) field_ids_size和field_ids_off這兩個(gè)字段表示dex中的字段信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,后面會(huì)詳細(xì)介紹field_ids的數(shù)據(jù)結(jié)構(gòu)
(12) method_ids_size和method_ids_off這兩個(gè)字段表示dex中的方法信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,后面會(huì)詳細(xì)介紹method_ids的數(shù)據(jù)結(jié)構(gòu)
(13) class_defs_size和class_defs_off這兩個(gè)字段表示dex中的類信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,這個(gè)數(shù)據(jù)結(jié)構(gòu)是整個(gè)dex中最復(fù)雜的數(shù)據(jù)結(jié)構(gòu),他內(nèi)部層次很深,包含了很多其他的數(shù)據(jù)結(jié)構(gòu),所以解析起來(lái)也很麻煩,所以后面會(huì)著重講解這個(gè)數(shù)據(jù)結(jié)構(gòu)
沒(méi)有類的話,dex校驗(yàn)會(huì)失敗
(14) data_size和data_off這兩個(gè)字段表示dex中數(shù)據(jù)區(qū)域的結(jié)構(gòu)信息的大小和偏移值,這個(gè)結(jié)構(gòu)中存放的是數(shù)據(jù)區(qū)域,比如我們定義的常量值等信息。到這里我們就看完了dex的頭部信息,頭部包含的信息還是很多的,主要就兩個(gè)個(gè)部分:1) 魔數(shù)+簽名+文件大小等信息2) 后面的各個(gè)數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,都是成對(duì)出現(xiàn)的下一節(jié)我們就來(lái)開(kāi)始介紹各個(gè)數(shù)據(jù)結(jié)構(gòu)的信息
來(lái)自為知筆記(Wiz)
(1) magic value在DexFile.c ? dexFileParse函數(shù)中 會(huì)先檢查magic opt
啥是magic opt呢? 我們剛剛從cache目錄拷貝出來(lái)的那個(gè)
前面的dey 036就是magic opt
在源碼中會(huì)先解析magic opt,然后重設(shè)dexfile指針
重設(shè)magic opt指針后開(kāi)始解析magic value這 8 個(gè) 字節(jié)一般是常量。數(shù)組的值可以轉(zhuǎn)換為一個(gè)字符串如下 :{ 0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00 } = "dex\n035\0"
(2) checksum文件校驗(yàn)碼 ,使用alder32 算法校驗(yàn)文件先用dexheader先校驗(yàn),校驗(yàn)失敗在使用opt header去校驗(yàn)
其校驗(yàn)算法如下除去maigc,checksum 外余下的所有文件區(qū)域 ,用于檢查文件錯(cuò)誤
(3)?signaturesignature , 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件區(qū)域 ,用于唯一識(shí)別本文件
由此可見(jiàn)我們?cè)谛薷牧薲ex文件之后,得先修正signature然后在修正checksum
(4) file_sizeDex 文件的大小 ,源碼中會(huì)拿該字段和傳入的長(zhǎng)度值進(jìn)行比較
(5) header_sizeheader 區(qū)域的大小 ,單位 Byte ,一般固定為 0x70 常量在DexSwapVerify.c ?dexSwapAndVerify
高版本不知道是不是這樣校驗(yàn)的 大于居然沒(méi)有置為okay
(6) endian_tag大小端標(biāo)簽 ,標(biāo)準(zhǔn) .dex 文件格式為小端 ,此項(xiàng)一般固定為 0x12345678常量?
CmdUtils.c ?程序調(diào)用主線從dexOpenAndMap->dexSwapAndVerifyIfNecessary->dexSwapAndVerify->swapDexHeader
這里邏輯有點(diǎn)繞,他默認(rèn)就會(huì)轉(zhuǎn)換一次, 如果是小尾,轉(zhuǎn)換之后就是大尾,那么校驗(yàn)就不會(huì)通過(guò)如果是大尾方式, 就轉(zhuǎn)換成小尾, 校驗(yàn)通過(guò),繼續(xù)后面的轉(zhuǎn)換流程
還一個(gè)校驗(yàn)是如果是odex格式,那么已經(jīng)是優(yōu)化之后的,則不需要轉(zhuǎn)換
其轉(zhuǎn)換算法如下:
(6) link_size和link_off這個(gè)兩個(gè)字段是表示鏈接數(shù)據(jù)的大小和偏移值
CHECK_OFFSET_RANGE 只是檢查是否超出文件指針?lè)秶?br />
(7) map_offmap item 的偏移地址 ,該 item 屬于 data 區(qū)里的內(nèi)容 ,值要大于等于 data_off 的大小 。
其結(jié)構(gòu)體指向:
MapItem
對(duì)應(yīng)的枚舉值
010Editor中呈現(xiàn)
(8) string_ids_size和string_ids_off這兩個(gè)字段表示dex中用到的所有的字符串內(nèi)容的大小和偏移值,我們需要解析完這部分,然后用一個(gè)字符串池存起來(lái),后面有其他的數(shù)據(jù)結(jié)構(gòu)會(huì)用索引值來(lái)訪問(wèn)字符串,這個(gè)池子也是非常重要的。后面會(huì)詳細(xì)介紹string_ids的數(shù)據(jù)結(jié)構(gòu)
(9) type_ids_size和type_ids_off這兩個(gè)字段表示dex中的類型數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,比如類類型,基本類型等信息,后面會(huì)詳細(xì)介紹type_ids的數(shù)據(jù)結(jié)構(gòu)
(10) proto_ids_size和type_ids_off這兩個(gè)字段表示dex中的元數(shù)據(jù)信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,描述方法的元數(shù)據(jù)信息,比如方法的返回類型,參數(shù)類型等信息,后面會(huì)詳細(xì)介紹proto_ids的數(shù)據(jù)結(jié)構(gòu)
(11) field_ids_size和field_ids_off這兩個(gè)字段表示dex中的字段信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,后面會(huì)詳細(xì)介紹field_ids的數(shù)據(jù)結(jié)構(gòu)
(12) method_ids_size和method_ids_off這兩個(gè)字段表示dex中的方法信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,后面會(huì)詳細(xì)介紹method_ids的數(shù)據(jù)結(jié)構(gòu)
(13) class_defs_size和class_defs_off這兩個(gè)字段表示dex中的類信息數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,這個(gè)數(shù)據(jù)結(jié)構(gòu)是整個(gè)dex中最復(fù)雜的數(shù)據(jù)結(jié)構(gòu),他內(nèi)部層次很深,包含了很多其他的數(shù)據(jù)結(jié)構(gòu),所以解析起來(lái)也很麻煩,所以后面會(huì)著重講解這個(gè)數(shù)據(jù)結(jié)構(gòu)
沒(méi)有類的話,dex校驗(yàn)會(huì)失敗
(14) data_size和data_off這兩個(gè)字段表示dex中數(shù)據(jù)區(qū)域的結(jié)構(gòu)信息的大小和偏移值,這個(gè)結(jié)構(gòu)中存放的是數(shù)據(jù)區(qū)域,比如我們定義的常量值等信息。到這里我們就看完了dex的頭部信息,頭部包含的信息還是很多的,主要就兩個(gè)個(gè)部分:1) 魔數(shù)+簽名+文件大小等信息2) 后面的各個(gè)數(shù)據(jù)結(jié)構(gòu)的大小和偏移值,都是成對(duì)出現(xiàn)的下一節(jié)我們就來(lái)開(kāi)始介紹各個(gè)數(shù)據(jù)結(jié)構(gòu)的信息
來(lái)自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/bingghost/p/5825515.html
總結(jié)
- 上一篇: 8.0/9.0 Email 设置
- 下一篇: python北京房价预测_python数