dex文件格式
2024-04-11 10:06:02 0 举报
AI智能生成
DEX(Dalvik Executable)文件格式是Android平台上用于存储和运行Java代码的文件格式。它是Dalvik虚拟机(DVM)的专属文件格式,用于存储Java源代码编译后的字节码。DEX文件通常由Java虚拟机编译生成,可以在Android操作系统的设备上运行。DEX文件格式主要包括文件头、索引区、字符串区、方法区等部分。文件头包含了DEX文件的基本属性,如版本号、文件大小等。索引区包含了字符串、类名、方法名等索引信息。字符串区存储了代码中所有的字符串常量。方法区存储了类中的所有方法信息,包括方法代码、异常表等。DEX文件格式的设计目的就是为了提高Android应用程序的执行效率和性能。
作者其他创作
大纲/内容
header_item header
ubyte magic[8]: dex文件标识,魔数值固定 0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00 = "dex\n035\0",不可修改
uint checksum: adler32校验和,用来检测文件是否损毁,修改dex必须修复checksum
ubyte signature[20]: SHA-1 签名,用于唯一标识文件,默认不校验
uin file_size: 整个文件总字节大小,增加或减少dex数据,必须修复file_size
uint header_size: 整个文件头的大小(默认是112字节,大了会出现警告,小于112会报错)
uint endian_tag:大小端字节序标记,目前只支持小端(0x12345678)
uint link_size: 静态链接数据大小:用于记录用户额外添加数据的大小,默认为 :
uint link_off:从文件开头到链接部分的偏移量,如果 link_size == 0,则为 0。如果偏移量不为 0,则应为 link_data 部分的偏移量
uint map_off: 从文件开头到map_list的偏移量,如果该文件没有map_list ,则为 0
uint string_ids_size: 字符串列表string_ids的字符串数量
uint string_ids_off: 字符串列表string_ids的起始偏移地址
uint type_ids_size: 类型标识符列表type_ids中元素的个数
uint type_ids_off: 类型标识符列表type_ids的起始偏移地址
uint proto_ids_size: 原型标识符列表proto_ids中元素的个数
uint proto_ids_off: 原型标识符列表proto_ids的起始偏移地址
uint field_ids_size: 字段标识符列表field_ids中元素的个数
uint field_ids_off: 字段标识符列表field_id的起始偏移地址
uint method_ids_size: 方法标识符列表method_ids中的元素计数
uint method_ids_off: 方法标识符列表method_ids的起始偏移量
uint class_defs_size: 类定义列表class_defs中元素的个数
uint class_defs_off: 类定义列表class_defs的起始偏移地址
uint data_size: 数据段的大小(字节),必须是 sizeof(uint) 的偶数倍
uint data_off: 数据段的起始偏移地址
string_id_item[] string_ids
uint string_data_off :对应string_data_item数据的偏移量
string_data_item
uleb128 utf16_size :字符串大小(字节数)
ubyte data :具体字符串(MUTF8格式)
type_id_item[] type_ids
uint descriptor_idx:在string_ids表中索引
proto_id_item[] proto_ids
uint shorty_idx:方法原型简式描述字符串(返回值+参数列表),在 string_ids 列表中的索引
uint return_type_idx 该方法原型返回值类型字符串,在 type_ids 列表中的索引
uint parameters_off 该方法原型参数类型列表数据的偏移量(数据符合type_item),如果该原型没有参数,则偏移量为 0
struct type_list
uint size:type_item的个数
type_item[] list :type_item数组
ushort type_idx:在 type_ids 列表中的索引
field_id_item[] field_ids
uint class_idx:表示该字段所定义在的类类型(不是数组或基本类型),在 type_ids 列表中的索引
uint type_idx: 表示该字段本身所属类型,在 type_ids 列表中的索引
uint name_idx:表示该字段名称,在string_ids 列表中的索引
method_id_item[] method_ids
uint class_idx:表示该方法所定义在的类类型(不是数组或基本类型),在 type_ids 列表中的索引
uint proto_idx:表示该方法原型(返回值+参数列表),在 proto_ids 列表中的索引
uint name_idx:表示该方法名称,在string_ids 列表中的索引
class_def_item[] class_defs
uint class_idx:表示该类类型(不是数组或基本类型),在 type_ids 列表中的索引
uint access_flags:表示类的访问标志(public、final 等)
uint superclass_idx:父类类型,在type_ids 列表的索引(若无则为常量值为 NO_INDEX)
uint interfaces_off:接口类型列表的偏移量(数据符合type_item,没有接口则为 0),详情见上面struct type_list
uint source_file_idx:源码文件名,在string_ids列表中的索引(如无值为 NO_INDEX 表示缺少该信息)
uint annotations_off:该类注解结构体(annotations_directory_item)的偏移量,如果该类没有注解,则偏移量为 0
uint class_data_off:类的数据部分偏移量(指向一个class_data_item结构的数据),如果该类没有类数据,则偏移量为 0
uleb128 static_fields_size:该类静态字段数量
uleb128 instance_fields_size:该类实例字段数量
uleb128 direct_methods_size:该类直接方法数量
uleb128 virtual_methods_size:该类静态方法数量
encoded_field[] static_fields:该类静态字段信息数组
uleb128 field_idx_diff:字段信息,在field_ids列表中的索引
uleb128 access_flags:访问修饰符,如public等
encoded_field[] instance_fields:该类实例字段信息数组
encoded_method[] direct_methods:该类直接方法信息数组
uleb128 method_idx_diff:方法定义信息,在method_ids列表中的索引
uleb128 access_flags:访问修饰符,如public等
uleb128 code_off:方法中代码信息,指向一个code_item结构的数据偏移地址
ushort registers_size:方法用到的寄存器个数(传入参数个数+调用其他方法参数个数)
ushort ins_size:方法传入参数的个数
ushort outs_size:代码调用其他方法时所需要的最大参数个数
ushort tries_size:try块(try_item表示)的个数
uint debug_info_off:该方法debug信息的偏移量,指向一个debug_info_item结构的数据
uint insns_size:该方法所有指令的数量(指令列表大小)
ushort[insns_size] insns:指令列表,存放所有指令,指令以16-bit为单位
ushort padding:用于对齐字节,默认为0
try_item[tries_size] tries:该方法用到的,所有try块(try_item)数组
uint start_addr:try的开始指令地址
ushort insn_count:try块中指令的数量
ushort handler_off:指向当前方法的handlers中一个encoded_catch_handler结构的偏移量
encoded_catch_handler_list handlers:异常处理相关(catch块)
uleb128 size
encoded_catch_handler[] list : 每个try块对应的catch块处理器
encoded_method[] virtual_methods:该类静态方法信息数组
uint static_values_off:类中静态数据偏移量,指向一个encoded_array_item结构的数据,若无静态字段,则偏移量为 0
struct map_list
uint size
map_item[size] list:map_item
ushort type:该项代表的item类型,就是以上那些item类型
ushort unused:对齐字节
uint size:所代表的的item数量
uint offset:所代表的item项起始偏移量
0 条评论
下一页