APK-DEX

什么是DEX

DEX概念

Dalvik Executable File , DEX是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。在程序编译过程中, java 源文件先被编译成class文件,然后通过dx工具将多个class文件整合为一个dex文件。这样的文件结构使得各个类能够共享数据,充分减少了存储空间,提升了运行效率

  DEX作用

当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右

使用 010或者 winHex 可以查看dex文件的格式和内容

DEX文件结构分布

DEX的数据结构

类型                           含义                  
u1 unit8_t,1字节无符号数
u2 unit16_t,2字节无符号数
u4 uint32_t,4字节无符号数
u8 unit64_t,8字节无符号数
sleb128 有符号LEB128,可变长度1~5
uleb128 无符号LEB128
uleb128p1 无符号LEB128值加1

表示1到8个字节的无符号数,后面三个是dex特有的数据结构

 DEX文件结构

数据名称 解释
header dex文件头部,记录整个dex文件的相关属性
string_ ids 字符串数据索引,记录 了每个字符串在数据区的偏移量
type_ids 类似数据索引,记录了每个类型的字符串索引
proto_ids 原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表
field_ids 字段数据索引,记录了所属类,类型以及方法名
method_ids 类方法索引,记录方法所属类名,方法声明以及方法名等信息
class_defs 类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量
data 数据区,保存了各个类的真实数据
link_data 连接数据区

header

header是DEX文件头,包含magic字段、alder32校验值、SHA-1哈希值、string_ids的个数以及便宜地址等。DEX文件的头结构很固定,占用0x70个字节。

具体定义代码如下:

header代码定义:

Header的大小固定为0x70,便宜地址从0x00到0x70,提取信息如下

      DEX文件结构之详解

      ### string ids

      string ids_ :这些是用于该文件的所有字符串的标识符,用于内部命名(如:类型描述)或代码引|用的常量对象。此列表必须按字符串内容排序,使用UTF-16代码点值,并且不能包含任何重复的条目。

      ### type ids

      type ids_ :这些是由该文件引 |用的所有类型(类,数组或原始类型)的标识符,无论是否在文件中定义,这个数据结构中存放的数据主要是描述dex中所有的类型,比如类类型,基本类型等信息。type ids区索引了dex文件里的所有数据类型,包括 class类型, 数组类型

      ( array types )和基本类型(primitive types)。此列表必须由 string id索|排序,并且不得包含任何重复的条目。

### class defs

class defs_ 必须对这些类进行排序,使得给定类的超类和实现的接口出现在引|用类之前的列表中。此外,对于同名类的定义在列表中不止一次出现是无效的。

## data

data_ : 数据区,包含上表列出的所有支持数据。不同的项目具有不同的对齐要求,并且如果需要,在每个项目之前插入填充字节以实现正确的对准。

### link data

link data :静态链接文件中使用的数据。本节中的数据格式未经本文档的说明。此部分在末链接的文件中为空,运行时实现可能会使用它们。

豫ICP备19031837号-1