• ELF文件格式分析--结构篇


    ELF文件格式,全称为Excutable and Linking Format,是一个开放的可执行文件和链接文件格式,在LINUX上很流行,跨平台软件的设计也多以ELF格式作为标准,其结构扩展性兼容性都很强.

    ELF结构分析起来主要有两种模式,一是编译时模式,另一个是运行时模式,同一个文件在不同的时期用不同的眼光看,数据虽然没变化,但是着重点是不同的,在编译器,文件以数据节的形式分区,在运行时期,文件以程序段的形式分区

    基本结构如下


    可以看到,段,其实就是由节组成的,这篇文章中我们仅仅讨论节,也就是说,仅仅讨论链接视图,首先我们先得知道ELF的数据类型定义


    首先是ELF头,ELF头是ELF文件的标识,读取一个ELF文件总是从ELF头开始的,他总是在文件的开头,结构如下


    ELF头开头的结构体叫做魔数头,是一个16位的数组,(从第九位开始,就是填充字节,没有意义的数据)关于它的定义如下


    ELF头结构体虽然每一个数据的长度都不同,但是在文件的存储上,它是以每个数据四位的情况来存储的,只是说四位数据里面有效数据是那么长,这样可以避免文件读取的时候的结构体对齐的问题

    通过ELF头我们可以看到,ELF头指定了文件节区头表的文件偏移地址,以及节区头表的数目和大小,通过这个,我们可以读到节区头表,也就是说,节区头表不一定是紧挨在ELF头的后面,他们的关系如下


    节区表类似于一个数组,防止了e_shnum个节区头信息,每个节区头信息的长度是e_shensize,这e_shnum个节区在文件中的存放时连续的,节区头信息如下


    通过节区头数据的sh_offset,我们可以找到这个节区头对应的节区数据,节区数据也不是连续存放在文件中的

    节区数据根据节区头信息的sh_type信息有几种分类

    当sh_type为1,这是一个程序数据表,里面存放的是代码二进制数据,长度为节头指定长度

    当sh_type为2,这是一个符号表,相当于一个数组,里面存放的结构体,数组长度为sh_size/sh_entsize,每个结构体的定义如下


    当sh_type为3,这是一个字符串表,里面存放着一些字符,相当于一个字符数组,一个ELF文件里面有两个字符串表,一个叫做节区头符串表,一个叫做通用字符串表.我们在节区头里面可以看到有一个sh_name,这是一个数字,我们需要去节区字符串表中寻找对应的字符串,寻找方式是,从sh_name中获得的字符串开始索引,直到遇到’’字符停止,得到的数据就是该节区字符串表的名称,节区字符串表存放在sh_strndx指向的节区里面,其他的所有名称都存放在另一个字符串表中,


    当sh_type为9,这是一个重定位表,依然相当于一个数组,里面存放了重定位结构体数组,数组长度为sh_size/sh_entsize,每个结构体的定义如下


    重要的数据基本就是这些

  • 相关阅读:
    vue 安装scss
    element-ui 弹出添加拖拽功能
    百度网盘SVIP不限速Mac破解版(亲测可用)
    cookie,localStorage和sessionStorage
    ES6中class的实现原理
    闭包的使用场景
    HTTPS原理以及流程
    DOMContentLoaded和load的区别
    js中的函数防抖与节流
    对vuex的理解
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4279407.html
Copyright © 2020-2023  润新知