UNIX与Linux操作系统下可执行文件格式解析(5)

ELF文件格式分析

  ELF 文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o。共享文件:也就是通常称的库文件,后缀为.so。可执行文件:本文主要讨论的文件格式,总的来说,可执行文件的格式与上述两种文件的格式之间的区别主要在于观察的角度不同:一种称为连接视图(Linking View),一种称为执行视图(Execution View)。

  首先看看ELF文件的总体布局: ELF header(ELF头部)

Program header table(程序头表)

Segment1(段1)

Segment2(段2)

………

Sengmentn(段n)

Setion header table(节头表,可选)
 

  段由若干个节(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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5032c4fbbc504830c454126d2d49f288.html