0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android下的DEX文件和SO文件梳理总结

哆啦安全 来源:编码安全 作者:编码安全 2022-11-04 09:32 次阅读

背景

android逆向分析、脱壳破解分析过程中免不了和android的各种文件格式打交道(so、dex、xml、art、oat等等)。

Android下的两个最重要的文件是DEX文件和SO文件,下面重点对这两个文件及关联文件进行下文的梳理总结,以此用于温故知新。

DEX文件

DEX它是android虚拟机的可执行字节码文件,我们知道java文件需要经过javac编译成class文件,dx工具会将所有的class文件合并处理最终生成dex文件。

dex文件分为四大部分: DEX文件头,索引结构区,data数据区,静态链接数据区。

在dex文件中所有的代码和数据都放在data数据区中,索引结构区中存放的是data中各种数据的对应的偏移和索引。

ee0a68e4-5bd3-11ed-a3b6-dac502259ad0.png

ODEX文件

ODEX它的英文全称为Optimized DEX;即优化过的DEX。

在android5.0之前,Android采用的是JIT(just-in-time)即时编译,也就是程序边执行边编译。为了增加程序执行的效率,android在APK第一次安装的时候将程序的dex文件进行优化生成odex文件,并将其放在了/data/dalvik-cache目录下,等待下次apk运行时直接加载这个目录中经过优化的odex文件(优化基于当前系统的dalvik虚拟机版本,不同版本上的odex文件无法进行兼容),避免重复验证提高执行效率,加快APK的响应时间。

OAT文件

在android5.0之后,android使用的是AOT(Ahead-of-time)事前编译,也就是程序在运行前先编译。oat是ART虚拟机运行的文件,是ELF格式二进制文件,包含DEX和编译的本地机器指令,oat文件包含DEX文件,因此比ODEX文件占用空间更大。

程序在首次安装的时候,dex2oat默认会把classes.dex翻译成本地机器指令,生成ELF格式的OAT文件,并将其放在了/data/dalvik-cache或者是/data/app/packagename/目录下。ART加载OAT文件后不需要经过处理就可以直接运行,它在编译时就从字节码装换成机器码了,因此运行速度更快。

在android5.0之后oat文件的后缀还是odex,但是已经不是android5.0之前的文件格式,而是ELF格式封装的本地机器码,可以认为oat在dex上加了一层壳,可以从oat里提取出dex。

ee2fa0a0-5bd3-11ed-a3b6-dac502259ad0.png

(elf格式的oat)

因为此时的oat文件是一个标准的elf文件,识别其实其是不是oat文件的标准就是看其符号表。

ee6d2362-5bd3-11ed-a3b6-dac502259ad0.png

oatdata指向的是ELF文件的.rodata节区,存放了OAT文件头OATHeader,OAT的DEX文件头,原始DEX文件的DexFile等信息

oatexec指向的是ELF文件的.text节区,这里存放的是编译生成的指定平台的二进制代码。

oatlastword指向的是对应oat文件的结尾。

OAT文件大小差不多= dex文件+art文件

eeb91f1a-5bd3-11ed-a3b6-dac502259ad0.png

vdex文件

android8.0(Android O)之前dex文件嵌入到oat文件本身中,在Android 8.0之后dex2oat将classes.dex优化生成两个文件oat文件(.odex)和vdex文件(.vdex),其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据。

odex文件中包含了本机代码的OAT

vdex文件包含了原始的DEX文件副本

eed35e66-5bd3-11ed-a3b6-dac502259ad0.png

ART文件

ART虚拟机在执行dex文件时,需要将dex文件中使用的类,字符串等信息转换为自定义的结构。art文件就是保存APK中使用的一些类,字符串等信息的ART内部表示,可以加快APK程序启动的速度。

ELF文件

ELF文件格式提供了两种不同的视,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器(Loader)看来它是由Program Header Table描述的一系列Segment的集合。

ELF它是 Executable and Linking Format 的缩写,它是android平台上通用的二进制文件格式。在 Android 的 NDK 开发中,几乎都是和 ELF 打交道。

比如:

1、c / c++ 文件编译得到的 .o(或者 .obj)文件就是 ELF 格式的文件;

2、动态库(.so)文件、可执行文件也是 ELF 文件;

3、动态库的字符串擦除、动态库加壳、动态库修复等都离不开 ELF;

ELF文件名称中的Executable和 Linking表明 ELF 有两种重要的特性。

1、Executable表示可执行的。ELF 文件将参与程序的执行(Execution)过程。包括二进制程序的运行以及动态库 .so 文件的加载。

2、Linking表示可连接的。ELF 文件参与编译链接过程。

eef87890-5bd3-11ed-a3b6-dac502259ad0.png

ef54be16-5bd3-11ed-a3b6-dac502259ad0.png

ef8e158a-5bd3-11ed-a3b6-dac502259ad0.png

文件加载

Android中Java层通过System.load或System.loadLibrary来加载一个so文件,它的定义在Android源码中的路径

