type
status
date
slug
summary
tags
category
icon
password

0、准备工作

要了解dex肯定要生成dex文件
  1. 先写一段java代码(Test.java)
    1. 用javac编译为class文件
      1. javac Test.java
    1. 用d8(SDK28以上叫d8,以下叫dx)生成dex文件
      1. D:\Android_tools\as\SDK\build-tools\36.0.0\d8 --output . Test.class
    然后把classes.dex文件放入010editor,就可以开始学习了
    数据类型
    自定义类型
    原类型
    含义
    s1
    int8_t
    有符号单字节
    u1
    uint8_t
    无符号单字节
    s2
    int16_t
    u2
    uint16_t
    s4
    int32_t
    u4
    uint32_t
    s8
    int64_t
    u8
    uint64_t
    sleb128
    有符号LEB128,可变长度
    uleb128
    无符号LEB123,可变长度
    uleb128p1
    等于ULEB128 + 1,可变长度

    1、dex文件结构

    图1自己画的概图,图2来自52pj Hawcett
    notion image
    notion image
    dex文件结构比pe文件简单,主要包含以上数据体
    数据名称
    解释
    Header
    dex头部文件,记录dex文件属性
    String_ids
    字符串数据索引,记录每个字符串在数据区的偏移量
    Type_ids
    类似数据索引,记录了每个类型的字符串索引
    Proto_ids
    原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表
    Field_ids
    字段数据索引,记录方法所属类,类型以及方法名
    Method_ids
    类方法索引,记录方法所属类名,方法声明以及方法名等信息
    Class_defs
    类定义数据索引,记录制定类各类信息,包括接口、超类、类数据偏移量
    Data
    数据区,记录了各个类的真实数据
    Link_data
    链接数据区

    header

    我们可以在010editor里查看文件结构
    notion image
    这里已经比较直观了,也可以写个脚本直接查询
    效果如下:
    notion image

    string_ids

    是由很多个string_id数据组成,其个数由header里的stringIdsSize决定(下面数据体的个数/长度也是看header)
    结构如下:

    type_ids

    descriptorIdx为DexStringID表的索引,对应字符串表示类的类型

    proto_ids

    DexTypeList

    field_ids

    method_ids

    class_defs

    整体结构如下:
    我们将ClassDef结构划分为4部分解析: BasicInfoAnnotationsClassDataStaticValues

    BasicInfo

    从classIdx到sourceFileIx属于BasicInfo

    DexAnnotationsDirectoryItem

    annotationsOff指向该结构,用于指向类的所有注解,定义如下:
    类注解 DexAnnotationSetItem
    域注解 DexFieldAnnotationsItem
    方法注解 DexMethodAnnotationsItem
    参数注解 DexParameterAnnotationsItem

    DexClassData

    staticValuesOff

    指向DexEncodeArray结构的偏移,记录了类中的静态数据,没有则为0
    DexEncodeArray
    定义如下:(作用先未知)

    dex_map_list

    Dalvik虚拟机解析dex文件后,映射为DexMapList的数据结构, 该结构由DexHeader.mapOff指明位置
    classLoader机制APP启动流程
    Loading...
    Sh4d0w
    Sh4d0w
    漫长学习路ing
    最新发布
    360加固复现学习
    2025-6-15
    java反射机制
    2025-6-14
    classLoader机制
    2025-6-14
    dex文件结构
    2025-6-14
    APP启动流程
    2025-6-14
    JNI学习
    2025-6-14
    公告
    Welcome to Sh4dw’s blog!
    敬请指导,Q 467194403