Android 利用的源代码次要分为 java 与 C /C++ 两局部,其中 java 编译后的文件是 DEX 文件,也是 Android Dalvik 虚拟机运行的程序,因而也是基于 Android 平台的虚机利用很难绕过的一种文件格式,重要性显而易见。
在顶象技术的 Android 加固解决方案中,有着 DEX 壳爱护、指令虚拟化(将 DEX 文件运行在自实现的虚拟机环境下)等技术。要想理解顶象技术的 Android 加固解决方案如何帮忙 Android 利用反抗逆向和破解,首先须要理解 DEX 文件到底是什么样的。
文件构造展现
DEX 文件格式
DEX 文件在 010 中的体现
文件构造详解
构造体定义
文件头(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 构造如下
DexTypeList 构造如下。
字段标识符列表 (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 构造,请持续关注。