为/libcore/luni/src/main/java/java/lang/System.java,执行流程如下:

加载so的两种方式

1、System.loadLibrary(path),只能加载jniLIbs目录下的so文件,这个的执行流程

1.1、先读取so文件的.init_array段

1.2、执行JNI_OnLoad函数

1.3、JNI_ONLoad是.so文件的初始函数

1.4、最后调用具体的native方法

2、System.load(path),可以加载任意路径下的so

这两种方式最终都会调用Android底层的dlopen来打开so

efd981b4-5bd3-11ed-a3b6-dac502259ad0.png

dlopen用来打开一个动态链接库,并将其装入内存。它的定义在Android源码中的路径为/bionic/linker/dlfcn.cpp,执行流程如下:

f02a25ec-5bd3-11ed-a3b6-dac502259ad0.png

So文件的入口为init_array、init_func这些初始化函数。这部分在dlopen的过程中就会执行,再之后的是JNI_Onload方法的调用。这里面可以注册一些本地方法,也可以继续做些变量的初始化等操作。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android系统
    +关注

    关注

    0

    文章

    56

    浏览量

    13492
  • 虚拟机
    +关注

    关注

    1

    文章

    914

    浏览量

    28161
  • ELF文件
    +关注

    关注

    0

    文章

    14

    浏览量

    7134

原文标题:Android逆向基础(DEX/ELF文件格式)

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Android文件格式详解

    dexandroid虚拟机的可执行字节码文件,java文件经过javac编译成class文件,class
    的头像 发表于 01-02 10:21 2359次阅读
    <b class='flag-5'>Android</b><b class='flag-5'>文件</b>格式详解

    #硬声创作季 #智能手机 #Android -2.7.1AndroidManifest.xml项目配置文件-视

    Android文件
    学习电子知识
    发布于 :2022年11月15日 22:21:13

    #硬声创作季 #智能手机 #Android ]--3.4编写主界面布局文件(视频)

    Android文件
    学习电子知识
    发布于 :2022年11月15日 22:22:54

    #硬声创作季 #智能手机 #Android 5编写选择计算类型页面布局文件(视频)

    Android文件
    学习电子知识
    发布于 :2022年11月15日 22:23:19

    [4.7.3]--4.8.3编写主界面布局文件(#硬声创作季 #智能手机 #Android

    Android文件
    学习电子知识
    发布于 :2022年11月15日 22:37:18

    DEX加密效果分析

    dex加密目的:保护安卓应用的Java源代码,避免被恶意分析,威廉希尔官方网站 被窃取准备工具:1、apktool :反编译apk,提取smali代码2、dex2jar :将dex转化为jar文件3
    发表于 12-12 16:56

    App加固威廉希尔官方网站 解析:DEX文件格式的详解

    基于Android平台的虚机应用很难绕过的一种文件格式,重要性不言而喻。  在顶象威廉希尔官方网站 的 Android 加固解决方案中,有着DEX壳保护、指令虚拟化(将
    发表于 09-28 11:21

    Android系统WMA文件播放功能的设计与实现

    基于Android多媒体系统的Stagefright框架,通过创建WMA的文件解析单元和解码单元,使WMA音频文件中的编码数据被正确地解码成原始数据并输出。通过在Android平台测试
    发表于 11-04 11:33 42次下载

    深入理解Android之资源文件

    深入理解Android之资源文件
    发表于 01-22 21:11 22次下载

    Android系统文件夹结构解析

    Android系统文件夹结构解析
    发表于 03-19 11:23 0次下载

    Android 仿ES界面文件浏览器源码

    Android 仿ES界面文件浏览器源码
    发表于 03-19 11:23 1次下载

    干货:总结Java中创建文件的五种最佳实践方法(附源码)

    在java中有很多的方法可以创建文件文件,你是否真的认真的总结过?下面笔者就帮大家总结java中创建
    的头像 发表于 08-28 11:29 6884次阅读
    干货:<b class='flag-5'>总结</b>Java中创建<b class='flag-5'>文件</b>的五种最佳实践方法(附源码)

    常用的BIN文件操作总结

    BIN文件,即二进制文件,广泛应用于嵌入式,我们常用的Firmware通常会以BIN文件或者HEX文件格式存储,因此,对BIN文件的读写操作
    的头像 发表于 02-28 14:34 5w次阅读
    常用的BIN<b class='flag-5'>文件</b>操作<b class='flag-5'>总结</b>

    动态分析so文件中的JNI函数

    APP逆向过程中,需要对dex文件和elf文件进行分析,又因现在各APP都有各种代码保护手法,因此都需要进行动态分析。
    的头像 发表于 04-10 11:18 2586次阅读

    Android.mk判断语句简介

    Android.mk 是Android 提供的一种makefile 文件,注意用来编译生成(exe,so,a,jar,apk)等文件
    的头像 发表于 04-15 09:29 1627次阅读