ELF文件结构分析详解 您所在的位置:网站首页 程序中的魔数 ELF文件结构分析详解

ELF文件结构分析详解

2024-06-26 21:55| 来源: 网络整理| 查看: 265

使用 readelf –h 命令查看 ELF 文件,可以看到原始的 ELF 文件头。 ELF 文件头从文件的 0 偏移量开始,是除了文件头之后剩余部分文件的一个映射。文件头主要标记了 ELF 类型、结构和程序开始执行的入口地址,并提供了其他 ELF 头(节头和程序头)的偏移量,稍后会细讲。一旦理解了节头和程序头的含义,就容易理解文件头了。通过查看 Linux 的 ELF(5)手册, 可以了解ELF 头部的结构:

#define EI_NIDENT 16 typedef struct{ unsigned char e_ident[EI_NIDENT]; //Magic,类别,数据,版本,OS/ABI,ABI uint16_t e_type; //类型 uint16_t e_machine; //系统架构 uint32_t e_version; //版本 ElfN_Addr e_entry; //入口点地址 ElfN_Off e_phoff; //start of program headers ElfN_Off e_shoff; //start of section headers uint32_t e_flags; //标志 uint16_t e_ehsize; //文件头的大小 uint16_t e_phentsize; //程序头大小 uint16_t e_phnum; //number of program headers uint16_t e_shentsize; //节头大小 uint16_t e_shnum; //number of program headers uint16_t e_shstrndx; //字符串表段索引 }ElfN_Ehdr;

魔数

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 7f 、45、4c、46分别对应ascii码的Del(删除)、字母E、字母L、字母F。这四个字节被称为ELF文件的魔数,操作系统在加载可执行文件时会确认魔数是否正确,如果不正确则拒绝加载。 第五个字节标识ELF文件是32位(01)还是64位(02)的。 第六个字节标识该ELF文件字节序是小端(01)还是大端(02)的。 第七个字节指示ELF文件的版本号,一般是01。 后九个字节ELF标准未做定义。一般为00.

文件类型:

ET_NONE(0):未知类型。这个标记表明文件类型不确定,或者还未定义 ET_REL(1):重定位文件。ELF 类型标记为 relocatable 意味着该文件被标记为了一段可重定位的代码,有时也称为目标文件。可重定位目标文件通常是还未被链接到可执行程序的一段位置独立的代码 (position independent code)。在编译完代码之后通常可以看到一个.o 格式的文件,这种文件包含了创建可执行文件所需要的代码和数据 ET_EXEC(2):可执行文件。ELF 类型为executable,表明这个文件被标记为可执行文件。这种类型的文件也称为程序,是一个进程开始执行的入口 ET_DYN(3):共享目标文件。ELF 类型为 dynamic,意味着该文件被标记为了一个动态的可链接的目标文件,也称为共享库。这类共享库会在程序运行时被装载并链接到程序的进程镜像中 ET_CORE(4):核心文件。在程序崩溃或者进程传递了一个 SIGSEGV 信 号(分段违规)时,会在核心文件中记录整个进程的镜像信息。可以 使用 GDB 读取这类文件来辅助调试并查找程序崩溃的原因

系统架构:

e_machine成员标识系统架构(机器类型),ELF定义了以下多种系统架构。可在“/usr/include/elf.h”头文件中查看,以下是其中的几种

常量标识 值 系统架构 EM_M32 1 AT&T WE 32100 EM_SPARC 2 SPARC EM_386 3 Intel 80386 EM_68K 4 Motorola m68k family EM_88K 5 Motorola m88k family EM_860 7 Intel 80860

实例( readelf 命令来读取ELF文件头部信息)

ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x80484c0 Start of program headers: 52 (bytes into file) Start of section headers: 6552 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 31 Section header string table index: 28

中文翻译版本

ELF 头: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 类别: ELF32 数据: 2 补码,小端序 (little endian) 版本: 1 (current) OS/ABI: UNIX - System V ABI 版本: 0 类型: EXEC (Executable file) 系统架构: Intel 80386 版本: 0x1 入口点地址: 0x80484c0 程序头起点: 52 (bytes into file) Start of section headers: 6552 (bytes into file) 标志: 0x0 本头的大小: 52 (字节) 程序头大小: 32 (字节) Number of program headers: 9 节头大小: 40 (字节) 节头数量: 31 字符串表索引节头: 28


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有