dex檔案入門(二)

2021-07-11 22:46:59 字數 2944 閱讀 8634

proto指方法的原型,此處的原型指的是只有返回型別與引數型別(鏈結)。偏移offset後,儲存的結構體如下:

struct proto_id_item

從上面可以看出,每乙個proto_id_item佔12個位元組。

shorty_idx與前面的type一樣,指的是string_item中的下標,由該下標可得乙個字串,這個字串就是方法的原型。此時要注意:l代表的是引用資料型別,並不是某個基礎資料型別。

return_type_idx指的是前面的type的下標(因為有多個type,這些type構成乙個陣列,而該下標就是用來獲取這個type的),指方法返回值型別。

parameters_offset:指方法的引數的偏移量。每乙個引數的結構體如下:

struct type_list

從中可以看出,引數的位元組數是不固定的,但第乙個位元組永遠是用來標識引數的個數的。後面的位元組中,每兩個位元組表示該引數對應的type下標,根據type下標就可以得到引數的字串描述了如果引數的個數為奇數個,那麼最後兩個位元組補0,使位元組數為4的整數倍。注意:如果parameters_offset為0,則表示該方法木有引數。並且,原型中,第乙個表示返回值型別。示例:有一dex檔案,其header部分如下:

根據其offset,得到其部分proto_id_item如下:

每乙個proto_id_item佔12個位元組,取其第五個(即0x1298)做為分析。

首先看其原型。1298中儲存的值是0x93,即string_item中下標為93的string,這個位置對應的字串偏移量為0x9be0,值為iill。如下:

再看其返回值。129c中儲存的值是0x1,即type陣列中下標為1的type。這個位置對應的string下標為8b,再查詢得string的偏移量為0x9b74,值為i。

最後看其偏移量為0x8bd8。如下:

從中可以看出,一共有3個引數(0x8bd8指定),第乙個引數為type[0x1],第二個引數為type[0x27],第三個為type[0x6e]。

分析了string,type,proto三個值。總結一下:

1,string是最方便的,查詢到偏移量,根據位元組大小,讀取相應的位元組即可。

2,對於type,首先要找到該type對應的string下標,根據string下標,得到這個string的偏移量,再得到type的描述資訊。

3,proto。得到偏移量。再得到相應的原型對應的string下標,進而得到string的偏移量,最後才得到原型對應的字串。得到偏移量後,也就得到了返回值對應的type下標,根據type的演算法又得到返回值對應的字串。得到偏移量後,得到引數offset,進而知道有多少個引數,每乙個引數對應的type下標,最後才得到每乙個引數對應的字串。

4,在header中,size與offset都是四個位元組表示的。表示string,type,proto的偏移量時也是四個位元組。由string偏移量得到string的值時,具體幾個位元組由第乙個位元組決定。

5,proto的params_offset具體的位元組數是不固定的,由方法中引數個數決定。不夠補0,湊夠4的整數倍。

6,所有涉及到型別的,都是type的下標,所以涉及到string的都是string的下標。

欄位的個數與偏移量。結構體為

struct filed_id_item

第乙個字段表示fiele所屬的類的型別,第二個表示field本身的型別,第三個表示field的名字。除了最後乙個代表著string的下標外,其餘兩個都是type的下標。

具體獲取過程與上面一樣,根據type的下標獲取該type在string中的下標,從而得到字串的偏移量,再得到string本身。

其對應的資料結構為:

struct filed_id_item

第乙個為該方法所屬的class的型別,它的值是type的index。第二個為方法的原型,是proto的乙個index。第三個為方法名,為string的乙個index。

首先通過class_index得到方法所屬的類,再通過proto_idx得到方法的框架(含返回值型別,引數列表),最後通過name_idx得到方法名。這樣就湊齊方法了。

描述了class的定義。它儲存的item的結構體如下:

struct class_def_item

class_idx描述了類的型別,是type的index。

access_flags描述了類的訪問型別。如public static final等。

superclass_idx:描述了父類,是type的index。

inte***ce_off:介面。它指向的是介面的偏移量,被指向的為type_list(因為乙個類可能用多個介面,所以是list),每乙個是乙個type的下標。若沒有介面,則為0。

source_file_idx:原始檔對應的string的index。

annotations_off:注釋的偏移量。對應的結構為annotations_direcotry_item,如果沒有此項內容,則值為0。

class_data_off:該class使用到的資料的偏移量,對應的結構為class_data_item,若沒有此內容,則值為0。

static_value_off:值為乙個偏移量,對應的結構為encoded_array_item。若沒有,則值為0。

dex檔案格式入門

參考一參考二 參考三圖一 從上圖中列表可以看出,每一薦占有的位元組數。除magic 就是用於標識該檔案是dex檔案與當前的版本號的 以及signature 簽名驗證 外,其餘都是佔四個位元組。uint指的是unsigned int即無符號int型別。對於method ids size來說,它一共32...

什麼是dex檔案

odex是安卓上的應用程式apk中提取出來的可執行檔案,是通過apk安裝包的中的dex優化過的,再把apk包裡的dex檔案刪除。這樣做可以加快軟體的啟動速度,預先提取,減少對ram的占用,因為沒有odex的話,系統要從apk包中提取dex再執行。什麼是dalvik cache?準備工作 用recov...

DEX檔案解析 4 dex類的型別解析

dex檔案解析 1 dex檔案頭解析 dex檔案解析 2 dex檔案checksum 校驗和 解析 dex檔案解析 3 dex檔案字串解析 2 關於類的型別數量,沒什麼好說的,只需要注意它是以小端序儲存的,讀取的時候注意即可。對於類的型別偏移位址,找到偏移位址後,它是以四個位元組為一組,對應了在解析...