-
-
安卓 dex 学习
-
发表于: 2021-3-1 23:08 3409
-
dex文件分为三大块
dex文件头
- 字段1 dex_magic ,表示dex文件的文件表示,特征字符串
- 字段2 checksum,表示校验和,对文件求32位的hash值(从字段3到文件末尾)
- 字段3 signature[] ,表示SHA1,对文件求hash值(从字段4到文件末尾)
- 字段4 file_size,表示文件大小
字段2和字段3 就是确保dex 完整。改变dex,需更新这两个字段 - 字段5 dex文件头大小
字段6: 数据排列方式-小端方式
1dex 文件
or
pe文件数据格式都是小端方式保存;网络传输都是大端方式传输,使用小端主要原因是为了保存数据类型
各种表的大小以及偏移
- string_ids_size 和string_ids_off,字符串表的大小和偏移
- type_ids_size和 type_ids_off 类型表的大小和偏移
- proto_ids_size 和proto_ids_off 原型表的大小和偏移
- field_ids_size 和field_ids_off,字段表的大小和偏移
- method_ids_size和method_ids_off 方法表的大小和偏移
- class_defs_size 和 class_defs_off 类数据的大小和偏移
各种数据的数组,包括字符串、类型、方法原型、字段、方法
1dex 文件,例如,名称等字符串,用数组的方式保存到一起,使用的时候使用数组的索引。
- 字符串表dex_string_ids
字符串表项,是一个字符串数据的偏移string_data_off,偏移指向的是一个string_data 结构。
string_data 结构中有两个字段:
- 字段1:代表长度,数据类型是uleb128,变长的数据类型(1-5字节)
- 字段2:存储数据,字符串以0结尾
类型表dex_type_ids
类型表表项,是一个索引值,存放的是字符串表数组下标。
类型描述符包括基本数据类型的描述符和类类型的描述符。
LHelloworld;是HelloWorld类的类描述符。原型表 (方法原型)
12原型表项存储的是函数原型的各部分描述信息。包括短类型(shorty_idx)、返回类型(return_type_idx)、参数的类型(parameters_off) 最终还是一个指向字符串表的数组下标
注:字段为返回类型(return_type_idx)的值,是类型表中的索引,无双引号;短类型是字符串,有双引号,是字符串的索引
字段表(类成员)
1字段表项中内容存储的是字段的信息。包括字段所在类(class_idx)、字段的类型(type_idx)、字段的名称(name_idx),class_idx是类型表中的索引,type_idx是类型表中的索引,字段名称的索引是字符串表的数组下标
- 字符串表dex_string_ids
- 方法表(类方法)1
方法表项存储的是方法的信息,包括方法所在的类(class_idx)、方法的原型(proto_idx)、方法的名称(name_idx),其中class_idx是类型表中的索引,proto_idx是原型表的索引,方法名称是字符床表数组的下标
类数据
1类数据也是一个数组,每一个元素就是一个类的相关信息。
- 不重要的信息12
所在的类class_idx,父类superclass_idx,接口 interface_off,访问权限access_flags
类名索引,访问flags,父类索引,接口偏移,源码索引,注解偏移,类数据偏移
数据保存在,class_data
1234567891011121314151617这个结构存放fields字段和method方法
对我们重要的是类方法查找:
class_data
-
>encoded_method method
-
>code_item code
-
>insns_size 指令长度
insns[] 指令
简单分析一些指令转smali代码:需要查dalvik操作码
1
、
6200
0000
-
> sget
-
object
v0,field[
0
]
/
/
字段表索引
0
sget
-
object
v0,out
名称:out
类型:java.io.PrintStream
所在类:java.lang.System
smali: sget
-
object
v0,Ljava
/
lang
/
System;
-
>out:Ljava.io.PrintStream;
2
、
1A01
0000
const
-
string v1,string[
0
]
/
/
字符串表索引
0
const
-
string v1,“Hello world”
3
、
6E53
0600
0421
-
invoke
-
virtual {v4,v0,v1,v2,v3},Test2.method5:(IIII)V;
- 不重要的信息
- 其它1
http:
/
/
androidxref.com 安卓源码下载
赞赏
他的文章
- [原创]CVE-2013-4730 缓冲溢出漏洞研究 6290
- [原创]windows 调试与异常的简单梳理 4632
- 安卓 dex 学习 3410
- [原创]简单分析病毒样本-永恒之蓝WannaCry 6952
看原图
赞赏
雪币:
留言: