dex檔案格式入門

2021-07-11 21:50:17 字數 2828 閱讀 7355

參考一參考二

參考三圖一:

從上圖中列表可以看出,每一薦占有的位元組數。除magic(就是用於標識該檔案是dex檔案與當前的版本號的)以及signature(簽名驗證)外,其餘都是佔四個位元組。uint指的是unsigned int即無符號int型別。

對於method_ids_size來說,它一共32位,所以表示的最大數為2的32次方,因此乙個dex檔案最多就只能有65536個方法。

這應該是header中最難理解的乙個。其實它指的是map_list的偏移量。首先看乙個.dex檔案的header。如下:

其中紅框中的就是map_list的偏移量——3c48,因為endian_tag是78563412,所以讀的值是3c48。

再看3c48處的內容

其4個位元組的值是0x12,也就是18。

現在看一下map_list的資料結構。如下:

/*

*/ typedef struct dexmaplist dexmaplist;

從中可以看出,3c48處的值0x12指的就是該結構體的size,因為0x12指的是一共有18個dexmapitem。

再看一下dexmapitem的資料結構。如下:

/*

*/ typedef struct dexmapitem dexmapitem;

從中可以看出,每乙個item一共有12個位元組(這一點從圖一中的最右邊的上半部分也可以看得出來)。

從3c4c開始(含,因為3c48用於儲存map_list的size,不能算在內),每12個位元組算乙個,數到.dex檔案最後,一共會有18個(即3c48指定的0x12)。

下面分析3c4c到3c57這12個位元組的裡的內容——從上面知道它是乙個map_item。

3c3c-3c4d表示map_item中的type,此時是00,所以type型別為0,再對照type**,可以看出它指的是header_item;3c4e-3c4f指的是map_item中的unused,也就是沒有使用的部分,所以全部是0。3c50-3c53,指的是map_item中的size,此處值為1,也就是只有乙個dex檔案;3c54-3c57,全部是0,也就是說header的偏移為0,即從.dex的開頭處開始算。

再看3c58-3c63,根據上面的分析可以看出,它指的是string_id_item,共有0x118個,偏移量為0x70。再跟header中指向string_id的進行比對,可以發現是一樣的。如下: 圖二

其餘的幾個item一樣可以進行比對,都是一樣的。

用於標識字串,前者表示字串的個數,後者表示字串開始的處的偏移量。從上圖中可以看出,字串共有0x118個,從0x70處開始;type共有0x3e個,從0x4d0開始。而(0x4d0-0x70)/0x118結果為4,也就是說從0x70處開始,每4個位元組表示乙個字串具體值在dex檔案中的偏移量。這一點,從其定義處也可以看出來:

/*

*/typedef struct dexstringid dexstringid;

下面是0x22a6處的資料,如下:

在0x22a6的下乙個字串為0x22a8,這中間的的資料就是0x0000。

字串的結尾是為'\0'字元標識的,所以上面的0x0000中的後兩位就是用來表示字串結束符的。而前兩個0表示字串乙個有多少個位元組(不包含最後的結尾符,也不包含這個位元組本身)。

如上圖,0x22ab處為0x06,也就表示有6個位元組,因此0x3c696e69743e表示乙個字串,而後面的00表示這個字串的結束。下乙個字串開始的位置就是0x22b3,正好可以與圖二對住。

用於標識type的個數與偏移量。偏移位置處儲存的是一些type_ids_item,它的結構體如下:

struct type_ids_item

由上可以知道每乙個item只佔四個位元組,這四個位元組表示的值是descriptor_idx(即描述下標)——它定義了這些type_item在string_item中的下標,而通過string_item又可以找到具體的文字,這些文字就是這個type的描述。如下是乙個dex檔案的資訊(圖三)

從中可以看出一共有6個type,type_item的偏移量為0xa8。從0xa8處往下數6個,分別是0x2,0x3,0x4,0x5,0x6與0x7。這些值分別表示這個type的描述在string_item中的下標。

而string_item的偏移量為0x70,且每四位代表乙個string,所以下標為0x2的string的偏移量為0x186。在0x186處,資料為0x01,再根據前面關於string的理解可以知道,這個string只有乙個字元,就是0x01下面的乙個——0x4a(它對應的是j,即long),0x4a下乙個位元組為00,代表這個字串的結束。

根據上面的思路可以分析出0x6為void,0x7為boolean的。

dex檔案入門(二)

proto指方法的原型,此處的原型指的是只有返回型別與引數型別 鏈結 偏移offset後,儲存的結構體如下 struct proto id item 從上面可以看出,每乙個proto id item佔12個位元組。shorty idx與前面的type一樣,指的是string item中的下標,由該下...

Oracle 控制檔案格式ctl檔案格式

options skip 1,errors 10 load data characterset zhs16gbk infile into table table name truncate fields terminated by optionally enclosed by trailing nu...

檔案格式 gff格式

gff檔案格式 gff格式是 sanger 研究所定義,是一種簡單的 方便的對於 dna rna以及蛋白質序列的特徵進行描述的一種資料格式,已經成為序列注釋的通用格式,比如基因組的基因 許多軟體都支援輸入或者輸出gff格式。前格式定義的最新版本是版本3。原始定義見 song websitegff是存...