ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上)

ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上)

既然是要探险,咱们就保持一定的深度,起码将来可以做个基于ART的黑客之类的。
所以我们针对细节多下一些工夫,先仔细分析一下OAT文件的格式。
ART的本质上是一个编译器,所以我们需要对编译、链接的主要环节都有一个比较深入的了解。想要绕过编译原理去学好ART,是不太现实的一件事情,我们选择可以让这个过程有趣和好玩。

闲扯不多说了,言归正传。

可执行文件

OAT是一种可执行文件,所以封装在一个ELF格式的可执行文件中。
可执行文件,我们可以借大家熟悉的Windows操作系统理解,就是Windows中的exe文件和dll文件。

  • Windows下的exe,dll文件的格式是PE(Portable Executable)
  • Linux/Android下的可执行格式是ELF(Executable Linkable Format)
  • Mac/iPhone下的可执行文件的格式是Mach-O(Mach Object)
os_exe_gv
os_exe_gv

PE和ELF都是COFF格式(Common file format)的变种。


coff_gv
coff_gv

ELF文件的分类

ELF文件可以分为以下4种:

  • 可重定位文件:Relocatable File,就像Windows下的.obj文件和Linux下的.o文件一样的目标文件,需要链接才可以执行。
  • 真正的可执行文件:Executable File,如Windows的exe一样,是可以直接运行的程序。
  • 共享目标文件:Shared Object File,像Windows的dll和Linux下的so一些,动态链接库。
  • 核心转储文件:Core dump,用于意外时的地址空间的转储。

这个分类信息,在ELF文件头里面有描述,我们后面会讲到。


elf_subclass_gv
elf_subclass_gv

ELF文件头

我们把ELF文件头分成两部分来分析,我们先来看前半部分:

elf_struct1_gv
elf_struct1_gv

Magic Number

所谓的Magic Number,其实就是文件的一个标记。
ELF的Magic Number一共占4个字节,首字节为0x7f,后面分别为'E','L','F'.
只支持大写,必须是0x7f,0x45,0x4c,0x46

我们以Go语言为例,写一段解析Magic Number的代码来作为示例吧:

    buf, err := ioutil.ReadFile(elfFile.elfFileName)
    if err != nil {
        fmt.Println("Error reading ELF:", err)
    }

    magic := [...]byte{0x7f, 'E', 'L', 'F'}
    magic2 := buf[:4]
    if (magic[0] == magic2[0]) && (magic[1] == magic2[1]) && (magic[2] == magic2[2]) && (magic[3] == magic2[3]) {
        fmt.Println("It is an ELF")
    } else {
        fmt.Println("It is not an ELF")
        return
    }

位宽

  • 1-代表32位
  • 2-代表64位

大端还是小端

这个是在多字节的情况下,是高位在前还是低位在前。

  • 1-Little Endian,小端
  • 2-Big Endian,大端

操作系统

操作系统
0x00 System V
0x03 Linux
0x06 Solaris
0x09 FreeBSD

在Android上肯定是0x03了。

ELF子类型

这个就是我们上面画图的那4大类型

ELF子类型
0x01 可重定位文件
0x02 可执行文件
0x03 动态链接库
0x04 core dump

芯片架构

芯片架构
0x00 未知
0x03 x86
0x08 MIPS
0x28 ARM
0x3e x86_64
0xb7 AArch64

ELF头分析示例

ELF文件头的结构(第一部分)

偏移量 长度 描述 备注
0x00 4 Magic Number
0x04 1 位数 32位还是64位
0x05 1 大端还是小端
0x06 1 版本号 1
0x07 1 操作系统
0x08 8 暂时未用到
0x10 2 ELF文件的子类型
0x12 2 芯片架构
0x14 4 又一个版本号 设成1

我们下面解析一个实际的OAT文件看看

下面是我从一个64位arm的OAT文件截取的一部分,我们来分析一下:

7F 45 4C 46  02 01 01 03  00 00 00 00  00 00 00 00  
03 00 B7 00  01 00 00 00  00 00 00 00  00 00 00 00  
40 00 00 00  00 00 00 00  E0 3A AA 00  00 00 00 00  
00 00 00 00  40 00 38 00  07 00 40 00  12 00 11 00  
06 00 00 00  04 00 00 00  40 00 00 00  00 00 00 00  
40 00 00 00  00 00 00 00
  • 7F 45 4C 46: Magic Number,就不多说了
  • 02:64位
  • 01:Little Endian,小端
  • 01:版本号1
  • 03:Linux
  • 8个0:没用到
  • 03 00:动态链接库。注意了,我们的OAT文件是so!
  • B7 00: AArch64,arm64-v8a在AArch64状态下
  • 01 00 00 00: 版本号1

一些参考资料

  1. 一种ELF参考规范的文档:
    http://www.cs.princeton.edu/courses/archive/fall05/cos318/docs/ELF_Format.pdf

  2. ELF格式的wiki
    https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容