Android中ELF文件结构浅析(一)

这篇具有很好参考价值的文章主要介绍了Android中ELF文件结构浅析(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ELF文件头(elf_header)

可以用以下这个数据结构体来描述文件头。

struct Elf64_Ehdr {
  unsigned char e_ident[16];
  Elf64_Half e_type;
  Elf64_Half e_machine;
  Elf64_Word e_version;
  Elf64_Addr e_entry;
  Elf64_Off e_phoff;
  Elf64_Off e_shoff;
  Elf64_Word e_flags;
  Elf64_Half e_ehsize;
  Elf64_Half e_phentsize;
  Elf64_Half e_phnum;
  Elf64_Half e_shentsize;
  Elf64_Half e_shnum;
  Elf64_Half e_shstrndx;
};

其中各个成员的意义如下:

1.  e_ident

        从头开始的16个字节含有 ELF 文件的识别标志,并且提供了一些用于解码 和解析文件内容的数据,是不依赖于具体操作系统的。

0000        7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00

1.1 File identification

        是ELF文件开头的4个字节也就是文件标识EI_MAG[0] ~ EI_MAG[3],这4个字节的内容是固定的。

EI_MAG[0] 0x7F
EI_MAG[1] 0x45 E
EI_MAG[2] 0x4C L
EI_MAG[3] 0x46 F

1.2  EI_CLASS

        是上面块中第五个字节,代表的是目标文件的类型

ELFCLASSNONE 0 无效的种类
ELFCLASS32 1 32位对象
ELFCLASS64 2 64位对象

1.3  EL_DATA

        第六个字节代表着文件中数据采用的编码格式

0x1表示采用小端序,0x2为大端序

1.4  EI_VERSION

        第7个字节EI_VERSION指明 ELF 文件头的版本,目前这个版本号是 EV_CURRENT,即“1”

1.5  EI_OSABI

        第8个字节EI_OSABI表示操作系统/ABI标识

Android中ELF文件结构浅析(一),android

1.6  EI_ABIVERSION

      第9个字节 ABI版本。

1.7  EI_PAD

        第10个字节到第15个字节暂时不使用,留作以后扩展,在实际的文件中应被填 0 补充,其它程序在读取 ELF 文件头时应该忽略这些字节。

1.8  EI_NIDENT

        第16个字节是e_ident[]的大小。

2.  e_type

0010        03 00 B7 00 01 00 00 00 20 13 00 00 00 00 00 00

ET_NONE 0 没有文件类型
ET_REL 1 可重定位文件
ET_EXEC 2 可执行文件
ET_DYN 3 动态链接库文件
ET_CORE 4 Core 文件
ET_LOPROC 0xFF00 处理器指定下限
ET_HIPROC 0xFFFF 处理器指定上限

3.  e_machine

        这一项指定了当前文件可以运行的机器架构

0010        03 00 B7 00 01 00 00 00 20 13 00 00 00 00 00 00

enum MachineArchitecture {
  EM_NONE = 0,       // No machine.
  EM_386 = 3,        // Intel 架构.
  EM_ARM = 40,       // ARM 架构.  0x28
  EM_X86_64 = 62,    // Intel x86-64 架构. 0x3E
  EM_AARCH64 = 183,  // ARM 64位 架构.  0xB7
  // 其他值略过
};

4.  e_version

0010        03 00 B7 00 01 00 00 00 20 13 00 00 00 00 00 00

 同上1.4

5.  e_entry

0010        03 00 B7 00 01 00 00 00 20 13 00 00 00 00 00 00

         程序入口点地址Android中ELF文件结构浅析(一),android 

6.  e_phoff

0020        40 00 00 00 00 00 00 00 E0 41 00 00 00 00 00 00

        是指明程序头表(program header table)开始处在文件中的偏移量。如果没有程序头表,该值应设为0。

Android中ELF文件结构浅析(一),android

即0x40也是elf_header的大小。

7.  e_shoff

0020        40 00 00 00 00 00 00 00 E0 41 00 00 00 00 00 00

        是指明节头表(section header table)开始处在文件中的偏移量。如果没有节头表,该值应设为 0。

8.  e_flags

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        这一项给出文件中与特定处理器相关的标志。

#define	EF_MIPS_NOREORDER	0x00000001
#define	EF_MIPS_PIC		0x00000002	/* Contains PIC code */
#define	EF_MIPS_CPIC		0x00000004	/* STD PIC calling sequence */
#define	EF_MIPS_UCODE		0x00000010
#define	EF_MIPS_ABI2		0x00000020	/* N32 */
#define	EF_MIPS_OPTIONS_FIRST	0x00000080
#define	EF_MIPS_ABI		0x0000F000
#define	EF_MIPS_ABI_O32		0x00001000
#define	EF_MIPS_ABI_O64		0x00002000
#define	EF_MIPS_ABI_EABI32	0x00003000
#define	EF_MIPS_ABI_EABI64	0x00004000
#define	EF_MIPS_ARCH_ASE	0x0F000000	/* Architectural extensions */
#define	EF_MIPS_ARCH_ASE_MDMX	0x08000000	/* MDMX multimedia extension */
#define	EF_MIPS_ARCH_ASE_M16	0x04000000	/* MIPS-16 ISA extensions */
#define	EF_MIPS_ARCH		0xF0000000	/* Architecture field */
#define	EF_MIPS_ARCH_1		0x00000000	/* -mips1 code */
#define	EF_MIPS_ARCH_2		0x10000000	/* -mips2 code */
#define	EF_MIPS_ARCH_3		0x20000000	/* -mips3 code */
#define	EF_MIPS_ARCH_4		0x30000000	/* -mips4 code */
#define	EF_MIPS_ARCH_5		0x40000000	/* -mips5 code */
#define	EF_MIPS_ARCH_32		0x50000000	/* -mips32 code */
#define	EF_MIPS_ARCH_64		0x60000000	/* -mips64 code */
#define	EF_MIPS_ARCH_32R2	0x70000000	/* -mips32r2 code */
#define	EF_MIPS_ARCH_64R2	0x80000000	/* -mips64r2 code */

9.  e_ehsize

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        此字段表明 ELF 文件头的大小,以字节为单位。

10.  e_phentsize

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        此字段表明在程序头表(program header table)中每一个表项的大小,以字节为单位,每个表项的大小相同。 

Android中ELF文件结构浅析(一),android

11.  e_phnum 

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        此字段表明程序头表中总共有多少个表项。

        如上图所示

        e_phentsize 乘以 e_phnum 就得到了整个program header table的大小。

12.  e_shentsize

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        此字段表明在节头表(section header table)中每一个表项的大小,一个节头是节头表中的一项;节头表中所有项占据的空间大小相同。

Android中ELF文件结构浅析(一),android

13.  e_shnum

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        此字段表明节头表中总共有多少个表项。 

        如上图所示

        e_shentsize 乘以 e_shnum,就得到了整个section header table的大小。

14.  e_shstrndx

0030        00 00 00 00 40 00 38 00 08 00 40 00 18 00 17 00

        节头表中与节名字表相对应的表项的索引。如果文件没有节名字表,此值应设置为 SHN_UNDEF。

Android中ELF文件结构浅析(一),android

0x17转为十进制是23 文章来源地址https://www.toymoban.com/news/detail-826769.html

到了这里,关于Android中ELF文件结构浅析(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android OkHttp 源码浅析二

    OkHttp 配置参数: dispatcher 用于线程调度 connectionPool 连接池  64 个or 5 host 可以提升复用性 方便管理和提升性能 interceptors  networkInterceptors eventListenerFactory 事件监听器 连接建立 发送head body 等 retryOnConnectionFailure 连接 / 请求 失败是否重置 authenticator 自动认证修正 比如

    2024年02月11日
    浏览(34)
  • Android Looper Handler 机制浅析

    最近想写个播放器demo,里面要用到 Looper Handler,看了很多资料都没能理解透彻,于是决定自己看看相关的源码,并在此记录心得体会,希望能够帮助到有需要的人。 本文会以 猜想 + log验证 的方式来学习 Android Looper Handler,对于一些复杂的代码会进行跳过,能够理解它们的设

    2024年02月11日
    浏览(40)
  • 【Android篇】APK打包流程浅析

    在面试中,大公司会问你.....(吃饭了吗?)咳咳~ APK打包流程全过程? APK签名在实际业务中能处理什么? APK加固原理是如何实现的,怎么保证安全? APK签名V1,V2,V3的区别于原理,有什么漏洞? 这里只讲解APK打包流程全过程。 现在2023年了,一般都是用Android studio来设计andr

    2024年02月02日
    浏览(41)
  • Android 源码浅析:Leakcanary 内存泄漏检测的好帮手

    我们一起来分析一下大名鼎鼎的 Leakcanary, 想必作为 Android 开发都多多少少接触过,新版本的 Leakcanary 也用 Kotlin 重写了一遍,最近详细查看了下源码,分享一下。 tips:本来是只想分析下内存泄漏检测部分,但写着写着就跑偏了,因为内存泄漏的检测难点在于对对象生命周期

    2024年02月02日
    浏览(43)
  • [免费专栏] Android安全之Root检测与Root绕过(浅析)

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球 感谢大家一直以来对我CSDN博客的关注和支持,但

    2024年02月08日
    浏览(50)
  • 【漏洞分析】浅析android手游lua脚本的加密与解密(一)

    主要用到的工具和环境: 1 win7系统一枚 2 quick-cocos2d-x的开发环境(弄一个开发环境方便学习,而且大部分lua手游都是用的cocos2d-x框架,还有一个好处,可以查看源码关键函数中的特征字符串,然后在IDA定位到关键函数,非常方便) 3 IDA6.8(分析so文件+动态调试so) 4 vs2015(编

    2024年04月08日
    浏览(62)
  • ELF文件格式以及重要文件(.o,.elf,.axf,.bin,.hex)说明

    可执行与可链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。 主要可以分为三种类型: (1)可

    2023年04月15日
    浏览(50)
  • ELF 文件格式 ------- 符号表

    ​ 上一篇文章分析节头表中分析到,节头表包含一个名字为 .symbol 的条目,该条目的 sh_entsize 成员不为 0,表明该条目指向的节中的内容是一张表,该表中的每一个条目的大小为 sh_entsize 个字节,通过 sh_size 成员可知道该节的总占用大小,因此就能够得出该节中一共有多少个

    2023年04月22日
    浏览(35)
  • ELF文件格式解析

       ELF(Executable and Linkable Format) 即可执行可链接文件格式,是目前操作系统上最常见的可执行文件格式。不同系统的目标文件不一样,Windows是PE(Portable Executable),linux是ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。       ELF格式的目标文件和可执

    2023年04月16日
    浏览(37)
  • ELF文件格式

    Executable and Linkable Format是Linux操作系统上默认的二进制格式 一个可以执行的文件就是存储了一些 数据和代码 ,我们要明白ELF文件 有哪些部分 ,每一部分 记录了文件的什么信息                                 我偷偷把星星散布于自己个人的天空,在那里创造我的无限

    2023年04月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包