zoukankan      html  css  js  c++  java
  • 实践——ELF文件格式分析

    一、分析文件头

    1. 段入口类型定义(/usr/include/elf.h)下面产生的hello是32位的

    使用命令#Hexdump –x ELF_1.o

    第一行:
    前4字节,蓝色部分,是一个魔数,表示这是一个ELF对象
    下一个字节(右边这个)01说明是个32位对象(64位的是02);
    下一个字节是01,说明使用的是小端方式(PC大多使用)
    下来一个字节01表示文件头版本,剩下默认设置为0
    第二行:e_type(两个字节)值为0x0001,表示是一个重定位文件。
    e_machine(两个字节)值为0x003e,表示是X86-64的处理器体系结构。
    e_version(四个字节)值为0x00000001,表示是当前版本。
    e_entry(八个字节)值为0x0000000000000000,表示没有入口点。
    第三行:e_phoff(八个字节)值为0x0000000000000000,表示没有程序头表。
    e_shoff(八个字节)值为0x0000000000000128,表示段表的偏移地址。
    第四行: e_flags(四个字节)值为0x00000000,表示未知处理器特定标志(#defineEF_SH_UNKNOWN 0x0);e_ehsize(两个字节)值为0x0040,表示elf文件头大小;
    e_phentsize(两个字节)值均为0x0000,因为重定位文件没有程序头表。
    e_phnum(两个字节)的值为0x0000,因为重定位文件没有程序头表。
    e_ehentsize(两个字节)值为0x0040表示段头大小为64个字节(由这里知道section header table里面每个header的大小)。
    e_shnum(两个字节)值为0x000d,表示段表入口有13个(由这里知道段表有13个段)。
    e_shstrndx(两个字节)值为0x000a,表示段名串表的在段表中的索引号(由这里知道.shstrtab段(符号表)的信息在段表的索引号是10)。

    使用命令#readelf -h ELF_1.o


    e_type表示文件类型,2表示可执行文件。

    e_machine:指明可以在哪种机器结构中运行。

    e_version:指明版本信息

    e_entry:指明系统运行该程序时将控制权转交到的虚拟地址的值,如果没有则为零。

    e_phoff: program header table在文件中的字节(Byte)偏移offset,如果没有program header table, 则该值为零。

    e_shoff: section header table在文件中的字节偏移,如果没有section header table, 则该值为零

    e_flags: 有关处理器的信息

    e_ehsize: elf header的大小,单位:字节

    e_phentsize: 在program header table中一个entry的大小,前面提到过,program header table & section header table都是数组,所以它们的每一个元素,即每一个entry的大小,都是一样的。

    e_phnum: program header table中元素的个数,即entry的个数。

    e_shentsize: section header table每一个entry的大小,与e_phentsize类似。

    e_shnum: section header table中元素的个数,即entry的个数。可以看出来,这个program header table或者section header table的大小可以用entry的个数乘以每一个entry的大小得到。

    e_shstrndx: 指明string name table在section header table中的index。

    二、通过文件头找到section header table,理解内容

    文件头信息:

    段表section header table:

    符号表symbol table:

    由之前文件头的分析可知:e_shoff(4字节)值为0x00003403,表示段表的偏移地址

    e_ ehentsize(2字节) 0x0028,表示段头大小为40字节(由此可知section header table 里面表个header的大小)

    e_ shnum(2字节) 0x000d,表示段表入口地址有13个(由此知道段表有13个段)

    段表大小 28H*d=520字节

    0x00003403+0xH=0X00001CAC

    所以从0x00003403—0X00001CAC,存储的是段表

  • 相关阅读:
    中途接手一个项目时候,需要注意
    PPT做交互效果
    hyperledger学习资料
    k8s拾遗
    Day0-3. 部署docker镜像私有仓库harbor
    Day0-2. Docker安装部署
    Day0-1. Docker环境准备
    【转载】轻量级HTTP服务器Nginx(Nginx性能优化技巧)
    使用nginx-module-vts监控各虚拟主机的流量
    Linux系统下终端proxy代理配置
  • 原文地址:https://www.cnblogs.com/yswysw/p/5534268.html
Copyright © 2011-2022 走看看