elf文件格式

android是建立在linux的基础上,其底层代码是安装linux可执行文件——elf的格式来组装的。本文结合android中的so文件来了解elf格式,资料大多收集于网上;elf格式位于android源码:elf.h。

elf大致可分为三部分:elf头、程序头表、节区头表;当然还有上图没标出的动态符号表,

elf头:

#define EI_NIDENT       16
 typedef struct {
      unsigned char       e_ident[EI_NIDENT];    //magic
      Elf32_Half          e_type;          //type 1:重定位文件;2:可执行文件;3:共享文件
      Elf32_Half          e_machine;        //cpu结构
      Elf32_Word          e_version;        //版本
      Elf32_Addr          e_entry;          //程序进入点 可执行:main;so:无用
      Elf32_Off           e_phoff;        //程序头表偏移
      Elf32_Off           e_shoff;        //节区表偏移
      Elf32_Word          e_flags;        //文件和处理器相关的标志
      Elf32_Half          e_ehsize;        //elf头大小
      Elf32_Half          e_phentsize;      //程序头占用空间即大小
      Elf32_Half          e_phnum;        //程序头项目数
      Elf32_Half          e_shentsize;    //节区头占用空间即大小
      Elf32_Half          e_shnum;        //节区数
      Elf32_Half          e_shstrndx;      //字符串表,在节区中索引
  } Elf32_Ehdr;

  我们会发现 e_ehsize = e_phoff(为什么?看第一幅图)。在elf头中我们很容易发现其实主要分三部分:info相关,程序头相关,节区头相关;刚好对应着链接器和装载器所需内容。e_phoff、e_phentsize、e_phnum装载器必须;e_shoff、e_shentsize、e_shnum、e_shstrndx是链接器必须。

phdr头:

typedef struct elf32_phdr{
Elf32_Word p_type;         //segment类型
Elf32_Off p_offset;        //该segment的偏移地址
Elf32_Addr p_vaddr;        //segment映射到内存中的地址
Elf32_Addr p_paddr;        //该地址不会用到
Elf32_Word p_filesz;      //segment大小
Elf32_Word p_memsz;        //segment在内存中所占的地址空间大小
Elf32_Word p_flags;        //segment可操作的读写权限
Elf32_Word p_align;        //按几个字节对齐
} Elf32_Phdr;

  重点是p_offset和p_filesz,它们是segment的起始地址和大小;p_type为segment类型详见elf.h中的PT开头的宏定义;p_flags为segment的可操作权限详见elf.h中的PF开头宏定义(跟linux的文件权限rwx是一样的)。

 shdr头:

typedef struct {
Elf32_Word sh_name;        //section name:.data、.dynamic、.got、.init......
Elf32_Word sh_type;        //section类型
Elf32_Word sh_flags;    //section权限
Elf32_Addr sh_addr;        //section映射到内存中起始地址
Elf32_Off sh_offset;    //该section在文件中的偏移
Elf32_Word sh_size;        //section大小
Elf32_Word sh_link;        //一般来说是该section所用的string table在section header table中的索引,见参考资料3
Elf32_Word sh_info;        //
Elf32_Word sh_addralign;//section按几字节对齐
Elf32_Word sh_entsize;    //section内容中表项所占大小,例如.dynamic为8下面解释
} Elf32_Shdr;

动态符号表(dynamic_symbol_table):

  

介绍完elf格式的整体框架后,来深入了解其中的联系和一些section。

 .dynamic:该section包含了动态链接信息,该section属性将包含SHF_ALLOC比特位,而SHF_WRITE比特位是否为1取决于处理器;简单来说它包含着一连串的dynamic结构

typedef struct dynamic{
Elf32_Sword d_tag;
union{
    Elf32_Sword d_val;
    Elf32_Addr d_ptr;
    } d_un;
} Elf32_Dyn;

  d_tag控制d_un是d_val还是d_ptr;可通过d_tag来识别是属于哪个section(elf.h中DT开头的宏定义),d_un为d_tag在文件中的偏移量(不完全正确!,以后再补充)。例如d_tag为6则是DT_SYMTAB为.dynsym,则d_un为.dynsym为偏移量。值得一提的是在该section中,sh_addralign为4,sh_entsize为8(为什么看dynamic结构体)。

