ELF文件结构浅析-解析器和加载器实现

查看 36|回复 4
作者:OrientalGlass   
前言
近期冲浪刷到大佬博客ELF文件格式, 心血来潮
网上有不少ELF文件结构相关的文章,但大都介绍原理,具体的代码实现并不多(或许是因为有开源代码)
然而阅读开源代码不是我的强项(看的头大), 于是依据当年学习PE文件结构的思路,学习ELF文件格式
仿照 readelf 的输出结果编写解析器, 最后编写了简单的ELF加载器
代码支持x86和x64的ELF文件:

  • 解析器针对x86/x64有两套实现, 支持解析x86和x64平台的ELF文件

  • 加载器依赖编译环境,只能加载对应平台的ELF文件,要分别编译x86和x64的加载器

  • 内容讲解演示主要以x86为主

    环境&工具:
  • VMware pro 17.6.1
  • Kali Linux 2023.4 vmware amd64
  • gcc (Debian 14.2.0-8) 14.2.0
  • CLion 2024.2.3
  • 010 Editor 13.0.1
  • IDA Pro 7.7

    附件:

    CompiledTools.zip
    (21.78 KB, 下载次数: 3)
    2024-11-25 21:03 上传
    点击文件名下载附件
    编译好的工具下载积分: 吾爱币 -1 CB


    Sources.zip
    (12.45 KB, 下载次数: 1)
    2024-11-25 21:03 上传
    点击文件名下载附件
    源码下载积分: 吾爱币 -1 CB


    TestFiles.zip
    (1.15 MB, 下载次数: 1)
    2024-11-25 21:04 上传
    点击文件名下载附件
    测试文件下载积分: 吾爱币 -1 CB

    由于本人水平有限, 内容错误之处还望大佬多多包涵, 批评指正
    ELF文件结构概述
    ELF是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式, 全称是Executable and Linking Format,这个名字相当关键,包含了ELF所需要支持的两个功能——执行和链接
    ELF文件包含3大部分,ELF头,ELF节,ELF段:

  • 节头表指向节, 类似PE的节表, 描述各个节区的信息

  • 程序头表描述段信息,一个段可以包含多个节,指导ELF文件如何映射至文件

  • 在OBJ文件中,段是可选的,在可执行文件中,节是可选的,但NDK编译的ELF文件同时有段和节



    1-目标文件格式.png (34.62 KB, 下载次数: 0)
    下载附件
    2024-11-25 20:56 上传

    ELF文件封装了部分数据类型
    #include
    typedef uint16_t Elf32_Half;
    typedef uint16_t Elf64_Half;
    /* Types for signed and unsigned 32-bit quantities.  */
    typedef uint32_t Elf32_Word;
    typedef int32_t  Elf32_Sword;
    typedef uint32_t Elf64_Word;
    typedef int32_t  Elf64_Sword;
    /* Types for signed and unsigned 64-bit quantities.  */
    typedef uint64_t Elf32_Xword;
    typedef int64_t  Elf32_Sxword;
    typedef uint64_t Elf64_Xword;
    typedef int64_t  Elf64_Sxword;
    /* Type of addresses.  */
    typedef uint32_t Elf32_Addr;
    typedef uint64_t Elf64_Addr;
    /* Type of file offsets.  */
    typedef uint32_t Elf32_Off;
    typedef uint64_t Elf64_Off;
    /* Type for section indices, which are 16-bit quantities.  */
    typedef uint16_t Elf32_Section;
    typedef uint16_t Elf64_Section;
    /* Type for version symbol information.  */
    typedef Elf32_Half Elf32_Versym;
    typedef Elf64_Half Elf64_Versym;
    可以发现,32和64位定义的数据结构仅有Addr和Off有位宽差距,我们可以定义对应的通用类型
    [table]
    [tr]
    [td]ELF数据结构[/td]
    [td]原始类型[/td]
    [td]备注[/td]
    [/tr]
    [tr]
    [td]Elfn_Half

    文件, 下载次数

  • qqycra   

    一看就是精华贴啊
    q_qaaq_qaa   

    虽然看不懂,但是支持一下
    scorpionslau   

    好丰富详细,感谢分享!学习了
    xixicoco   

    elf的格式有够复杂的
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部