什么是dex文件

他是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。

由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别

当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,实验表明,dex文件是传统jar文件大小的50%左右

可以看见:

dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余

dex文件结构

首先从宏观上来说dex的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。如下图:

数据名称

解释

header

dex文件头部,记录整个dex文件的相关属性

string_ids

字符串数据索引,记录了每个字符串在数据区的偏移量

type_ids

类似数据索引,记录了每个类型的字符串索引

proto_ids

原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表

field_ids

字段数据索引,记录了所属类,类型以及方法名

method_ids

类方法索引,记录方法所属类名,方法声明以及方法名等信息

class_defs

类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量

data

数据区,保存了各个类的真是数据

link_data

连接数据区

简单记录了dex文件的一些基本信息,以及大致的数据分布。长度固定为0x70,其中每一项信息所占用的内存空间也是固定的,好处是虚拟机在处理dex时不用考虑dex文件的多样性

magic

标识一个有效的dex文件,他的固定值为:64 65 78 0a 30 33 35 00,转换为字符串为dex.035.

在电子取证中也称“文件签名”

checksum

他是整个头部的校验和。它被用来校验头部是否损坏

signature

file_size

记录包括dexHeader在内的整个dex文件大小,用来计算偏移和方便定位某区段(section),他也有诸如唯一的标识dex,因为他是dex文件中计算sha-1区段的一个组成部分

header_size

存放整个DexHeadeer结构体的长度,它也可用来计算下一个区段在文件中的起始位置,目前值为0x70

endian_tag

指定dex运行环境的CPU字节序,存放的是一个固定值,所有dex文件都一样的,值为:78 56 34 12,0x12345678,表示默认采用little-endian字节序

当多个class文件被编译到一个dex文件是,他们会用到link_size和link_off,通常为0

map_off

他指定了dexMapList结构的文件偏移量

string_ids_size

是指string存放区段的大小,用来计算string区段起始位置-相对于dex文件加载基地址的偏移量

加固原理

https://www.processon.com/view/link/5e116920e4b07ae2d0191834

参考:猿人学

加壳后的APK运行流程

先加载壳APk->壳APk读Dex文件末尾的源APK大小->在内存中壳APk解密出源APk->运行源APk

壳APK启动时 在AndroidMenifest.xml里找源APK的Application 执行它的oncreate方法 启动源APK

加固代际划分

没有官方划分,仅仅民间流传

上图

五代划分

一代、二代、三代有成熟的脱壳方案。

四代烧脑

五代直接放弃吧

源自:https://www.52pojie.cn/thread-977325-1-1.html

三代划分

源自:r0ysue

一代:基础防护:整体型

  1. 文件加载:定位解密文件是关键

  2. 内存加载:不落地加载,加载时机和内存起始地址是关键

通用方案:dex打开和优化的流程、及产出odex、dex2oat编译流程中的关键函数、或生成的oat文件二代:中阶防护:函数抽取

  1. 类加载和函数执行前的解密流程

  2. 函数执行过程中的动态加解密

方案;关注被抽取函数的执行流程是关键!核心是定位被抽取函数的真正·恢复时机!

三代:高级防护:(dex)vmp、Dex2C

  1. VMP:定位解释器是关键,找到映射关系即可恢复;

  2. Dex2C:基础是编译原理,进行等价语义转换,几乎无法彻底还原;

方案:关注JNI接口的调用流程,是分析被VMP和Dex2C保护的函数的关键!也就是trace分析!

脱壳原理

在壳APK解密源APK后,源APK被加载前,拦截这个过程中的系统函数 把内存中Dex dump出来

脱壳方法

Q.E.D.

  • reword 您的打赏,就是俺创作的动力