加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux/Unix平台可执行文件格式分析

发布时间:2016-01-26 08:35:52 所属栏目:Linux 来源:网络整理
导读:简介:本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out( assembler and link editor output 汇编器和链接编辑器的输出)、COFF (Common Object

段由若干个节(Section)构成,节头表对每一个节的信息有相关描述。对可执 行程序而言,节头表是可选的。参考资料 1中作者谈到把节头表的所有数据全部 设置为0,程序也能正确运行!ELF头部是一个关于本文件的路线图(road map) ,从总体上描述文件的结构。下面是ELF头部的数据结构:

typedef struct
{
   unsigned char e_ident[EI_NIDENT];   /* 魔数和相关信息 */
   Elf32_Half  e_type;         /* 目标文件类型 */
   Elf32_Half  e_machine;       /* 硬件体系 */
   Elf32_Word  e_version;       /* 目标文件版本 */
   Elf32_Addr  e_entry;        /* 程序进入点 */
   Elf32_Off   e_phoff;        /* 程序头部偏移量 */
   Elf32_Off   e_shoff;        /* 节头部偏移量 */
   Elf32_Word  e_flags;        /* 处理器特定标志 */
   Elf32_Half  e_ehsize;        /* ELF头部长度 */
   Elf32_Half  e_phentsize;      /* 程序头部中一个条目的长 度 */
   Elf32_Half  e_phnum;        /* 程序头部条目个数  */
   Elf32_Half  e_shentsize;      /* 节头部中一个条目的长度 */
   Elf32_Half  e_shnum;        /* 节头部条目个数 */
   Elf32_Half  e_shstrndx;       /* 节头部字符表索引 */
}
Elf32_Ehdr;

下面我们对ELF头表中一些重要的字段作出相关说明,完整的ELF定义请参阅 参考资料 6和参考资料7。

e_ident[0]-e_ident[3]包含了ELF文件的魔数,依次是0x7f、'E'、'L'、'F' 。注意,任何一个ELF文件必须包含此魔数。参考资料 3中讨论了利用程序、工 具、/Proc文件系统等多种查看ELF魔数的方法。e_ident[4]表示硬件系统的位数 ,1代表32位,2代表64位。 e_ident[5]表示数据编码方式,1代表小印第安排序 (最大有意义的字节占有最低的地址),2代表大印第安排序(最大有意义的字 节占有最高的地址)。e_ident[6]指定ELF头部的版本,当前必须为1。e_ident [7]到e_ident[14]是填充符,通常是0。ELF格式规范中定义这几个字节是被忽略 的,但实际上是这几个字节完全可以可被利用。如病毒Lin/Glaurung.676/666( 参考资料 1)设置e_ident[7]为0x21,表示本文件已被感染;或者存放可执行代 码(参考资料 2)。ELF头部中大多数字段都是对子头部数据的描述,其意义相 对比较简单。值得注意的是某些病毒可能修改字段e_entry(程序进入点)的值 ,以指向病毒代码,例如上面提到的病毒Lin/Glaurung.676/666。

一个实际可执行文件的文件头部形式如下:(利用命令readelf)

ELF Header:
  Magic:  7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:               ELF32
  Data:               2's complement, little endian
  Version:              1 (current)
  OS/ABI:              UNIX - System V
  ABI Version:            0
  Type:               EXEC (Executable file)
  Machine:              Intel 80386
  Version:              0x1
  Entry point address:        0x80483cc
  Start of program headers:     52 (bytes into file)
  Start of section headers:     14936 (bytes into file)
  Flags:               0x0
  Size of this header:        52 (bytes)
  Size of program headers:      32 (bytes)
  Number of program headers:     6
  Size of section headers:      40 (bytes)
  Number of section headers:     34
  Section header string table index: 31

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读