一、ELF文件头(定义在/usr/include/elf.h)中

二、实践部分

第一行

对应e_ident[EI_NIDENT]:实际表示内容为7f45 4c46 0101 0100 0000 0000 0000 0000。
前4字节,是一个魔数,表示这是一个ELF对象

下一个字节01说明是个32位对象(64位的是02);

再下一个字节是01,说明使用的是小端方式

再下来一个字节01表示文件头版本,剩下默认设置为0

第二行:

  • e_type(占2字节)0x0002,表示是可执行文件
  • e_machine(2字节)0003,说明是intel 80386
  • e_version(4字节)0x00000001,说明是当前版本
  • e_entry(4字节)0x8048310,表面入口点为8048310

  • e_phoff(4字节)值为0x00000034 ,表示程序头表
  • e_shoff(4字节)值为0x000017d4,表示段表的偏移地址
  • e_flags(4字节)0x00000000,表示未知处理器特点标志(#define EF_SH_UNKNOWN 0x0)
  • e_ehsize(2字节)0x0034,表示ELF文件头大小为0x34H,(64位的是0x40H)

  • e_phentsize(2字节)0x0020,program header的大小是32比特。

  • e_phnum(2字节) 0x0009,program headers的数量是9个

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

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

  • e_shstrndx (2字节) 0x001c,表示段名串表的在段表中的索引号(由此知.shstrtab段(符号表)的信息在段表的索引号是28)

    使用readelf -h hello查看ELF文件头。

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。

通过readelf -a hello时查看段表头的情况,找到section headers

然后分析其中各项的含义

sh_name指出section的名字,它的值是后面将会讲到的section header string table中的索引,指出一个以null结尾的字符串。
sh_type是类别
sh_flags指示该section在进程执行时的特性。
sh_addr指出若此section在进程的内存映像中出现,则给出开始的虚地址。
sh_offset给出此section在文件中的偏移。

找到段表

由第三行的elf头可知,e_shoff值为0x000017d4,表示段表的偏移地址
从这里开始找
同理,e_ ehentsize(2字节) 0x0028,表示段表长度为40字节(由此可知section header table 里面表个header的大小)
e_ shnum(2字节) 0x001f,表示段表入口地址有31个(由此知道段表有31个段)

第一个段

第二个段

下面是一个段表结构
typedef struct
{
Elf32_Word sh_name; /* Section name (string tbl index) /
Elf32_Word sh_type; /
Section type /
Elf32_Word sh_flags; /
Section flags /
Elf32_Addr sh_addr; /
Section virtual addr at execution /
Elf32_Off sh_offset; /
Section file offset /
Elf32_Word sh_size; /
Section size in bytes /
Elf32_Word sh_link; /
Link to another section /
Elf32_Word sh_info; /
Additional section information /
Elf32_Word sh_addralign; /
Section alignment /
Elf32_Word sh_entsize; /
Entry size if section holds table */
} Elf32_Shdr;

第三个段表

第四个段表

总共有31个段表

理解常见的。text .strtab .symtabl .rodata等section

文件的section含有程序和控制信息,系统使用一些特定的section,并有其固定的类型和属性(由sh_type和sh_info指出)。
下面介绍几个常用到的section:“.bss”段含有占据程序内存映像的未初始化数据,当程序开始运行时系统对这段数据初始为零,但这个section并不占文件空间。
“.data.”和“.data1”段包含占据内存映像的初始化数据。
“.rodata”和“.rodata1”段含程序映像中的只读数据。
“.shstrtab”段含有每个section的名字,由section入口结构中的sh_name索引。
“.strtab”段含有表示符号表(symbol table)名字的字符串。
“.symtab”段含有文件的符号表,在后文专门介绍。
“.text”段包含程序的可执行指令。

LINUX实践--ELF分析的更多相关文章

  1. linux实践——ELF分析

    一.ELF的部分结构定义 elf header(定义在/usr/include/elf.h)//64位的系统ELF文件头包括以下两个部分 #define EI_NIDENT (16) typedef ...

  2. linux实践之ELF文件分析

    linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...

  3. linux实践之程序破解

    linux实践之程序破解 这次的实践是文件破解,让我们从login可执行文件开始吧! 首先我们执行一下这个可执行程序 ①我们希望在不知道密码的情况下,能够登陆进去.且无论密码是什么,都是提示“on y ...

  4. 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖

    <Unix/Linux网络日志分析与流量监控>获2015年度最受读者喜爱的IT图书奖.刊登在<中华读书报>( 2015年01月28日 19 版) 我的2015年新作刊登在< ...

  5. Linux 可执行文件 ELF结构 及程序载入执行

    Linux下ELF文件类型分为以下几种: 1.可重定位文件,比如SimpleSection.o: 2.可运行文件,比如/bin/bash. 3.共享目标文件,比如/lib/libc.so. 在Linu ...

  6. 01-Coredump核心转存&&Linux程序地址分析【转】

    转自:http://www.itwendao.com/article/detail/404132.html 目录(?)[-] 一Core Dump核心转存 二Linux程序地址分析 一Core Dum ...

  7. Linux内核源代码分析方法

    Linux内核源代码分析方法   一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...

  8. linux用户进程分析

           经过实验3的介绍.我们须要来点实在的.所以将我们理解的流程用于linux系统的分析.换句话说.通过类比的方式去进行描写叙述与理解linux相关的部分. 本节的内容非常详实.并且也分析 ...

  9. [Linux实践] macOS平台Homebrew更新brew update卡死,完美解决

    [Linux实践] macOS 平台 Homebrew 更新 brew update 卡死,完美解决 版本2020.01.05 摘要: 使用brew install [软件包]安装软件包时,卡在Upd ...

随机推荐

  1. java基础---->多线程之priority(四)

    线程的priority能告诉调度程序其重要性如何,今天我们通过实例来学习一下java多线程中的关于优先级的知识.我从没被谁知道,所以也没被谁忘记.在别人的回忆中生活,并不是我的目的. java多线程的 ...

  2. Go基础---->go的基础学习(一)

    这里面记录一些学习go的基础知识.我希望爱我的人不寂寞,我希望我爱的人喜欢我 go的基础知识 一.go中的map的使用 package main import ( "fmt" ) ...

  3. Java中UDP协议的基本原理和简单用法

    UDP协议是非面向连接的,相对于TCP协议效率较高,但是不安全.UDP协议类似发信息的过程,不管接收方是在线还是关机状态,都会把信息发送出去.但是如果接收方不处于接收信息的状态,发送出去的数据包就会丢 ...

  4. Sql Server 关于列名带中括号"[]"的问题

    1.如果列名为数据库的关键字则自动加上中括号“[]” 例如[level] 2.如果列名中带有特殊符号.[date(a)] 数据存储的过程: 1.在添加数据的时候:要带有中括号,有必要在添加参数的时候不 ...

  5. ORA-01153: an incompatible media recovery is active

    ORA-01153: an incompatible media recovery is active Cause: Attempted to start an incompatible media ...

  6. spring cloud多个消费端重复定义feign client问题

    spring cloud消费端调用服务提供者,有两种方式rest+ribbon和Feign,Feign是一个声明式的伪Http客户端更为简单易用,所以我们项目选用Feign作为服务通讯方式 项目有6个 ...

  7. SpringCloud--Ribbon负载均衡

    Ribbon实现客户端负载均衡 负载均衡:是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一. 硬件负载均衡:主要通过在服务器节点之间安装专门用于负载均衡的设备: 软件负载均衡:通过在服务器 ...

  8. talib 中文文档(十一):Cycle Indicator Functions 周期指标

    Cycle Indicator Functions 不是很懂,欢迎指教 HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period 函数名:HT_D ...

  9. rpc、socket、mq

    关于RPC与MQ异同的理解 相同:1.都利于大型系统的解耦:2.都提供子系统之间的交互,特别是异构子系统(如java\node等不同开发语言):不同:1.RPC侧重功能调用,因此多半是同步的:备注:也 ...

  10. 通过 微软 pai-fs 上传数据到HDFS (Microsoft OpenPAI)

    准备环境 (个人使用记录,方便下次使用查阅~~) 首先保证PAI是登陆状态: 进入GitHub项目所在地址: https://github.com/Microsoft/pai/ 然后切换分支到  具体 ...