一些tips:

  1 字符串符号表.shstrtab后跟着section_header_table;节区表头分布在elf文件最后,而字符串符号表往往是在最靠后的内容。

  2

资料:

 1 【原创】简单粗暴的so加解密实现

【原创】手工打造ELF文件

ELF文件格式解析 (嵌入式很多用这个格式)

时间: 2024-10-19 01:57:50

elf文件格式的相关文章

Android逆向之旅---SO(ELF)文件格式详解

第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的.但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解.所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容.今天我们先来介绍一下elf文件的

[Debug]linux elf文件格式

linux elf文件格式 浅谈Linux的可执行文件格式ELF Linux中ELF格式文件介绍

Linux及安全实践四——ELF文件格式分析

Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程序为例 1. ELF文件头 使用工具查看ELF文件头:readelf -h obj 在/usr/include/elf.h中可以找到文件头结构定义: 大小总共为64字节,换算成十六进制为0x40.在十六进制代码中找到前0x40字节,即为文件头信息部分(阅

ELF文件格式解析

1. ELF文件简介 首先,你需要知道的是所谓对象文件(Object files)有三个种类: 可重定位的对象文件(Relocatable file) 这是由汇编器汇编生成的 .o 文件.后面的链接器(link editor)拿一个或一些 Relocatable object files 作为输入,经链接处理后,生成一个可执行的对象文件 (Executable file) 或者一个可被共享的对象文件(Shared object file).我们可以使用 ar 工具将众多的 .o Relocata

C语言的ELF文件格式学习

最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西. ELF,是一种文件格式.暂时,只看可执行文件的ELF文件格式. 首先,给出文件的格式的布局图: 光看这个很难理解,所以写一个小的程序,用readelf来结合的看. 程序比较简单: #include <stdio.h> #include <stdlib.h> int data[100] ={0}; int bss[100]; int main() { int i=0; for(i=0; i<100; i++

elf文件格式和运行时内存布局

elf的类型: Linux下的可执行文件格式叫做elf,全称是Executable Linkable Format.其实不仅仅是可执行文件,linux中常见的目标文件有目标文件.o.可执行文件如/bin/bash.共享目标文件(.so).和核心转储文件core dump.可以使用file命令确定文件格式. elf的结构: 如其结构如下图所示: ELF file format: +---------------+ | File header | +---------------+ | .text

Android ELF文件格式

最近一直在学习elf相关资料,有一点总结,这里记录下来,也方便以后查阅. ELF是类Unix类系统,当然也包括Android系统上的可执行文件格式(也包括.so和.o类文件).可以理解为Android系统上的exe或者dll文件格式.理解ELF文件规范,是理解Android系统上进程加载.执行的前提. 网上关于ELF的介绍已经非常多,最好的手册还是直接看ELF官方的手册. 下面以一张非虫先生总结好的图片讲解,更加清晰:

Linux ELF 文件格式

ELF 文件类型 ELF (Executable Linkable Format) 是 linux 下的可执行文件格式,与 windows 下的 PE (Portable Executable) 格式一样,都是 COFF (Common File Format)文件格式的变种.在 linux 下除了可执行文件,编译过程中产生的目标文件(.o 文件),动态链接文件(.so 文件),静态链接库文件(.a 文件) ,核心转储文件(Core Dump File)都按照 ELF 格式存储.查看 ELF 文

ELF文件格式分析

一般的 ELF 文件包括三个索引表:ELF  header,Program  header  table,Section header table. 1)ELF  header:在文件的开始,保存了路线图,描述了该文件的组织情况. 2)Program  header  table:告诉系统如何创建进程映像.用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表. 3)Section  header  table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节