快速业务通道

UNIX/LINUX 平台可执行文件格式分析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-01
的头部,不同的操作系统可一对此头部做特定的定义.

  COFF 文件格式如下:

  File Header(文件头部)

  Optional Header(可选文件头部)

  Section 1 Header(节头部)

  ………

  Section n Header(节头部)

  Raw Data for Section 1(节数据)

  Raw Data for Section n(节数据)

  Relocation Info for Sect. 1(节重定位数据)

  Relocation Info for Sect. n(节重定位数据)

  Line Numbers for Sect. 1(节行号数据)

  Line Numbers for Sect. n(节行号数据)

  Symbol table(符号表)

  String table(字符串表)

  文件头部的数据结构:

  struct filehdr

  {

  unsigned short f_magic; /* 魔数 */

  unsigned short f_nscns; /* 节个数 */

  long f_timdat; /* 文件建立时间 */

  long f_symptr; /* 符号表相对文件的偏移量 */

  long f_nsyms; /* 符号表条目个数 */

  unsigned short f_opthdr; /* 可选头部长度 */

  unsigned short f_flags; /* 标志 */

  };


COFF 文件头部中魔数与其它两种格式的意义不太一样,它是表示针对的机器类型,例如 0x014c 相对于 I386 平台,而 0x268 相对于 Motorola 68000系列等.当 COFF 文件为可执行文件时,字段 f_flags 的值为 F_EXEC(0X00002),同时也表示此文件没有未解析的符号,换句话说,也就是重定位在连接时就已经完成.由此也可以看出,原始的 COFF 格式不支持动态连接.为了解决这个问题以及增加一些新的特性,一些操作系统对 COFF 格式进行了扩展.Microsoft 设计了名为 PE(Portable Executable)的文件格式,主要扩展是在 COFF 文件头部之上增加了一些专用头部,具体细节请参阅参考资料 18,某些 UNIX 系统也对 COFF 格式进行了扩展,如 XCOFF(extended common object file format)格式,支持动态连接,请参阅参考资料 5.

  紧接文件头部的是可选头部,COFF 文件格式规范中规定可选头部的长度可以为 0,但在 LINUX 系统下可选头部是存在的.下面是 LINUX 下可选头部的数据结构: 拥有帝国一切,皆有可能。欢迎访问phome.net

  typedef struct

  {

  char magic[2]; /* 魔数 */

  char vstamp[2]; /* 版本号 */

  char tsize[4]; /* 文本段长度 */

  char dsize[4]; /* 已初始化数据段长度 */

  char bsize[4]; /* 未初始化数据段长度 */

  char entry[4]; /* 程序进入点 */

  char text_start[4]; /* 文本段基地址 */

  char data_start[4]; /* 数据段基地址 */

  }

  COFF_AOUTHDR;

  字段 magic 为 0413 时表示 COFF 文件是可执行的,注意到可选头部中显式定义了程序进入点,标准的 COFF 文件没有明确的定义程序进入点的值,通常是从 .text 节开始执行,但这种设计并不好.

  前面我们提到,COFF 格式比 a.out 格式多了一个节段表,一个节头条目描述一个节数据的细节,因此 COFF 格式能包含更多的节,或者说可以根据实际需要,增加特定的节,具体表现在 COFF 格式本身的定义以及稍早提及的 COFF 格式扩展.我个人认为,节段表的出现可能是 COFF 格式相对 a.out 格式最大的进步.下面我们将简单描述 COFF 文件中节的数据结构,节的意义更多体现在程序的编译和连接上,本文不对其做更多的描述.此外,ELF 格式和 COFF格式对节的定义非常相似,在随后的 ELF 格式分析中,我们将省略相关讨论.

  struct COFF_scnhdr

  {

  char s_name[8]; /* 节名称 */

  char s_paddr[4]; /* 物理地址 */

  char s_vaddr[4]; /* 虚拟地址 */

  char s_size[4]; /* 节长度 */

  char s_scnptr[4]; /* 节数据相对文件的偏移量 */

  char s_relptr[4]; /* 节重定位信息偏移量 */

  c

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号