type
status
date
slug
summary
tags
category
icon
password
0、准备工作
要了解dex肯定要生成dex文件
- 先写一段java代码(Test.java)
- 用javac编译为class文件
javac Test.java
- 用d8(SDK28以上叫d8,以下叫dx)生成dex文件
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


dex文件结构比pe文件简单,主要包含以上数据体
数据名称 | 解释 |
Header | dex头部文件,记录dex文件属性 |
String_ids | 字符串数据索引,记录每个字符串在数据区的偏移量 |
Type_ids | 类似数据索引,记录了每个类型的字符串索引 |
Proto_ids | 原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表 |
Field_ids | 字段数据索引,记录方法所属类,类型以及方法名 |
Method_ids | 类方法索引,记录方法所属类名,方法声明以及方法名等信息 |
Class_defs | 类定义数据索引,记录制定类各类信息,包括接口、超类、类数据偏移量 |
Data | 数据区,记录了各个类的真实数据 |
Link_data | 链接数据区 |
header
我们可以在010editor里查看文件结构

这里已经比较直观了,也可以写个脚本直接查询
效果如下:

string_ids
是由很多个string_id数据组成,其个数由header里的stringIdsSize决定(下面数据体的个数/长度也是看header)
结构如下:
type_ids
descriptorIdx为DexStringID表的索引,对应字符串表示类的类型
proto_ids
DexTypeList
field_ids
method_ids
class_defs
整体结构如下:
我们将ClassDef结构划分为4部分解析:
BasicInfo
Annotations
ClassData
StaticValues
BasicInfo
从classIdx到sourceFileIx属于BasicInfo
DexAnnotationsDirectoryItem
annotationsOff指向该结构,用于指向类的所有注解,定义如下:
类注解 DexAnnotationSetItem
域注解 DexFieldAnnotationsItem
方法注解 DexMethodAnnotationsItem
参数注解 DexParameterAnnotationsItem
DexClassData
staticValuesOff
指向DexEncodeArray结构的偏移,记录了类中的静态数据,没有则为0
DexEncodeArray
定义如下:(作用先未知)
dex_map_list
Dalvik虚拟机解析dex文件后,映射为DexMapList的数据结构, 该结构由DexHeader.mapOff指明位置
- 作者:Sh4d0w
- 链接:https://sh4d0w.blog//article/20150fad-5ffd-807e-a09c-c1180a37077a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。