ELF文件解析

ELF文件解析和加载(附代码) 目录:1. elf文件基本概念2. elf文件结构3. elf文件装载4. 代码实现1.elf文件基本概念elf文件是一种目标文件格式,用于定义不同类型目标文件以什么样的格式,都放了些什么东西。主要 用于linux平台。windows下是PE/COFF格式。 可执行文件、可重定位文件(.o)、共享目标文件(.so)、核心转储文件都是以elf文件格式存... 阅读详情

ELF介绍

Linux下可执行文件的格式是ELF(Executable amd Linkable Format),这种文件格式是基于COFF( Common File Format )文件标准的变种格式。ELF文件的全部定义可以在/usr/include/elf.h头文件和官网文档内进行查看。

下面所说的地址(虚拟地址或物理地址)一般不可以让内存直接拿来使用,但是可以通过该地址进行辅助计算,进而获得内存空间中正确的地址。

a.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f593abe086161ce758678e314dd80a7e65f9bd7a, for GNU/Linux 3.2.0, not stripped

ELF文件中有头信息、段、节三个重要的概念需要进行了解。由于运行期和链接期中针对程序的划分方案有所差异,所以ELF文件针对两个不同的方案分化出了段和节两个概念,段为程序的运行期提供支持,节为程序的链接期提供支持。

在ELF文件中头信息的位置是固定在最顶部的,其他部分的位置并不是固定的,其中头信息可以检索到头表的起始位置。

在ELF文件中段或节由头(段头或节头)和身体(段或节)组成,头中定义了基本的属性。所有的头会组成一张头表,可以根据头表内不同头的属性索引到不同的身体部分。头表的首表项会记录整个头表的属性(如果存在),头表的属性也可以在头信息中获取。

常用工具

为了观察ELF文件,在Linux中常常使用readelf显示EFL文件的信息、objdump对ELF文件进行反汇编、hexdumpodvim使用不同的进制显示ELF文件中的内容。

头信息

头信息在ELF文件的开头,用于标明该文件是ELF文件、展示基本的信息、展示头表的基本信息。

头信息的存在是为了帮助计算机可不可以执行这个ELF文件(文件格式是否正确、架构是否匹配、ABI是否匹配等等)。

