ELF文件格式解析

更新时间:2023-07-22 20:07:32 阅读: 评论:0

ELF ⽂件格式解析
1. ELF ⽂件简介
⾸先,你需要知道的是所谓对象⽂件(Object files)有三个种类:
1. 可重定位的对象⽂件(Relocatable file)
这是由汇编器汇编⽣成的 .o ⽂件。后⾯的链接器(link editor)拿⼀个或⼀些 Relocatable object files 作为输⼊,经链接处理后,⽣成⼀个可执⾏的对象⽂件 (Executable file) 或者⼀个可被共享的对象⽂件(Shared object file)。我们可以使⽤ ar ⼯具将众多的 .o Relocatable object files 归档(archive)成 .a 静态库⽂件。如何产⽣ Relocatable file,你应该很熟悉了,请参见我们相关的基本概念⽂章和JulWiki。另外,可以预先告诉⼤家的是我们的内核可加载模块 .ko ⽂件也是 Relocatable object file。
2. 可执⾏的对象⽂件(Executable file)
这我们见的多了。⽂本编辑器vi、调式⽤的⼯具gdb、播放mp3歌曲的软件mplayer等等都是Executable object file。你应该已经知道,在我们的 Linux 系统⾥⾯,存在两种可执⾏的东西。除了这⾥说的 Executable object file,另外⼀种就是可执⾏的脚本(如shell 脚本)。注意这些脚本不是 Executable object file,它们只是⽂本⽂件,但是执⾏这些脚本所⽤的解释器就是 Executable object file,⽐如 bash
shell 程序。
3. 可被共享的对象⽂件(Shared object file)
这些就是所谓的动态库⽂件,也即 .so ⽂件。如果拿前⾯的静态库来⽣成可执⾏程序,那每个⽣成的可执⾏程序中都会有⼀份库代码的拷贝。如果在磁盘中存储这些可执⾏程序,那就会占⽤额外的磁盘空 间;另外如果拿它们放到Linux系统上⼀起运⾏,也会浪费掉宝贵的物理内存。如果将静态库换成动态库,那么这些问题都不会出现。动态库在发挥作⽤的过程 中,必须经过两个步骤:a) 链接编辑器(link editor)拿它和其他Relocatable object file以及其他shared object file作为输⼊,经链接处理后,⽣存另外的shared object file 或者 executable file。
上海韦博英语价格是多少b)在运⾏时,动态链接器(dynamic linker)拿它和⼀个Executable file以及另外⼀些 Shared object file 来⼀起处理,在Linux系统⾥⾯创建⼀个进程映像。
这⾥我们主要是以Shared Object File(.so)为重点分析对象,因为我们在逆向APK中会遇到的绝⼤部分都是此类⽂件。
2. ELF ⽂件格式
⾸先,ELF⽂件格式提供了两种视图,分别是链接视图和执⾏视图。
链接视图是以节(ction)为单位,执⾏视图是以段(gment)为单位。链接视图就是在链接时⽤到的视图,⽽执⾏视图则是在执⾏时⽤到的视图。上图左侧的视⾓是从链接来看的,右侧的视⾓是执⾏来看的。总个⽂件可以分为四个部分:- ELF header : 描述整个⽂件的组织。- Program Header Table: 描述⽂件中的各种gments ,⽤来告诉系统如何创建进程映像的。- ctions 或者 gments :gments 是从运⾏的⾓度来描述elf ⽂件,ctions 是从链接的⾓度来描述elf ⽂件,也就是说,在链接阶段,我们可以忽略program
史家小学通州分校- Section Header Table: 包含了⽂件各个gction 的属性信息,我们都将结合例⼦来解释。1
2
3
4
程序头部表(Program Header Table),如果存在的话,告诉系统如何创建进程映像。 节区头部表(Section Header Table)包含了描述⽂件节区的信息,⽐如⼤⼩、偏移等。
如下图,可以通过执⾏命令”readelf -S android_rver”来查看该可执⾏⽂件中有哪些ction。
通过执⾏命令readelf –gments android_rver,可以查看该⽂件的执⾏视图。
scenes这验证了第⼀张图中所述,gment是ction的⼀个集合,ctions按照⼀定规则映射到gment。那么为什么需要区分两种不同视图?
当ELF⽂件被加载到内存中后,系统会将多个具有相同权限(flg值)ction合并⼀个gment。操作系统往往以页为基本单位来管理内存分配,⼀般页的⼤⼩为4096B,即4KB的⼤⼩。同时,内存的权限管理的粒度也是以页为单位,页内的内存是具有同样的权限等属性,并且操作系统对内存的管理往往追求⾼效和⾼利⽤率这样的⽬标。ELF⽂件在被映射时,是以系统的页长度为单位的,那么每个ction在映射时的长度都是系统页长度的整数倍,如果ction的长度不是其整数倍,则导致多余部分也将占⽤⼀个页。⽽我们从上⾯的例⼦中知道,⼀个ELF⽂件具有很多的ction,那么会导致内存浪费严重。这样可以减少页⾯内部的碎⽚,节省了空间,显著提⾼内存利⽤率。
3. ELF Header
⾸先,我们先来看下32位ELF⽂件中常⽤的数据格式:
麦茜 威廉姆斯
然后我们来观察⼀下ELF Header的结构体:
接着运⾏readelf -h android_rver命令,可以看到ELF Header结构的内容。#define EI_NIDENT 16typedef  struct  {      unsigned  char  e_ident[EI_NIDENT];      ELF32_Half e_type;      ELF32_Half
e_machine;      ELF32_Word e_version;      ELF32__Addr e_entry;      ELF32_Off e_phoff;      ELF32_Off e_shoff;      ELF32_Word e_flags;      ELF32_Half e_ehsize;      ELF32_Half e_phentsize;      ELF32_Half e_phnum;      ELF32_Half e_shentsize;      ELF32_Half e_shnum;      ELF32_Half e_shstrndx;}Elf32_Ehdr;
1
mbps2
3
4
babinski5人造纤维
6
7停机英文
fifa是什么意思8
9
10新梁祝外传
11
12
13
14
15
16
17
或者使⽤010Editor的ELF模板也可以看到ELF Header结构。对⽐以下三类ELF⽂件,我们得到了以下结论: (1)e_type标识了⽂件类型
(2)Relocatable File(.o⽂件)不需要执⾏,因此e_entry字段为0,且没有Program Header Table等执⾏视图 (3)不同类型的ELF⽂件的Section也有较⼤区别,⽐如只有Relocatable File有.strtab节。
Shared Object File(.so⽂件)
Executable File(可执⾏⽂件android_rver)

本文发布于:2023-07-22 20:07:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/185534.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:链接   内存   系统   视图
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图