windows PE文件与Linux ELF文件概述


本篇内容主要讲解“windows PE文件与Linux ELF文件概述”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows PE文件与Linux ELF文件概述”吧! 在windows中可执行文件是pe文件格式,Linux中可执行文件是ELF文件,其文件格式是ELF文件格式,在Linux下的ELF文件除了可执行文件(Excutable File),可重定位目标文件(RellocatableObject File)、共享目标文件(SharedObject File)、核心转储文件(CoreDump File)也都是ELF格式文件。
使用Linux下专用工具——readelf 来查看elf文件信息
查看readelf中的源码

一个典型的ELF文件大致的结构如下:在readelf的源码中变量类型Elf_Internal_Ehdr_,定义在internal头文件中
在Linux自带的头文件中查看,源码文件头的结构中一共有14个字段,对应到文件16进制中。

记录了每个Segment的相关信息,比如类型、对应文件的偏移、大小、属性等。 程序头表和段头表相对独立,它们是由ELF文件头统一管理,程序头表管理ELF文件加载后,ELF文件内可加载段到内存映像的映射关系,一般只有可执行文件中,包含程序头表。程序头表包含多个程序头表项,程序头表描述的对象称为“Segment”,Segment描述的是ELF文件加载后的数据块,段(Section)描述的是ELF文件加载前的数据块。一般来说,来说两者会存在一定的对应关系,比如代码段.text的加载信息保存在程序头表项对应存放代码的Segment中,数据段.data的加载信息保存在程序头表项对应存放数据的Segment中。有时候为了简化程序头表项的个数,会把同类型的多个段,设置整个ELF文件作为一个Segment。
程序头表的数据结构
p_flag权限属性标志
2.2.3 区段头表 用于记录ELF文件的主要的数据 查看区段
区段表头的数据结构:区段头表一共有10个字段,含义如下:
(1)sh_name段名,是一个是一个4字节的偏移,记录了段名字符串在段表字符串表(“.shstrtab”段)内的偏移。段表字符串并非表的形式,而是一个文件块,保存了所有的段表字符串内容,存储在“.shstrtab”的段中,根据“.shstrtab”的偏移,加上sh_name便可以访问到每个段对应的段名字符串。

起始地址是000017ac,第一个段表项全0,sh_name在段表项中的偏移是001b,由上图可以得到“.shstrtab”段的偏移是0016ae,所以,计算段名的偏移应该是0x0000001b+ 0x000016ae = 0x000016c9根据计算的结果,查看0x000016c9处:
(2)sh_type,表示段的类型。段的类型有很多,常见的有SHT_PROGBITS,表示程序数据,SHT_SYMTAB表示符号表,SHT_STRTAB表示字符串表,还有专门存放构造函数数组段SHT_INIT_ARRAY,析构函数数组段SHT_FINI_ARRAY。
a .txt 代码段 b .data 数据段 c .radata记录常量数据 d .symtab记录符号表(相当于PE文件的导出表)的数据 e .strtab 串表段 f .shstrtab 有段表 字符串表段 g .rel .plt记录某个区段的重定位内容(相当于PE文件的导入表)对应的宏如下: (3)sh_flags,表示段标志,记录段的属性。其中0表示默认属性,1表示段可写,取值位SHF_WRITE。2表示段加载后需要为之分配内存空间,取值为SHF_ALLOC。4表示可执行,取值为SHF_EXECINSTR,段标志属性可以叠加。 (4)sh_addr,表示段加载后的线性地址 (5)sh_offset,表示段在文件内的偏移,根据此偏移可确定段的位置,读取段的内容。 (6)sh_size,表示段的大小,单位为字节。需要注意的是,如果段类型为SHT_NOBITS,段内没有数据,那么段的大小并非指文件块的大小,而是指段加载后占用内存的大小。
(7~8)sh_link和sh_info表示段的链接信息,一般用于描述符号表段和重定位表段的链接信息。对于符号表段(SHT_SYMTAB),sh_link记录的是符号表使用的串表所在段(一般是,.strtab)对应段表项在段表内的索引。

sh_info记录的是符号表最后一个局部符号的符号表项在符号表内的索引加1,一般恰好是第一个全局符号的符号表项索引,这样可以帮助连接器更快的地定位到第一个全局符号。如下图:段中符号表段的信息sh_info,刚好是局部符号+1的索引。

对于重定位表表段(段类型是SHT_REL),sh_link记录重定位所作用的符号表段表项早段内的索引,而免费云主机域名sh_info记录重定位所作用的段对应的段表项在段表中的索引。
(9)sh_addralign,表示段的对齐方式,对齐规则为 sh_offset %sh_addralign = 0,即段的文件偏移必须是sh_addralign的整数倍,sh_addralign的取值必须是2的整数倍,入1、2、4、8等。

(10) sh_entsize,一般用于保存注入符号表段,重定位表段时,表示段内保存表的表项大小。例如符号表段“.symtab”内保存的符号表的表项大小为sizeof(Elf32_sym)= 16字节,重定位表段“.rel.plt”内保存的重定位表的表项大小为sizeof(Elf32_rel)= 8字节。 ELF文件的符号表保存了程序中的符号信息,包括程序中的文件名、函数名、全局变量名等,符号表一般保存在名为“.strtab”的段内,该段对应段表项的类型为SHT_SYMTAB。符号表包含多个符号表项,每个符号表项记录了符号的名称、位置、类型等信息。符号表象的数据结构:
重定位表常见于可重定位目标文件内,对于静态链接生成的可可执行文件,一般不包括重定位表,动态链接生成的可执行文件暂时不讨论。重定位表一般保存在以名为“.rel”开头的段内,该段对应段表项的类型为SHT_REL,ELF文件需要重定位的段,一般都对应一个重定位表,比如代码段“.txt”的重定位表保持在“.rel.text”内,数据段“.data”的重定位表保持在“.rel.data”内。 重定位表包含多个重定位表项,每个重定位表项记录一条重定位信息,包括重定位的符号、位置、类型等。
ELF文件内的段表和符号表需要记录段名和符号名,这些名称都是字符串。然而,段表项和符号表项都是固定长度的数据结构,无法存储不定长的字符串。因此FLE文件将名称字符串内容集中存放在一个段内,称为串表。这些段表项和符号表项只需记录段名字符串或符号名字符串在对应串表项的位置即可。 虽然存储的字符串表的内容称为串表,但是并非表的形式,而是一个文件区域。
到此,相信大家对“windows PE文件与Linux ELF文件概述”有了更深的了解,不妨来实际操作一番吧!这里是云编程开发博客网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: Part06 – (图文)NSX系列之为NSX环境配备vSphere主机与Cluster

上一个Part里,已经讲了如何查看NSX Control Cluster状态了,这个部分开始讲如何将NSX与vSphere主机环境结合起来。 要想将NSX环境与vSphere主机结合起来,就意味着需要在ESXi主机端去安装一些VIBs,通过安装这些VIBs,就…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 02/02 13:56
Next 02/02 13:57