App加固技术解析:DEX文件格式的详解

Android应用的源代码主要分为java与C/C++两部分,其中java编译后的文件是DEX文件,也是Android Dalvik虚拟机运行的程序,所以也是基于Android平台的虚机应用很难绕过的一种文件格式,重要性不言而喻。java

在顶象技术的 Android 加固解决方案中,有着DEX 壳保护、指令虚拟化(将DEX文件运行在自实现的虚拟机环境下)等技术。要想了解顶象技术的Android 加固解决方案如何帮助 Android 应用对抗逆向和破解,首先须要了解DEX文件究竟是什么样的。编码

文件结构展现spa

图片描述
图片描述

文件结构详解code

图片描述

结构体定义图片

文件头( dex_header )。字符串

magic[8]:dex版本标识。这类字节必须出如今 .dex 文件的开头,以便系统将其原样识别。该值会特地包含一个换行符("n" 或
0x0a)和空字节("0" 或 0x00),以便协助检测某些形式的损坏问题。该值还能够将格式版本号编码为 3
个十进制数字;随着格式的演变,预计该值会单调递增。 checksum:能够用于文件剩余内容(除 magic 和此字段以外的全部内容)的
adler32 校验和。另外,还能够用于检测文件损坏状况。 signature[kSha1DigestSize]:文件剩余内容(除
magic、checksum 和此字段以外的全部内容)的 SHA-1 签名(哈希);用于对文件进行惟一标识。
file_size:整个文件(包括标头)的大小,以字节为单位。
header_size:标头(整个区段)的大小,以字节为单位。这一项容许至少必定程度的向后/向前兼容性,而没必要让格式失效。
endian_tag:字节序标记。ENDIAN_CONSTANT ,表示小端字节序。 REVERSE_ENDIAN_CONSTANT
表示大端字节序,默认值为 ENDIAN_CONSTANT 。 link_size 与 link_off
:连接区段的大小与文件偏移。若是此文件未进行静态连接,则两个值都为0。 map_off:从文件开头到映射项列表的文件偏移量。
string_ids_size 与 string_ids_off:字符串标识符列表中的字符串数量与文件偏移。 type_ids_size 与
type_ids_off:类型标识符列表中的元素数量及文件偏移。元素数量上限为65535。 proto_ids_size 与
proto_ids_off:原型标识符列表中的元素数量及文件偏移。元素数量上限为65535。 field_ids_size 与
field_ids_off:字段标识符列表中的元素数量及文件偏移。 method_ids_size 与
method_ids_off:方法标识符列表中的元素数量及文件偏移。 class_defs_size 与
class_defs_off:类定义列表中的元素数量及文件偏移。 data_size 与 data_off :data区段的大小及文件偏移。

字符串标识符列表( dex_string_ids )在DEX文件以 DexStringId[] 的形式存在,其结构以下。原型

图片描述

类型标识符列表( dex_type_ids )在DEX文件以 DexTypeId[] 的形式存在,其结构以下。虚拟机

图片描述

方法原型标识符列表( dex_proto_ids )在DEX文件以 DexProtoId[] 的形式存在,其中 DexProtoId 结构以下。string

图片描述

DexTypeList 结构以下。it

图片描述

字段标识符列表( dex_field_ids )在DEX文件以 DexFieldId[] 的形式存在,其中 DexFieldId 结构以下。

图片描述

方法标识符列表( dex_method_ids ) 在DEX文件以 DexMethodId[] 的形式存在,其中 DexMethodId 结构以下。

图片描述

类定义列列表( dex_class_defs )在DEX文件以 DexClassDef[] 的形式存在,其中 DexClassDef 结构以下。

图片描述

映射项列表( dex_map_list ) 在DEX文件以 DexMapItem[] 的形式存在,其中 DexMapItem 结构以下。

图片描述

类型代码表如图所示。

图片描述

因为篇幅限制,小象将在第二篇文章中继续解析DEX文件的DexAnnotationsDirectoryItem 、 DexClassData 与 DexEncodeArray 结构,请继续关注。

相关文章
相关标签/搜索