OAT
- OAT 文件是在 Android 4.4 中引入的。OAT 是优化过的、用于 ART 虚拟机执行的 DEX 文件,类似 Dalvik 的 ODEX
- 对新版本的 Android 程序进行安全研究,无论是对 OAT 文件的 Hook 还是加密保护,都要了解 OAT 文件格式
ART 虚拟机
- ART 使用 AOT(Ahead-of-Time)编译技术,在 APK 第一次安装或系统升级、重启时,通过调用 dex2oat 命令将 APK 中的 DEX 文件静态编译成 OAT 并存放到 Android 设备的 /data/dalvik-cache 或 /data/app/package 目录。dex2oat 与 dexopt 不同,dex2oat 更像一个编译器,将 DEX 中的 Dalvik 字节码编译成 Native 机器码。经过这样的操作,以后启动程序时,ART 就会提高 APK 的启动速度,从而执行生成的 OAT 文件而不是 APK 中的 DEX 文件。从 Android 5.0 开始,系统默认将 ART 作为虚拟机,程序运行速度明显变快。但有个缺点,即 OAT 的静态编译操作会影响 APK 的安装效率,导致 Android 4.4 后 APK 安装速度更长。为了使运行和安装速度都更快,Android 7.0 增加了 JIT(just-in-Time)编译。新版本的 Android 使用的是基于 JIT on AOT 的编译技术
生成 OAT 文件
- 系统在安装 APK 时,会调用 dex2oat 自动生成 OAT 文件。也可手动执行 dex2oat 命令,为指定的 DEX 生成 OAT 文件
- 具体操作:在执行 dex2oat 命令时使用 --dex-file 参数指定传入的 DEX 路径(若有多个 DEX,可多次指定该参数),然后为 --oat-file 参数指定 OAT 的输出路径(在指定传入的路径时,该路径要对当前的 adb shell 用户有可写权限)
- 以 crackme0201.apk 为例,执行如下命令可生成 crackme0201.oat:
OAT 文件格式
-
和 ODEX 一样,OAT 也有自己的格式。Android 原生程序以 ELF 格式作为程序格式基础,并在此基础上增加了属于 Android 的应用程序二进制接口(Application Binary Interface, ABI)
-
a