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_sizestring_ids_off:表示的是dex中所用到的所有字符串内容的大小和偏移。
  • type_ids_sizetype_ids_off:dex中的类型数据结构的大小和偏移
  • proto_ids_sizeproto_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;
}

field_ids

results matching ""

    No results matching ""