00000000  7f 45 4c 46 02 01 01 00 | 00 00 00 00 00 00 00 00  |.ELF............|
Magic
00000010  03 00 3e 00 01 00 00 00 | 40 10 00 00 00 00 00 00  |..>.....@.......|
文件类型 机器类型 版本 | 入口地址
00000020  40 00 00 00 00 00 00 00 | 60 36 00 00 00 00 00 00  |@.......`6......|
段索引地址 | 节索引地址 
00000030  00 00 00 00 40 00 38 00 | 0d 00 40 00 1d 00 1c 00  |....@.8...@.....|
标志 头信息大小 段大小 | 段数量 节大小 节数量 字符串表索引地址
​
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Position-Independent Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x1040
  Start of program headers:          64 (bytes into file)
  Start of section headers:          13920 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         13
  Size of section headers:           64 (bytes)
  Number of section headers:         29
  Section header string table index: 28

Magic

标明文件是ELF文件格式以及展示必要的信息。

位置1:7f,特定标志
位置2-4:45 4c 46 = E L F
位置5:ELF文件的执行类型
    00:无效的类型
    01:32位程序
    02:64位程序
位置6:数据编码格式
    00:无效的类型
    01:高位数据存放在内存的低地址中,低位数据存放在内存的高地址中
    02:低位数据存放在内存的低地址中,高位数据存放在内存的高地址中
位置7:版本
    0:无效的版本
    1:默认值
位置8:内核ABI(Application Binary Interface 应用程序接口)类型
位置9:ABI版本
位置10-16:保留位置

文件类型

标明不同类型的ELF文件。

0 无效的文件类型
1 可重定位文件      编译过程产生的中间文件,链接器可以将中间文件和其他文件或信息进行组合生成可执行文件
2 可执行文件        可以执行的文件
3 动态链接库文件    可执行文件运行时可以从动态链接库文件内获取需要执行的逻辑
4 转储文件          程序在某一时刻保存下来的信息

机器类型

标明ELF文件是运行在哪种体系结构的计算机中的。

入口地址

标明可执行程序的入口地址。

段头表

包含段头表的索引地址(如果没有段,那么对应的地址就是0)、段头的大小、段头的数量。

段头表内的段头在文件内连续存放的。

节头表

包含节头表的索引地址(如果没有节,那么对应的数值就是0)、节头的大小、节头的数量、字符串表在节头表中的位置。

节头表内的节头在文件内连续存放的。

标志位

标明特定处理器的信息。

段头

在ELF文件中,段和段头(段头也可以叫做程序头)并不是连续存放的,可以借助段头内的属性定位到ELF文件中对应段的位置。

因为段是运行期产生的概念,所有段头只对可执行文件或动态链接库这两个会被加载到内存中执行的文件有意义,其他类型的ELF文件可以忽略段头,因为它们不需要使用段,也就更不需要段头对段进行检索。

Elf file type is DYN (Position-Independent Executable file)
Entry point 0x1040
There are 13 program headers, starting at offset 64
Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000002d8 0x00000000000002d8  R      0x8
  INTERP         0x0000000000000318 0x0000000000000318 0x0000000000000318
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x00000000000005f0 0x00000000000005f0  R      0x1000
  LOAD           0x0000000000001000 0x0000000000001000 0x0000000000001000
                 0x0000000000000145 0x0000000000000145  R E    0x1000
  LOAD           0x0000000000002000 0x0000000000002000 0x0000000000002000
                 0x00000000000000c4 0x00000000000000c4  R      0x1000
  LOAD           0x0000000000002df0 0x0000000000003df0 0x0000000000003df0
                 0x0000000000000220 0x0000000000000228  RW     0x1000
  DYNAMIC        0x0000000000002e00 0x0000000000003e00 0x0000000000003e00
         
elf文件解析 前两天网上投递了简历,面试了一家C++公司,然后对面负责人给我发了一份笔试题,题目是: 请写出一个ELF文件解析器,需要能打印出所有segments和sections,并列出每个section和segment的映射关系。 首先了解elf是什么,它的结构是怎么样的,然后去读一下别人的源码,读懂之后,自己开始编码。 源码如下("elf.h" 头文件见后文),它会报warning,但是貌似不太影... 阅读详情

相关推荐

ELF文件解析

前言 最近选了Linux内核原理的选修课,虽然因为课时比较短涉及到的内容只能涵盖Linux知识的一小部分,但是老师的水平确实很高,讲的知识也很深入,这次布置的小作业是编写Linux平台下的C语言程序实现如下功能: 模仿实现Linux下readelf工具的部分功能,能够对ELF可执行文件进行简单分析。(至少支持readelf工具的-h、-S、-s三个命令选项功能) 关于原理部分自认为没有能力和大佬们讲得一样透彻清楚,所以参考文章链接贴在了文章的末尾,看了一定就会明白的。 1.ELF文件介绍 在 Linux 系

K1052176873的博客 4896

bin、hex、exe、elf文件类型到底有何区别?如何解读hex文件elf文件?...相关内容都在这里!

详细的解释常见的bin、hex、elf文件格式,分享bin和hex的互转工具,详细解读readelf的用法等等内容!!开发必备基础知识!!

车载系统攻城狮 6532

elf文件结构解析

elf文件解析1、ELF文件结构格式:2、ELF文件解析:3、ELF段表: 1、ELF文件结构格式: ELF Header .text .data .bss … section header table string tables symbol tables … elf文件头包含了整个文件的基本属性,如文件版本,入口地址等,接着就是ELF文件的各个...

qq_31121045的博客 1503

剖析ELF文件格式的内容———文件头,段表,符号....(第三章)

目录 1.extern "C" 1.编译阶段——取名 2.链接阶段——找对应的名 参考: 2.extern变量名 1.extern "C" 在阅读代码的时候,常常会看到下面的代码片段: #ifdef __cplusplus extern "C" { #endif // 写例如dll导出函数的定义 #ifdef __cplusplus } #endif 这是一...

u012138730的专栏 8371

ELF文件详解

一、ELF概述 1、ELF的定义 ELF(Executable and Linkable Format)文件是一种目标文件格式,常见的ELF格式文件包括:可执行文件、可重定位文件(.o)、共享目标文件(.so)、核心转储文件等。 ELF主要用于Linux平台,Windows下是PE/COFF格式。 2、ELF文件的结构 一个完整的ELF文件一般会包括如下几个内容:ELF头、Section头、Segment头和Section。 其中由Section头组成的集合称为Section头表,...

PeakJin的博客 2万+

ELF文件格式解析

ELF格式分析

夏天Alex 5423

C语言实现ELF文件解析

这学期Linux的大作业第一部分是解析64位/32位的ELF文件,这里偷了个懒只解析ELF头、程序头表和节头表; 这里先附上代码占个坑,有时间会来补详细解释; 输入格式为ELF文件名; 程序会同时将三个解析结果打印到控制台并写入同级目录下的result.txt文件中; #include <stdio.h> #include <stdlib.h> #include <elf.h> #include <string.h> #define putline pu

Yuhan的博客 6818

elf文件格式解析

linux 恶意软件研究相关工具 及下载地址:https://remnux.org/docs/distro/tools/ 系统: Sysdig(https://pkgs.org/download/sysdig)Unhide(取消隐藏) 反汇编: Vivisect, Udis86, objdump 调试工具: Evan’s Debugger (EDB), GNU Project Debugge...

PwnGuo的博客 6678

ELF文件组成以及解析

工欲善其事必先利其器。在来介绍ELF文件的之前,先了解一下解析ELF的工具。若安装有HighTec编译器,在黑窗口中输入“tricore-readelf”即可,如下图所示,该命令可用。

cai88453626的博客 468

(全网最细)ELF文件详解

ELF文件解析

wardenjohn的博客 9069

ELF 格式详解

可重定位的目标文件(Relocatable)也就是通常称的目标文件,后缀为.o可执行文件(Executable)共享库(Shared Object)共享文件:也就是通常称的库文件,后缀为.so注1: Linux中的readelf命令可以查看ELF文件的详细信息注2:ELF文件只能在操作系统环境下运行,裸机环境运行的是BIN文件;编译器默认输出的文件格式是ELF格式,可以使用objcopy命令转化为BIN文件:将name.elf转化为name.bin文件armbinary。

kunkliu的博客 7083

ELF文件介绍

https://blog.csdn.net/GrayOnDream/article/details/124564129

二进制模----细微行动改变影响世界 5792

深入解析ELF文件格式及结构

本文还有配套的精品资源,点击获取 简介:ELF格式是一种在类UNIX系统中广泛使用的可执行文件和链接格式,用于程序和共享库的表示。它为编译器、链接器、加载器和运行时系统提供统一接口。本文深入探讨了ELF文件的三个主要部分:头部、节区表和节区,以及符号表、重定位表和动态链接等关键特性。此外,还介绍了ELF版本控制和调试信息的重要性,帮助读者全面理解ELF文件的结构和工作原理。...

weixin_28771751的博客 2576
下一篇: 观察调用动态链接库中函数的过程
GreatBadass
博客等级 码龄3年 33粉丝 2原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值