Dex(Class)文件格式
Dex/Class文件的整体格式分三个部分:
- 文件头
- 索引区,指向后面的数据区的指针
- 数据存储区
文件头
header里一部分描述了.dex文件的文件基本信息,还有一部分是指出各个区域的索引。
具体的struct结构:
其中,蓝色的表示的是dex文件的基本信息。
- magic:一般是个固定的值,为了能被识别出来。
- { 0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00 } = "dex\n035\0"
- checksum:文件校验码,使用alder32算法(类似CRC算法)校验文件除去maigc,checksum外余下的所有文件区域,用于检查文件错误。
- signature:唯一标识文件的,使用SHA-1算法hash除去 magic,checksum和signature外余下的所有文件区域。
- file_size:dex/class文件的大小
- header_size:header的大小
- endian_tag:大小端,一般的dex文件格式都是小端序
- map_off:data区里的内容
- string_ids_size和string_ids_off:表示的是dex中所用到的所有字符串内容的大小和偏移。
- type_ids_size和type_ids_off:dex中的类型数据结构的大小和偏移
- proto_ids_size和proto_ids_off:dex中的元数据信息数据结构的大小和偏移量
索引区
string_ids
uint , 32-bit unsigned int , little-endian
struct string_ids_item
{
uint string_data_off;
}
其中string_data_off
只是一个偏移地址,它指向一个新的数据结构string_data_item
uleb128 : unsigned LEB128, valriable length
ubyte: 8-bit unsinged int
struct string_data_item
{
uleb128 utf16_size;
ubyte data;
}
type_ids
索引了dex文件里的所有数据类型,包括class类型,数组类型和基本类型。
struct type_ids_item
{
uint descriptor_idx;
}
descriptor_idx
是string_ids里的index序号,描述此type的字符串。
proto_ids
描述方法的元数据信息,如返回类型,参数类型等信息
uint 32-bit unsigned int, little-endian
struct proto_id_item
{
uint shorty_idx;
uint return_type_idx;
uint parameters_off;
}