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 构造,请持续关注。